import json import os import tempfile import pytest from ipin_vr.export import generate_bank, run_export # Rozmiary wyczerpujące przestrzeni: # Poziom 1: 2 × 10 × 6 = 120 # Poziom 2: 2 × 10 × 6 × 6 = 720 # --- format JSON --- def test_meta_fields(): bank = generate_bank(per_level=5, seed=0) assert bank["meta"]["version"] == "1" assert bank["meta"]["per_level"] == 5 def test_commands_structure(): bank = generate_bank(per_level=5, seed=0) for cmd in bank["commands"]: assert "level" in cmd assert "text" in cmd assert cmd["level"] in {1, 2, 3} assert isinstance(cmd["text"], str) assert len(cmd["text"]) > 0 def test_commands_end_with_period(): bank = generate_bank(per_level=5, seed=0) for cmd in bank["commands"]: assert cmd["text"].endswith("."), f"Brak kropki: {cmd['text']!r}" def test_json_roundtrip(): bank = generate_bank(per_level=5, seed=0) dumped = json.dumps(bank, ensure_ascii=False) reloaded = json.loads(dumped) assert reloaded["meta"] == bank["meta"] assert reloaded["commands"] == bank["commands"] # --- deduplikacja w obrębie poziomu --- def test_dedup_level1(): bank = generate_bank(per_level=50, seed=1) texts = [c["text"] for c in bank["commands"] if c["level"] == 1] assert len(texts) == len(set(texts)), "Duplikaty w poziomie 1" def test_dedup_level2(): bank = generate_bank(per_level=50, seed=1) texts = [c["text"] for c in bank["commands"] if c["level"] == 2] assert len(texts) == len(set(texts)), "Duplikaty w poziomie 2" def test_dedup_level3(): bank = generate_bank(per_level=50, seed=1) texts = [c["text"] for c in bank["commands"] if c["level"] == 3] assert len(texts) == len(set(texts)), "Duplikaty w poziomie 3" # --- ograniczenie przez rozmiar przestrzeni --- def test_level1_capped_at_space(): """Poziom 1: 2 × 10 × 6 = 120 unikatów — więcej nie istnieje.""" bank = generate_bank(per_level=300, seed=2) texts = [c["text"] for c in bank["commands"] if c["level"] == 1] assert len(texts) == 120 assert len(texts) == len(set(texts)) def test_level2_capped_at_space(): """Poziom 2: 2 × 10 × 6 × 6 = 720 unikatów.""" bank = generate_bank(per_level=1000, seed=2) texts = [c["text"] for c in bank["commands"] if c["level"] == 2] assert len(texts) == 720 assert len(texts) == len(set(texts)) def test_level3_respects_per_level(): bank = generate_bank(per_level=30, seed=3) texts = [c["text"] for c in bank["commands"] if c["level"] == 3] assert len(texts) == 30 # --- dokładna liczba na poziom --- def test_counts_per_level_small(): bank = generate_bank(per_level=10, seed=4) for level in [1, 2, 3]: texts = [c["text"] for c in bank["commands"] if c["level"] == level] assert len(texts) == 10, f"Poziom {level}: oczekiwano 10, jest {len(texts)}" # --- flagi CLI --- def test_cli_out_file(): with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as tf: path = tf.name try: run_export(["--per-level", "5", "--out", path, "--seed", "7"]) with open(path, encoding="utf-8") as f: data = json.load(f) assert data["meta"]["per_level"] == 5 assert len(data["commands"]) == 15 # 5 per level × 3 levels finally: os.unlink(path) def test_cli_seed_deterministic(): """Ten sam seed → identyczny wynik.""" b1 = generate_bank(per_level=10, seed=99) b2 = generate_bank(per_level=10, seed=99) assert b1["commands"] == b2["commands"] def test_cli_different_seeds(): """Różne seedy → różne wyniki (z bardzo dużym prawdopodobieństwem).""" b1 = generate_bank(per_level=50, seed=1) b2 = generate_bank(per_level=50, seed=2) t1 = [c["text"] for c in b1["commands"] if c["level"] == 3] t2 = [c["text"] for c in b2["commands"] if c["level"] == 3] assert t1 != t2