"""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()