mirror of
https://github.com/mwisnowski/mtg_python_deckbuilder.git
synced 2026-03-08 06:32:37 +01:00
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.
122 lines
4.2 KiB
Python
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
|