| """Content loading: every authored card, deck, and encounter must parse.""" |
|
|
| from scrypt.data import load_content |
| from scrypt.engine.cards import CostType |
|
|
|
|
| def test_content_loads(): |
| content = load_content() |
| assert len(content.pool) >= 15 |
| assert "vanilla" in content.starter_decks |
| assert "first_blood" in content.encounters |
|
|
|
|
| def test_starter_decks_are_full_and_carry_free_fodder(): |
| content = load_content() |
| assert set(content.starter_decks) >= {"vanilla", "forkstorm", "graveyard"} |
| for deck_id, deck in content.starter_decks.items(): |
| cards = deck["cards"] |
| assert len(cards) >= 7, f"{deck_id} too thin" |
| free = sum(1 for c in cards if c.cost.type.value == "free") |
| cheap = sum(1 for c in cards if c.cost.amount <= 1) |
| assert free >= 1, f"{deck_id} has no free fodder" |
| assert cheap >= len(cards) // 2, f"{deck_id} curve too steep" |
|
|
|
|
| def test_bit_is_free_fodder(): |
| content = load_content() |
| bit = content.card("bit") |
| assert bit.cost.type is CostType.FREE |
| assert bit.power == 0 |
|
|
|
|
| def test_encounter_script_lanes_in_range(): |
| content = load_content() |
| for enc in content.encounters.values(): |
| for turn in enc["script"]: |
| for play in turn: |
| assert 0 <= play.lane < 4 |
|
|