- Offline neural worker based on llama.cpp (fortune-engine.exe) with local Qwen3-4B model support - Native assembly Tarot 3-card spread divination and teacher grade divination mode - Text input dialog in MODE_FORTUNE communicating over anonymous pipes - Clean process lifecycle management, WM_CHAR dispatch and fallback handling - Test suites and packaging tools for offline release
69 lines
3.5 KiB
Python
69 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Test suite for Tarot Fortune Mind & Teacher Grade Divination.
|
||
Exercises the native assembly engine directly.
|
||
"""
|
||
from pathlib import Path
|
||
import subprocess
|
||
import re
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
|
||
|
||
def test_tarot_database():
|
||
data = (ROOT / "src_graphics/fortune_mind_data.inc").read_bytes().decode("cp1251")
|
||
code = (ROOT / "src_graphics/fortune_mind.inc").read_bytes().decode("cp1251")
|
||
dialog = (ROOT / "src_graphics/fortune_dialog.inc").read_bytes().decode("cp1251")
|
||
|
||
# 1. Check all 22 Major Arcana exist in data
|
||
cards = ["Шут", "Маг", "Верховная Жрица", "Императрица", "Император", "Иерофант",
|
||
"Влюблённые", "Колесница", "Сила", "Отшельник", "Колесо Фортуны", "Справедливость",
|
||
"Повешенный", "Смерть", "Умеренность", "Дьявол", "Башня", "Звезда",
|
||
"Луна", "Солнце", "Суд", "Мир"]
|
||
for c in cards:
|
||
assert c in data, f"Card '{c}' missing from database"
|
||
print(f"[OK] All 22 Major Arcana found in Tarot database.")
|
||
|
||
# 2. Check 3-card spread positions: Ситуация, Препятствие, Исход
|
||
assert "1. СИТУАЦИЯ" in data, "Position 1 (Ситуация) missing"
|
||
assert "2. ПРЕПЯТСТВИЕ" in data, "Position 2 (Препятствие) missing"
|
||
assert "3. ИСХОД" in data, "Position 3 (Исход) missing"
|
||
print("[OK] Fixed 3-card spread positions verified (Ситуация, Препятствие, Исход).")
|
||
|
||
# 3. Check student mode components
|
||
assert "1. КАРМА УЧЕБЫ" in data, "Student Position 1 missing"
|
||
assert "2. ТАЙНЫЙ ГРЕХ" in data, "Student Position 2 missing"
|
||
assert "3. СУД ВСЕЛЕННОЙ" in data, "Student Position 3 missing"
|
||
assert "КАБИНЕТ ПРЕПОДАВАТЕЛЯ: СУДЬБА СТУДЕНТА" in data, "Teacher mode title missing"
|
||
assert "ВЕРДИКТ СУДЬБЫ: СТАВИТЬ" in data, "Verdict string missing"
|
||
assert "9 или 10" in data, "Borderline 9-10 choice missing"
|
||
assert "8 или 9" in data, "Borderline 8-9 choice missing"
|
||
print("[OK] Teacher Grade Divination database & borderline choices verified.")
|
||
|
||
# 4. Check procedure implementations
|
||
procs = ["InitFortuneMindState3D", "DetectTopic3D", "SubStrI3D",
|
||
"GenerateTarotReadingMind3D", "GenerateStudentGradeMind3D",
|
||
"SubmitStudentGrade3D", "DrawFortuneCardBox3D", "RenderFortuneDialog3D"]
|
||
for p in procs:
|
||
assert p in code or p in dialog, f"Procedure '{p}' missing from engine implementation"
|
||
print(f"[OK] All {len(procs)} required Fortune Mind procedures verified.")
|
||
|
||
# 5. Check mode transitions
|
||
assert "FORTUNE_SUBMODE_MENU" in data
|
||
assert "FORTUNE_SUBMODE_TAROT" in data
|
||
assert "FORTUNE_SUBMODE_STUDENT" in data
|
||
print("[OK] Menu, Tarot, and Student submodes verified.")
|
||
|
||
|
||
def test_hall_expansion_integration():
|
||
cmd = ["python", str(ROOT / "tools/tests/check_hall_expansion.py")]
|
||
proc = subprocess.run(cmd, cwd=ROOT, capture_output=True, text=True)
|
||
assert proc.returncode == 0, f"check_hall_expansion.py failed:\n{proc.stdout}\n{proc.stderr}"
|
||
assert "PASS" in proc.stdout, proc.stdout
|
||
print("[OK] check_hall_expansion native test suite passed with updated fortune dialogue.")
|
||
|
||
|
||
if __name__ == '__main__':
|
||
test_tarot_database()
|
||
test_hall_expansion_integration()
|
||
print("\nALL TAROT & TEACHER GRADE DIVINATION TESTS PASSED SUCCESSFULLY!")
|