mtg_python_deckbuilder/code/tests/test_random_determinism_comprehensive.py
matt c75f37603f fix(tests): add missing comprehensive test files and fix gitignore
The comprehensive test files were not committed due to .gitignore pattern 'test_*.py' blocking all test files. Fixed gitignore to only exclude root-level test scripts.
2026-02-20 11:33:41 -08:00

122 lines
4.2 KiB
Python

"""
Comprehensive tests for Random Build determinism and seed stability.
Consolidates:
- test_random_determinism.py (Basic determinism)
- test_random_determinism_delta.py (Delta checking)
- test_random_full_build_determinism.py (Full build determinism)
- test_random_multi_theme_seed_stability.py (Multi-theme stability)
"""
from __future__ import annotations
import os
from deck_builder.random_entrypoint import build_random_deck
# ============================================================================
# Basic Determinism Tests
# ============================================================================
def test_random_build_is_deterministic_with_seed(monkeypatch):
"""Fixed seed produces identical commander consistently."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
out1 = build_random_deck(seed=12345)
out2 = build_random_deck(seed=12345)
assert out1.commander == out2.commander
assert out1.seed == out2.seed
def test_random_build_uses_theme_when_available(monkeypatch):
"""Theme parameter is accepted and produces valid output."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
res = build_random_deck(theme="Goblin Kindred", seed=42)
assert isinstance(res.commander, str) and len(res.commander) > 0
def test_different_seeds_produce_different_commanders(monkeypatch):
"""Different seeds should produce different results (probabilistic)."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
out1 = build_random_deck(seed=1)
out2 = build_random_deck(seed=2)
out3 = build_random_deck(seed=3)
# At least one should be different (very likely with different seeds)
commanders = {out1.commander, out2.commander, out3.commander}
assert len(commanders) >= 2, "Different seeds should produce varied results"
# ============================================================================
# Delta Checking Tests
# ============================================================================
def test_random_build_delta_consistency(monkeypatch):
"""Small seed delta produces different but consistent results."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
# Build with seed N and seed N+1
out1 = build_random_deck(seed=5000)
out2 = build_random_deck(seed=5001)
# Results should be reproducible
out1_repeat = build_random_deck(seed=5000)
out2_repeat = build_random_deck(seed=5001)
assert out1.commander == out1_repeat.commander
assert out2.commander == out2_repeat.commander
# ============================================================================
# Multi-Theme Seed Stability Tests
# ============================================================================
def test_random_build_multi_theme_stability(monkeypatch):
"""Multiple themes with same seed produce consistent results."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
# Try with multiple themes (if supported)
out1 = build_random_deck(
theme="Goblin Kindred",
secondary_theme="Aggro",
seed=999
)
out2 = build_random_deck(
theme="Goblin Kindred",
secondary_theme="Aggro",
seed=999
)
assert out1.commander == out2.commander
assert out1.seed == out2.seed
def test_random_build_multi_theme_different_order(monkeypatch):
"""Theme order shouldn't break determinism (if themes are sorted internally)."""
monkeypatch.setenv("CSV_FILES_DIR", os.path.join("csv_files", "testdata"))
# Build with themes in different order but same seed
out1 = build_random_deck(
theme="Goblin Kindred",
secondary_theme="Aggro",
seed=1111
)
out2 = build_random_deck(
theme="Aggro",
secondary_theme="Goblin Kindred",
seed=1111
)
# Both should succeed and be reproducible
assert out1.commander
assert out2.commander
# Verify reproducibility for each configuration
out1_repeat = build_random_deck(
theme="Goblin Kindred",
secondary_theme="Aggro",
seed=1111
)
assert out1.commander == out1_repeat.commander