CI / test (push) Successful in 39s
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
56 lines
3.1 KiB
Python
56 lines
3.1 KiB
Python
"""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")
|