mdview2: целевые тестовые файлы путей обрыва (testfiles/) на диск

testfiles/gen_testfiles.py генерирует:
  BIG.MD    — ~170 КБ прозы (CP866), успешный рендер большого файла
  TABLES.MD — неровные таблицы, пробивает кап контент-кэша (Content cache exhausted)
  LINES.MD  — ~22000 коротких строк, пробивает лимит 18432 (Line limit reached)
floppy кладёт на диск TABLES.MD + LINES.MD (ASCII, напрямую из testfiles/)
вместо BIG.MD. ВРЕМЕННО для проверки лимита 256 КБ.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-30 21:55:17 +03:00
parent 40ab5b9b48
commit 386837fc25
5 changed files with 35852 additions and 11 deletions
+10 -11
View File
@@ -36,21 +36,20 @@ $(DISK_TMP):
$(README_DISK): README.MD | $(DISK_TMP)
iconv -c -f UTF-8 -t CP866 README.MD > $@ || true
# Большой тестовый файл (>128 КБ) для проверки лимита 256 КБ: склейка
# README.MD + READMEBG.MD ×2 (~216 КБ) → CP866, кладётся на диск как BIG.MD.
# Переопределить состав можно через `make floppy BIG_SRCS="a.md b.md"`.
BIG_DISK := $(DISK_TMP)/BIG.MD
BIG_SRCS ?= README.MD READMEBG.MD README.MD READMEBG.MD
$(BIG_DISK): $(sort $(BIG_SRCS)) | $(DISK_TMP)
cat $(BIG_SRCS) | iconv -c -f UTF-8 -t CP866 > $@ || true
# ВРЕМЕННО (проверка лимита 256 КБ): на диск кладём целевые тестовые файлы
# путей обрыва из testfiles/ (генерятся testfiles/gen_testfiles.py, ASCII —
# iconv не нужен, make_disk берёт имя по basename):
# TABLES.MD — пробивает кап контент-кэша (сообщение Content cache exhausted)
# LINES.MD — пробивает лимит строк 18432 (сообщение Line limit reached)
# Убрать вместе с возвратом к обычному README-диску.
TESTDIR := testfiles
# UTF8TEST.MD кладётся на диск КАК ЕСТЬ (в UTF-8, без перекодировки) —
# это тестовый вход для проверки UTF-8 рендеринга (Фаза 2 кодировок).
floppy: $(EXAMPLE).exe $(README_DISK) $(BIG_DISK)
python3 $(MAKE_DISK) $(FLOPPY_IMG) $(EXAMPLE).exe $(README_DISK) $(BIG_DISK) UTF8TEST.MD
floppy: $(EXAMPLE).exe $(README_DISK) $(TESTDIR)/TABLES.MD $(TESTDIR)/LINES.MD
python3 $(MAKE_DISK) $(FLOPPY_IMG) $(EXAMPLE).exe $(README_DISK) $(TESTDIR)/TABLES.MD $(TESTDIR)/LINES.MD UTF8TEST.MD
@echo
@echo "Floppy ready: $(FLOPPY_IMG) (mdview2.exe + README.MD + BIG.MD + UTF8TEST.MD)"
@echo "Floppy ready: $(FLOPPY_IMG) (mdview2.exe + README.MD + TABLES.MD + LINES.MD + UTF8TEST.MD)"
@echo "Run: cd $(MAME_DIR) && ./run_mame.sh"
clean:
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,60 @@
#!/usr/bin/env python3
"""Генератор тестовых файлов mdview2 для проверки лимита 256 КБ и путей обрыва.
Результат кладётся рядом со скриптом (examples/mdview2/testfiles/):
BIG.MD ~216 КБ обычной прозы (CP866): успешный рендер большого файла.
TABLES.MD таблично-тяжёлый (ASCII): пробивает кап контент-кэша (40 стр./набор),
т.к. неровные таблицы (короткие ячейки + один широкий столбец)
раздувают число (символ,атрибут)-ячеек кратно относительно источника.
LINES.MD ~22000 коротких строк (ASCII): пробивает лимит строк (18432).
Запуск: python3 gen_testfiles.py
"""
import os
HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(HERE)
def write(name, data):
path = os.path.join(HERE, name)
mode = 'wb' if isinstance(data, (bytes, bytearray)) else 'w'
with open(path, mode) as f:
f.write(data)
print(f"{name}: {os.path.getsize(path)} bytes")
# --- BIG.MD: склейка README + READMEBG ×2, перекодировано в CP866 -----------
big = bytearray()
for _ in range(2):
for fn in ('README.MD', 'READMEBG.MD'):
with open(os.path.join(ROOT, fn), encoding='utf-8') as f:
big += f.read().encode('cp866', errors='replace')
write('BIG.MD', bytes(big))
# --- TABLES.MD: неровные таблицы -> исчерпание контент-кэша ------------------
# Один широкий столбец (72 симв.) на таблицу задаёт ширину; остальные ячейки
# короткие, но при рендере добиваются до этой ширины -> ~80 ячеек/строка из
# ~8 байт источника. ~300 таблиц × 30 строк дают ~840K ячеек (1.68 МБ контента)
# при ~108 КБ источника -> кап 640 КБ/набор пробивается, строк (~11K) < 18432,
# значит первой срабатывает причина TRUNC_CONTENT.
NT, ROWS = 300, 30
wide = 'x' * 72
out = ['# Tables test - content cache exhaustion trigger', '']
for t in range(NT):
out.append(f'## Table {t + 1}')
out.append('| Column A | B |')
out.append('|---|---|')
out.append(f'| {wide} | y |')
for r in range(ROWS):
out.append(f'| a{r} | b |')
out.append('')
write('TABLES.MD', '\n'.join(out) + '\n')
# --- LINES.MD: масса коротких строк -> исчерпание лимита строк ---------------
# 22000 коротких непустых строк = 22000 экранных сегментов > 18432; контент
# мал (~9 ячеек/строка), поэтому первой срабатывает причина TRUNC_LINES.
N = 22000
out = ['# Short lines test - line limit trigger', '']
out += [f'row {i:05d}' for i in range(1, N + 1)]
write('LINES.MD', '\n'.join(out) + '\n')