"""Юнит-тесты для incremental_svg.py — incremental SVG parser.
Покрывают контракт `parse_to_valid(prefix)`:
- на ЛЮБОМ prefix'е возвращает валидный SVG, который парсится lxml без ошибок;
- закрывает открытые теги, атрибуты, кавычки;
- обрывает частичные теги (внутри path-d);
- вырезает reasoning / markdown fence / хвостовой мусор.
Запуск:
python -m pytest tests/test_incremental_svg.py -v
"""
from __future__ import annotations
import random
import re
import string
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
import pytest # noqa: E402
from lxml import etree # noqa: E402
from incremental_svg import parse_to_valid, stream_to_valid # noqa: E402
# ---------------------------------------------------------------------------
# Базовый полный валидный SVG, от которого будем брать префиксы
# ---------------------------------------------------------------------------
VALID_SVG = (
'"
)
# SVG со вложенными открытыми тегами (для теста вложенности)
NESTED_SVG = (
'"
)
# Простая утилита — фиксирует, что результат парсится
def _assert_valid_svg(svg_text: str) -> etree._Element:
"""Парсит svg_text, возвращает root. Падает в pytest, если XML невалидный."""
try:
root = etree.fromstring(svg_text.encode("utf-8"))
except etree.XMLSyntaxError as exc:
pytest.fail(f"parse_to_valid вернул невалидный XML: {exc}\n{svg_text!r}")
return root
def _has_xmlns_in_root(svg_text: str) -> bool:
"""Проверяет, что xmlns либо в