test runner added
This commit is contained in:
349
tests/unit/test_zone.gd
Normal file
349
tests/unit/test_zone.gd
Normal file
@@ -0,0 +1,349 @@
|
||||
extends GutTest
|
||||
|
||||
## Unit tests for Zone.gd
|
||||
|
||||
var zone: Zone
|
||||
|
||||
|
||||
func before_each():
|
||||
zone = Zone.new(Enums.ZoneType.HAND, 0)
|
||||
|
||||
|
||||
## Initialization Tests
|
||||
|
||||
func test_zone_initializes_with_correct_type():
|
||||
assert_eq(zone.zone_type, Enums.ZoneType.HAND)
|
||||
assert_eq(zone.owner_index, 0)
|
||||
|
||||
|
||||
func test_zone_initializes_empty():
|
||||
assert_eq(zone.get_count(), 0)
|
||||
assert_true(zone.is_empty())
|
||||
|
||||
|
||||
func test_zone_default_owner_is_negative_one():
|
||||
var shared_zone = Zone.new(Enums.ZoneType.STACK)
|
||||
assert_eq(shared_zone.owner_index, -1)
|
||||
|
||||
|
||||
## Add Card Tests
|
||||
|
||||
func test_add_card_succeeds():
|
||||
var card_data = TestCardData.create_forward()
|
||||
var card = CardInstance.new(card_data, 0)
|
||||
|
||||
var result = zone.add_card(card)
|
||||
|
||||
assert_true(result)
|
||||
assert_eq(zone.get_count(), 1)
|
||||
assert_eq(card.zone_type, Enums.ZoneType.HAND)
|
||||
|
||||
|
||||
func test_add_duplicate_card_fails():
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
var result = zone.add_card(card)
|
||||
|
||||
assert_false(result)
|
||||
assert_eq(zone.get_count(), 1)
|
||||
|
||||
|
||||
func test_add_card_at_top_default():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1", "Card 1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2", "Card 2"), 0)
|
||||
|
||||
zone.add_card(card1)
|
||||
zone.add_card(card2) # Default is at_top = true
|
||||
|
||||
assert_eq(zone.get_top_card(), card2)
|
||||
assert_eq(zone.get_bottom_card(), card1)
|
||||
|
||||
|
||||
func test_add_card_at_bottom():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1", "Card 1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2", "Card 2"), 0)
|
||||
|
||||
zone.add_card(card1, true) # at top
|
||||
zone.add_card(card2, false) # at bottom
|
||||
|
||||
assert_eq(zone.get_top_card(), card1)
|
||||
assert_eq(zone.get_bottom_card(), card2)
|
||||
|
||||
|
||||
func test_add_card_updates_card_zone_type():
|
||||
var deck_zone = Zone.new(Enums.ZoneType.DECK, 0)
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
card.zone_type = Enums.ZoneType.HAND
|
||||
|
||||
deck_zone.add_card(card)
|
||||
|
||||
assert_eq(card.zone_type, Enums.ZoneType.DECK)
|
||||
|
||||
|
||||
## Remove Card Tests
|
||||
|
||||
func test_remove_card_succeeds():
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
var result = zone.remove_card(card)
|
||||
|
||||
assert_true(result)
|
||||
assert_eq(zone.get_count(), 0)
|
||||
|
||||
|
||||
func test_remove_nonexistent_card_fails():
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
|
||||
var result = zone.remove_card(card)
|
||||
|
||||
assert_false(result)
|
||||
|
||||
|
||||
## Query Tests
|
||||
|
||||
func test_get_cards_returns_copy():
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
var cards = zone.get_cards()
|
||||
cards.clear() # Modify the returned array
|
||||
|
||||
assert_eq(zone.get_count(), 1) # Original should be unchanged
|
||||
|
||||
|
||||
func test_has_card():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2"), 0)
|
||||
zone.add_card(card1)
|
||||
|
||||
assert_true(zone.has_card(card1))
|
||||
assert_false(zone.has_card(card2))
|
||||
|
||||
|
||||
func test_get_card_at():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2"), 0)
|
||||
zone.add_card(card1)
|
||||
zone.add_card(card2)
|
||||
|
||||
assert_eq(zone.get_card_at(0), card1)
|
||||
assert_eq(zone.get_card_at(1), card2)
|
||||
assert_null(zone.get_card_at(2))
|
||||
assert_null(zone.get_card_at(-1))
|
||||
|
||||
|
||||
## Deck Operations Tests
|
||||
|
||||
func test_pop_top_card():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2"), 0)
|
||||
zone.add_card(card1)
|
||||
zone.add_card(card2)
|
||||
|
||||
var popped = zone.pop_top_card()
|
||||
|
||||
assert_eq(popped, card2)
|
||||
assert_eq(zone.get_count(), 1)
|
||||
assert_eq(zone.get_top_card(), card1)
|
||||
|
||||
|
||||
func test_pop_top_card_empty_zone():
|
||||
var popped = zone.pop_top_card()
|
||||
|
||||
assert_null(popped)
|
||||
|
||||
|
||||
func test_get_top_card_empty_zone():
|
||||
assert_null(zone.get_top_card())
|
||||
|
||||
|
||||
func test_get_bottom_card_empty_zone():
|
||||
assert_null(zone.get_bottom_card())
|
||||
|
||||
|
||||
func test_shuffle():
|
||||
# Add 10 cards
|
||||
for i in range(10):
|
||||
var card = CardInstance.new(TestCardData.create_forward("c" + str(i), "Card " + str(i)), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
var original_order = zone.get_cards().duplicate()
|
||||
zone.shuffle()
|
||||
var shuffled_order = zone.get_cards()
|
||||
|
||||
# With 10 cards, probability of same order after shuffle is 1/10! = ~0.000028%
|
||||
var different = false
|
||||
for i in range(10):
|
||||
if original_order[i] != shuffled_order[i]:
|
||||
different = true
|
||||
break
|
||||
assert_true(different, "Shuffle should change card order (statistically)")
|
||||
|
||||
|
||||
func test_clear():
|
||||
for i in range(5):
|
||||
var card = CardInstance.new(TestCardData.create_forward("c" + str(i)), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
var removed = zone.clear()
|
||||
|
||||
assert_eq(removed.size(), 5)
|
||||
assert_eq(zone.get_count(), 0)
|
||||
assert_true(zone.is_empty())
|
||||
|
||||
|
||||
## Type Filtering Tests
|
||||
|
||||
func test_get_forwards():
|
||||
var forward = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
var backup = CardInstance.new(TestCardData.create_backup(), 0)
|
||||
var summon = CardInstance.new(TestCardData.create_summon(), 0)
|
||||
zone.add_card(forward)
|
||||
zone.add_card(backup)
|
||||
zone.add_card(summon)
|
||||
|
||||
var forwards = zone.get_forwards()
|
||||
|
||||
assert_eq(forwards.size(), 1)
|
||||
assert_eq(forwards[0], forward)
|
||||
|
||||
|
||||
func test_get_backups():
|
||||
var forward = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
var backup = CardInstance.new(TestCardData.create_backup(), 0)
|
||||
zone.add_card(forward)
|
||||
zone.add_card(backup)
|
||||
|
||||
var backups = zone.get_backups()
|
||||
|
||||
assert_eq(backups.size(), 1)
|
||||
assert_eq(backups[0], backup)
|
||||
|
||||
|
||||
## State Filtering Tests
|
||||
|
||||
func test_get_active_cards():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2"), 0)
|
||||
card2.dull()
|
||||
zone.add_card(card1)
|
||||
zone.add_card(card2)
|
||||
|
||||
var active = zone.get_active_cards()
|
||||
|
||||
assert_eq(active.size(), 1)
|
||||
assert_eq(active[0], card1)
|
||||
|
||||
|
||||
func test_get_dull_cards():
|
||||
var card1 = CardInstance.new(TestCardData.create_forward("c1"), 0)
|
||||
var card2 = CardInstance.new(TestCardData.create_forward("c2"), 0)
|
||||
card2.dull()
|
||||
zone.add_card(card1)
|
||||
zone.add_card(card2)
|
||||
|
||||
var dull = zone.get_dull_cards()
|
||||
|
||||
assert_eq(dull.size(), 1)
|
||||
assert_eq(dull[0], card2)
|
||||
|
||||
|
||||
## Search Tests
|
||||
|
||||
func test_find_cards_by_name():
|
||||
var cloud1 = CardInstance.new(TestCardData.create_forward("c1", "Cloud"), 0)
|
||||
var cloud2 = CardInstance.new(TestCardData.create_forward("c2", "Cloud"), 0)
|
||||
var tifa = CardInstance.new(TestCardData.create_forward("c3", "Tifa"), 0)
|
||||
zone.add_card(cloud1)
|
||||
zone.add_card(cloud2)
|
||||
zone.add_card(tifa)
|
||||
|
||||
var found = zone.find_cards_by_name("Cloud")
|
||||
|
||||
assert_eq(found.size(), 2)
|
||||
|
||||
|
||||
func test_find_cards_by_element():
|
||||
var fire_card = CardInstance.new(TestCardData.create_forward("c1", "Fire Card", Enums.Element.FIRE), 0)
|
||||
var ice_card = CardInstance.new(TestCardData.create_forward("c2", "Ice Card", Enums.Element.ICE), 0)
|
||||
zone.add_card(fire_card)
|
||||
zone.add_card(ice_card)
|
||||
|
||||
var fire_cards = zone.find_cards_by_element(Enums.Element.FIRE)
|
||||
|
||||
assert_eq(fire_cards.size(), 1)
|
||||
assert_eq(fire_cards[0], fire_card)
|
||||
|
||||
|
||||
func test_has_card_with_name():
|
||||
var card = CardInstance.new(TestCardData.create_forward("c1", "Cloud"), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
assert_true(zone.has_card_with_name("Cloud"))
|
||||
assert_false(zone.has_card_with_name("Sephiroth"))
|
||||
|
||||
|
||||
func test_has_light_or_dark_with_light():
|
||||
var fire_card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(fire_card)
|
||||
assert_false(zone.has_light_or_dark())
|
||||
|
||||
var light_card = CardInstance.new(TestCardData.create_light_forward(), 0)
|
||||
zone.add_card(light_card)
|
||||
assert_true(zone.has_light_or_dark())
|
||||
|
||||
|
||||
func test_has_light_or_dark_with_dark():
|
||||
var dark_card = CardInstance.new(TestCardData.create_dark_forward(), 0)
|
||||
zone.add_card(dark_card)
|
||||
|
||||
assert_true(zone.has_light_or_dark())
|
||||
|
||||
|
||||
## Callback Tests
|
||||
|
||||
func test_on_card_added_callback():
|
||||
# Use array to capture value since GDScript lambdas need reference types
|
||||
var result = [null]
|
||||
zone.on_card_added = func(c): result[0] = c
|
||||
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
|
||||
assert_eq(result[0], card)
|
||||
|
||||
|
||||
func test_on_card_removed_callback():
|
||||
var result = [null]
|
||||
zone.on_card_removed = func(c): result[0] = c
|
||||
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
zone.remove_card(card)
|
||||
|
||||
assert_eq(result[0], card)
|
||||
|
||||
|
||||
func test_pop_triggers_removed_callback():
|
||||
var result = [null]
|
||||
zone.on_card_removed = func(c): result[0] = c
|
||||
|
||||
var card = CardInstance.new(TestCardData.create_forward(), 0)
|
||||
zone.add_card(card)
|
||||
zone.pop_top_card()
|
||||
|
||||
assert_eq(result[0], card)
|
||||
|
||||
|
||||
func test_clear_triggers_removed_callbacks():
|
||||
var counter = [0]
|
||||
zone.on_card_removed = func(_card): counter[0] += 1
|
||||
|
||||
for i in range(3):
|
||||
zone.add_card(CardInstance.new(TestCardData.create_forward("c" + str(i)), 0))
|
||||
|
||||
zone.clear()
|
||||
|
||||
assert_eq(counter[0], 3)
|
||||
Reference in New Issue
Block a user