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
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')