95 lines
4.5 KiB
Python
95 lines
4.5 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")
|
|
|
|
source = [
|
|
"Gegen 8:30 Uhr war Sushi immer noch nicht auf dem Balkon. "
|
|
"Ich fand sie unter der Dusche. Später saß sie auf dem Bett und telefonierte. "
|
|
"Auf die Frage, ob sie mit mir frühstücken wolle, antwortete sie, dass sie erst Brot holen müsse."
|
|
]
|
|
stuffed = (
|
|
"Gegen 8:30 Uhr war Sushi immer noch nicht bei mir auf dem Balkon. "
|
|
"Ich machte mich auf die Suche und fand Sushi schließlich unter der Dusche im Badezimmer. "
|
|
"Als Sushi dann immer noch nicht auftauchte, sah ich nochmals nach und musste feststellen, "
|
|
"dass Sushi auf dem Bett saß und telefonierte. Als ich gerade mit den Vorbereitungen fertig war, "
|
|
"kam Sushi aus dem Schlafzimmer. Auf meine Frage, ob Sushi mit mir frühstücken wolle, "
|
|
"antwortete sie, dass Sushi erst Brot vom Laden holen müsse."
|
|
)
|
|
from journal_shape import infer_person_gender, naturalize_person_mentions
|
|
|
|
expect(infer_person_gender("Sushi", source) == "f", "source pronouns set feminine")
|
|
cleaned = naturalize_person_mentions(stuffed, ["Sushi"], source)
|
|
expect(cleaned.count("Sushi") == 2, "name kept twice then pronouns")
|
|
expect("fand Sushi" in cleaned, "second mention may stay a name")
|
|
expect("dass sie erst Brot" in cleaned, "reported speech keeps sie not the name")
|
|
expect("ob sie mit mir" in cleaned, "ob-clause is sie")
|
|
expect("Als sie dann" in cleaned, "later subject becomes pronoun")
|
|
expect("esse gerne Sushi" in naturalize_person_mentions(
|
|
"Ich esse gerne Sushi mit meiner Frau Sushi. Danach aß ich Sushi.",
|
|
["Sushi"],
|
|
source,
|
|
), "food homonym is not turned into a pronoun")
|
|
print("journal shape ok")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|