Files
agw a40243ed23
CI / test (push) Successful in 39s
Fest: 18+-pakke med pop-sladder, tår og egen speaker
Ny spørgsmålspakke "fest" (aldrig med i "Alle"): 43 faktatjekkede
spørgsmål om dansk pop i to kategorier, Fest: retro og Fest: nu.

Et fest-spil tæller tår ved siden af point: narret giver en tår,
ingen fandt sandheden giver alle en tår, gange rundens faktor
(finalen er en shot). Afsløringen, opsummeringen, stillingen og
telefonen viser tårene, og der er en pris til aftenens tørstigste.
Speakeren bruger zoomer-replikker (<begivenhed>_fest), egne regler
og FEST_VOICE_ID til alt.

Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
2026-10-18 10:20:40 +02:00

56 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Speakerens replikker (fupogfakta/narrator/lines.json) skal overholde manuskriptreglerne."""
import json
import re
from pathlib import Path
from django.test import SimpleTestCase
LINES = Path(__file__).resolve().parents[1] / "narrator" / "lines.json"
# begivenhed -> tilladte pladsholdere (samme tabel som i prompten til manuskriptet)
EVENTS = {
"lie_progress": {"navn"}, "lie_progress_fast": {"navn"}, "lie_progress_retry": {"navn"},
"lobby_welcome": set(), "lobby_join": {"navn"}, "lobby_waiting": {"vip"},
"game_start": {"antal_spillere"}, "round1_intro": set(), "round2_intro": {"foerende"},
"final_intro": {"foerende", "sidst"}, "category_choose": {"navn"}, "category_timeout": {"navn", "kategori"},
"lie_start": {"kategori"}, "lie_hurry": set(), "lie_all_done": set(), "lie_was_truth": set(),
"guess_start": set(), "guess_hurry": set(),
"reveal_lie_fooled": {"svar", "forfatter", "ofre"}, "reveal_lie_fooled_many": {"svar", "forfatter", "antal"},
"reveal_lie_shared": {"svar", "forfattere"}, "reveal_house_lie": {"svar", "ofre"},
"reveal_truth_found": {"sandhed", "navne"}, "reveal_truth_nobody": {"sandhed"},
"reveal_truth_everyone": {"sandhed"}, "scores_intro": {"foerende", "sidst"},
"winner": {"vinder", "point"}, "award_biggest_liar": {"navn", "antal"},
"award_truth_seeker": {"navn", "antal"}, "award_most_liked": {"navn", "antal"}, "play_again": set(),
"present_intro": set(), "present_answer": {"svar"}, "summary_cleanup": set(), "summary_points": set(),
"summary_favorite": {"svar"}, "award_thirstiest": {"navn", "antal"},
}
# Fest-udgaven: "<begivenhed>_fest" har samme pladsholdere som begivenheden, men behøver færre varianter.
EVENTS.update({f"{e}_fest": ph for e, ph in list(EVENTS.items())})
MIN_VARIANTS = {e: 2 for e in EVENTS if e.endswith("_fest") or e == "award_thirstiest"}
from party.narrator import AUDIO_TAGS as TAGS # samme liste som hjernen og filtret bruger
class NarratorLinesTests(SimpleTestCase):
def setUp(self):
self.lines = json.loads(LINES.read_text(encoding="utf-8"))
def test_all_events_present_with_variants(self):
base = {e for e in EVENTS if not e.endswith("_fest")}
self.assertEqual(set(self.lines) & base, base)
self.assertLessEqual(set(self.lines), set(EVENTS))
for event, variants in self.lines.items():
self.assertGreaterEqual(len(variants), MIN_VARIANTS.get(event, 5), event)
self.assertEqual(len(variants), len(set(variants)), f"dubletter i {event}")
def test_placeholders_tags_and_style(self):
for event, variants in self.lines.items():
for line in variants:
with self.subTest(event=event, line=line):
self.assertLessEqual(set(re.findall(r"\{(\w+)\}", line)), EVENTS[event])
self.assertLessEqual(set(re.findall(r"\[([a-z ]+)\]", line)), TAGS)
spoken = re.sub(r"\[[a-z ]+\]", "", line)
self.assertLessEqual(len(spoken.split()), 20)
self.assertNotRegex(line, r"—|–| - ", "ingen tankestreger")
self.assertNotRegex(line, r"\d", "tal skrives med bogstaver")