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