90 lines
3.8 KiB
Python
90 lines
3.8 KiB
Python
"""Local journal shaping. Run from backend/: python tests/test_journal_shape.py"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from journal_shape import is_verbatim_join, paragraphize, shape_journal
|
|
|
|
|
|
def expect(ok: bool, message: str) -> None:
|
|
if not ok:
|
|
raise SystemExit(f"FAIL: {message}")
|
|
print(f"OK {message}")
|
|
|
|
|
|
def main() -> None:
|
|
turns = [
|
|
"Heute war der Markt voll. Ich bin früh gegangen und habe Kirschen gekauft.",
|
|
"Später zwangen wir die Kinder aus dem Bett und packten Schwimmsachen ein.",
|
|
"Im Hafen liefen wir zuerst zur falschen Seite.",
|
|
]
|
|
joined = " ".join(turns)
|
|
expect(is_verbatim_join(joined, turns), "space-joined user turns are a paste")
|
|
expect(not is_verbatim_join("Am Markt kaufte ich Kirschen und ging dann weiter.", turns), "rewritten prose is kept")
|
|
|
|
title, body = shape_journal("Markttag", joined, turns)
|
|
expect(title == "Markttag", "title stays")
|
|
expect("Kirschen" in body and "Hafen" in body, "model wording is kept")
|
|
expect(body != "\n\n".join(turns), "accepted model text is not replaced by source turns")
|
|
|
|
source_typo = ["ich bin dan zum markt gegangen und da war es zimlich voll"]
|
|
rewritten = "Ich ging dann zum Markt, auf dem es ziemlich voll war."
|
|
_, kept_rewrite = shape_journal("Markttag", rewritten, source_typo)
|
|
expect("ziemlich" in kept_rewrite, "corrected spelling stays")
|
|
expect("zimlich" not in kept_rewrite, "source typo is not restored")
|
|
expect(kept_rewrite.startswith("Ich ging"), "corrected sentence structure stays")
|
|
expect("Markt" in kept_rewrite, "capitalization stays corrected")
|
|
|
|
_, punct = shape_journal("Tag", "Ich ging zum Markt.", ["ich ging zum markt"])
|
|
expect(punct == "Ich ging zum Markt.", "corrected punctuation and casing are not reset")
|
|
|
|
fallback_body = "\n\n".join(turns)
|
|
_, fallback = shape_journal("Ein Tag", fallback_body, turns, source="fallback")
|
|
expect("Kirschen" in fallback and "Hafen" in fallback, "fallback still contains every user source")
|
|
expect("Markt" in fallback, "fallback keeps first source")
|
|
|
|
blob = (
|
|
"Heute war der Markt voll. Ich bin früh gegangen. "
|
|
"Danach haben wir gepackt. Die Kinder kamen spät. "
|
|
"Im Hafen liefen wir falsch. Sushi rief zur anderen Seite. "
|
|
"Schließlich fanden wir das Boot. Mario begrüßte uns."
|
|
)
|
|
phased = paragraphize(blob)
|
|
expect("\n\n" in phased, "a long single block gets phase breaks")
|
|
expect("Markt" in phased and "Boot" in phased, "paragraphize does not drop words")
|
|
|
|
kept = "Am Morgen der Markt.\n\nSpäter das Boot, noch gehetzt."
|
|
expect(shape_journal("Tag", kept, turns)[1] == kept, "already shaped text is left alone")
|
|
|
|
repeated = (
|
|
"Die Kinder verstanden kein Wort. Später fragte ich, "
|
|
"ob die Kinder überhaupt Deutsch verstehen. Die Kinder lachten."
|
|
)
|
|
_, unchanged = shape_journal(
|
|
"Tag",
|
|
repeated,
|
|
["Die Kinder verstanden kein Wort."],
|
|
person_labels=["Die Kinder", "Kinder"],
|
|
)
|
|
expect(unchanged == repeated, "repeated generic person terms stay unchanged")
|
|
expect("Er" not in unchanged.split(), "generic group is not turned into a pronoun")
|
|
expect(unchanged.count("Kinder") == 3, "every generic mention remains")
|
|
|
|
named = (
|
|
"Maren kam zum Markt. Später rief Maren an. "
|
|
"Ob Maren noch käme, wusste ich nicht. Maren blieb weg."
|
|
)
|
|
_, named_out = shape_journal("Tag", named, named.split(". "), person_labels=["Maren"])
|
|
expect(named_out == named, "accepted person names are not replaced by pronouns")
|
|
expect("Er " not in named_out and "Sie " not in named_out, "no guessed pronoun rewrite")
|
|
|
|
print("journal shape ok")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|