Kansho/backend/tests/test_journal_shape.py
2026-08-25 13:57:23 +02:00

79 lines
3.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(body.count("\n\n") == 2, "paste becomes one paragraph per turn")
expect("Kirschen" in body and "Hafen" in body, "wording of a paste is kept")
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()