X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Ftests%2Ftest_actions.py;h=a8d9201206425be0840bbad3a947965c858d8179;hb=4430c92a3e7c1cd14a5a672c4899ee5406a095fb;hp=bf04e21eacb9c4091c91a25fb3870d622f690c0f;hpb=da7b5b8cfedca73f510a85275a5c9155b07c2cf9;p=naja.git diff --git a/naja/tests/test_actions.py b/naja/tests/test_actions.py index bf04e21..a8d9201 100644 --- a/naja/tests/test_actions.py +++ b/naja/tests/test_actions.py @@ -1,19 +1,140 @@ from unittest import TestCase +from naja.constants import BITS +from naja.gameboard import GameBoard, LocationCard from naja.player import Player from naja import actions class TestActions(TestCase): def make_player(self, *bits): - return Player(sum(1 << bit for bit in bits), None) + player_bits = 0 + for bit in bits: + player_bits |= (1 << bit) + return Player(player_bits, None) - def test_DoNothing_check_available(self): - player = self.make_player() - action = actions.DoNothing() - self.assertEqual(action.check_available(player), True) + def make_board(self, player_bits=None, locations=None): + if locations is None: + locations = [{'actions': []}] + board = GameBoard.new_game(locations) + if player_bits is not None: + board.player.bits.bits = 0 + board.player.bits.set_bits(player_bits) + return board - def test_LoseHealthOrMSB_check_available(self): - player = self.make_player() - action = actions.LoseHeathOrMSB() - self.assertEqual(action.check_available(player), True) + def assert_player_bits(self, board, *bits): + self.assertEqual(sum(1 << bit for bit in bits), board.player.bits.bits) + + def assert_state(self, state1, state2, exclude=(), player_exclude=()): + def filter_dict(source, exclude_keys): + return dict((k, v) for k, v in source.items() + if k not in exclude_keys) + + state1 = filter_dict(state1, exclude) + if 'player' in state1: + state1['player'] = filter_dict(state1['player'], player_exclude) + state2 = filter_dict(state2, exclude) + if 'player' in state2: + state2['player'] = filter_dict(state2['player'], player_exclude) + + self.assertEqual(state1, state2) + + def test_check_available(self): + def check_available(action_bits, player_bits, expected_result): + action = actions.LocationAction(action_bits) + player = self.make_player(*player_bits) + self.assertEqual(action.check_available(player), expected_result) + + check_available(set(), [], True) + check_available(set(), [BITS.MSB], True) + check_available(set([BITS.MSB]), [], False) + check_available(set([BITS.MSB]), [BITS.MSB], True) + + def test_bits_translation(self): + action = actions.LocationAction(set([BITS.NORTH, 'MSB'])) + self.assertEqual(action.required_bits, set([BITS.NORTH, BITS.MSB])) + + def test_DoNothing(self): + board = self.make_board() + state_before = board.export() + actions.DoNothing(set()).perform_action(board, None) + state_after = board.export() + self.assert_state(state_before, state_after) + + def test_LoseHealthOrMSB_MSB_clear(self): + board = self.make_board() + state_before = board.export() + actions.LoseHealthOrMSB(set()).perform_action(board, None) + state_after = board.export() + self.assertEqual(state_after['health'], state_before['health'] - 1) + self.assert_state(state_before, state_after, exclude=['health']) + + def test_LoseHealthOrMSB_MSB_set(self): + board = self.make_board(player_bits=[BITS.MSB]) + state_before = board.export() + actions.LoseHealthOrMSB(set()).perform_action(board, None) + state_after = board.export() + self.assertEqual(board.player.bits.check_bit(BITS.MSB), False) + self.assert_state(state_before, state_after, player_exclude=['bits']) + + def test_SetBits(self): + board = self.make_board() + state_before = board.export() + card = LocationCard(set([BITS.MSB, BITS.NORTH]), []) + actions.SetBits(set()).perform_action(board, card) + state_after = board.export() + self.assertEqual( + board.player.bits.check_bits([BITS.MSB, BITS.NORTH]), True) + self.assert_state(state_before, state_after, player_exclude=['bits']) + + def test_ToggleBits(self): + board = self.make_board(player_bits=[BITS.NORTH]) + state_before = board.export() + card = LocationCard(set([BITS.MSB, BITS.NORTH]), []) + actions.ToggleBits(set()).perform_action(board, card) + state_after = board.export() + self.assertEqual(board.player.bits.check_bit(BITS.MSB), True) + self.assertEqual(board.player.bits.check_bit(BITS.NORTH), False) + self.assert_state(state_before, state_after, player_exclude=['bits']) + + def test_LoseHealthOrMSBAndSetBits_MSB_clear(self): + board = self.make_board(player_bits=[]) + state_before = board.export() + card = LocationCard(set([BITS.CYAN, BITS.NORTH]), []) + actions.LoseHealthOrMSBAndSetBits(set()).perform_action(board, card) + state_after = board.export() + self.assertEqual(state_after['health'], state_before['health'] - 1) + self.assert_player_bits(board, BITS.CYAN, BITS.NORTH) + self.assert_state( + state_before, state_after, exclude=['health'], + player_exclude=['bits']) + + def test_LoseHealthOrMSBAndSetBits_MSB_set(self): + board = self.make_board(player_bits=[BITS.MSB]) + state_before = board.export() + card = LocationCard(set([BITS.CYAN, BITS.NORTH]), []) + actions.LoseHealthOrMSBAndSetBits(set()).perform_action(board, card) + state_after = board.export() + self.assert_player_bits(board, BITS.CYAN, BITS.NORTH) + self.assert_state(state_before, state_after, player_exclude=['bits']) + + def test_LoseHealthOrMSBAndSetBits_MSB_set_and_on_card(self): + board = self.make_board(player_bits=[BITS.MSB]) + state_before = board.export() + card = LocationCard(set([BITS.MSB, BITS.NORTH]), []) + actions.LoseHealthOrMSBAndSetBits(set()).perform_action(board, card) + state_after = board.export() + self.assert_player_bits(board, BITS.MSB, BITS.NORTH) + self.assert_state(state_before, state_after, player_exclude=['bits']) + + def test_AcquireWinToken(self): + board = self.make_board( + player_bits=[BITS.CYAN, BITS.MAGENTA, BITS.YELLOW, BITS.MSB]) + state_before = board.export() + actions.AcquireWinToken(set()).perform_action(board, None) + state_after = board.export() + self.assertEqual(state_after['wins'], state_before['wins'] + 1) + self.assertEqual(board.player.bits.bits, 0) + self.assert_state( + state_before, state_after, exclude=['wins'], + player_exclude=['bits'])