import os import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from src.model_formatter import format_prompt, _hash_weight, _merge_combinable_tags from src.prompt_parser import parse_prompt from src.tag_format import to_prompt_tag, to_booru_tag, to_internal_tag def test_tag_format_score_up(): assert to_internal_tag("score_9_up") == "score_9_up" assert to_booru_tag(to_prompt_tag("score_9_up")) == "score_9_up" def test_tag_format_booru_roundtrip(): assert to_booru_tag(to_prompt_tag("looking at viewer")) == "looking_at_viewer" assert to_prompt_tag(to_booru_tag("looking_at_viewer")).lower() == "looking at viewer" def test_parse_prompt_preserves_weights(): parsed = parse_prompt("1girl, (blue eyes:1.2), solo, , ((masterpiece))") assert parsed is not None assert parsed.weighted_tokens is not None assert any("blue eyes" in tok for tok in parsed.weighted_tokens) assert any("masterpiece" in tok for tok in parsed.weighted_tokens) assert any("lora" in tok for tok in parsed.weighted_tokens) def test_format_prompt_noobai(): parsed = parse_prompt("1girl, solo, blue eyes") out = format_prompt(parsed, model="noobai", rating="pg") assert "very aesthetic" in out assert "absurdres" in out assert out.startswith("rating:general") def test_merge_combinable_tags_order(): assert _merge_combinable_tags(["skirt", "long skirt", "white skirt", "pleated skirt"]) == ["long pleated white skirt"] assert _merge_combinable_tags(["hair", "long hair", "short hair"]) == ["hair", "long hair", "short hair"] assert _merge_combinable_tags(["eyes", "blue eyes", "beautiful detailed eyes"]) == ["beautiful detailed blue eyes"] def test_hash_weight_deterministic(): a = _hash_weight("blue eyes") b = _hash_weight("blue eyes") assert a == b def test_prompt_analyzer_clip_vs_t5(): from src.prompt_analyzer import _estimate_clip_tokens, _estimate_t5_tokens text = "1girl, solo, masterpiece, " + "blue eyes, " * 20 clip = _estimate_clip_tokens(text) t5 = _estimate_t5_tokens(text) assert clip > 0 and t5 > 0 assert t5 > 0 assert abs(t5 - clip) >= 0 def test_history_entry_extended_fields(): from src.session_history import HistoryEntry e = HistoryEntry("1girl", ["a"], model="noobai", neg_results=["n"], categories=["hair"], seed=42) assert e.neg_results == ["n"] assert e.categories == ["hair"] assert e.seed == 42 d = e.to_dict() assert d["neg_results"] == ["n"] assert d["seed"] == 42