07583b3bf11a312bdefed1c267f623b069b42c18
[naja.git] / naja / tests / test_player.py
1 from unittest import TestCase
2
3 from naja.constants import BITS, MOVES
4 from naja.player import PlayerBits, Player
5
6
7 class TestPlayerBits(TestCase):
8     def test_range_limits(self):
9         bits = PlayerBits(0x00)
10
11         def set_value(value):
12             bits.bits = value
13
14         self.assertEqual(bits.bits, 0x00)
15         self.assertRaises(AssertionError, set_value, -1)
16         self.assertEqual(bits.bits, 0x00)
17         bits.bits = 255
18         self.assertEqual(bits.bits, 0xff)
19         bits.bits = 0
20         self.assertEqual(bits.bits, 0x00)
21         self.assertRaises(AssertionError, set_value, 256)
22         self.assertEqual(bits.bits, 0x00)
23
24     def test_check_bit(self):
25         bits = PlayerBits(0x01)
26         self.assertEqual(bits.check_bit(BITS.NORTH), True)
27         self.assertEqual(bits.check_bit(BITS.SOUTH), False)
28
29     def test_set_bit(self):
30         bits = PlayerBits(0x00)
31         self.assertEqual(bits._bits, 0x00)
32         bits.set_bit(BITS.NORTH)
33         self.assertEqual(bits._bits, 0x01)
34         bits.set_bit(BITS.NORTH)
35         self.assertEqual(bits._bits, 0x01)
36
37     def test_clear_bit(self):
38         bits = PlayerBits(0x01)
39         self.assertEqual(bits._bits, 0x01)
40         bits.clear_bit(BITS.NORTH)
41         self.assertEqual(bits._bits, 0x00)
42         bits.clear_bit(BITS.NORTH)
43         self.assertEqual(bits._bits, 0x00)
44
45     def test_toggle_bit(self):
46         bits = PlayerBits(0x00)
47         self.assertEqual(bits._bits, 0x00)
48         bits.toggle_bit(BITS.NORTH)
49         self.assertEqual(bits._bits, 0x01)
50         bits.toggle_bit(BITS.NORTH)
51         self.assertEqual(bits._bits, 0x00)
52
53     def test_check_bits(self):
54         bits = PlayerBits(0x03)
55         self.assertEqual(bits.check_bits([BITS.NORTH]), True)
56         self.assertEqual(bits.check_bits([BITS.NORTH, BITS.SOUTH]), True)
57         self.assertEqual(bits.check_bits([BITS.BLUE]), False)
58         self.assertEqual(bits.check_bits([BITS.BLUE, BITS.MSB]), False)
59         self.assertEqual(
60             bits.check_bits([BITS.NORTH, BITS.SOUTH, BITS.BLUE]), False)
61
62     def test_set_bits(self):
63         bits = PlayerBits(0x03)
64         self.assertEqual(bits._bits, 0x03)
65         bits.set_bits([BITS.NORTH, BITS.BLUE])
66         self.assertEqual(bits._bits, 0x13)
67         bits.set_bits([BITS.NORTH, BITS.BLUE, BITS.MSB])
68         self.assertEqual(bits._bits, 0x93)
69
70     def test_clear_bits(self):
71         bits = PlayerBits(0x03)
72         self.assertEqual(bits._bits, 0x03)
73         bits.clear_bits([BITS.NORTH, BITS.BLUE])
74         self.assertEqual(bits._bits, 0x02)
75         bits.clear_bits([BITS.NORTH, BITS.BLUE, BITS.MSB])
76         self.assertEqual(bits._bits, 0x02)
77
78     def test_toggle_bits(self):
79         bits = PlayerBits(0x03)
80         self.assertEqual(bits._bits, 0x03)
81         bits.toggle_bits([BITS.NORTH, BITS.BLUE])
82         self.assertEqual(bits._bits, 0x12)
83         bits.toggle_bits([BITS.NORTH, BITS.BLUE])
84         self.assertEqual(bits._bits, 0x03)
85         bits.toggle_bits([BITS.NORTH, BITS.BLUE, BITS.MSB])
86         self.assertEqual(bits._bits, 0x92)
87
88     def test_shift_bits_left(self):
89         bits = PlayerBits(0x03)
90         self.assertEqual(bits._bits, 0x03)
91         bits.shift_bits_left(1)
92         self.assertEqual(bits._bits, 0x06)
93         bits.shift_bits_left(6)
94         self.assertEqual(bits._bits, 0x81)
95
96     def test_shift_bits_right(self):
97         bits = PlayerBits(0x06)
98         self.assertEqual(bits._bits, 0x06)
99         bits.shift_bits_right(1)
100         self.assertEqual(bits._bits, 0x03)
101         bits.shift_bits_right(1)
102         self.assertEqual(bits._bits, 0x81)
103
104
105 class TestPlayer(TestCase):
106     def test_new_player(self):
107         player = Player(0x0f, (0, 1))
108         self.assertEqual(player.bits.bits, 0x0f)
109         self.assertEqual(player.position, (0, 1))
110
111     def test_import_player(self):
112         player = Player.import_player({
113             'bits': 0xaa,
114             'position': [1, 2],
115             'movement_mode': MOVES.CASTLE,
116         })
117         self.assertEqual(player.bits.bits, 0xaa)
118         self.assertEqual(player.position, (1, 2))
119         self.assertEqual(player.movement_mode, MOVES.CASTLE)
120
121     def test_export_player(self):
122         player = Player(0xaa, (1, 2), MOVES.CASTLE)
123         self.assertEqual(player.export(), {
124             'bits': 0xaa,
125             'position': [1, 2],
126             'movement_mode': MOVES.CASTLE,
127         })
128
129     def test_export_player_default_movement_mode(self):
130         player = Player(0xaa, (1, 2))
131         self.assertEqual(player.export(), {
132             'bits': 0xaa,
133             'position': [1, 2],
134             'movement_mode': MOVES.ADJACENT,
135         })
136
137     def test_legal_moves_all_available(self):
138         player = Player(0x0f, (2, 2))
139         self.assertEqual(
140             player.legal_moves(), [(2, 2), (2, 1), (2, 3), (3, 2), (1, 2)])
141
142     def test_legal_moves_some_unavailable(self):
143         player = Player(0x0f, (0, 2))
144         player.bits.clear_bit(BITS.NORTH)
145         self.assertEqual(player.legal_moves(), [(0, 2), (0, 3), (1, 2)])
146
147     def test_legal_moves_castle(self):
148         player = Player(0x0f, (1, 3), MOVES.CASTLE)
149         self.assertEqual(player.legal_moves(), [
150             (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 3), (3, 3),
151             (4, 3)])
152
153     def test_legal_moves_bishop(self):
154         player = Player(0x0f, (1, 3), MOVES.BISHOP)
155         self.assertEqual(player.legal_moves(), [
156             (0, 2), (0, 4), (1, 3), (2, 2), (2, 4), (3, 1), (4, 0)])
157
158     def test_legal_moves_knight(self):
159         player = Player(0x0f, (1, 3), MOVES.KNIGHT)
160         self.assertEqual(player.legal_moves(), [
161             (0, 1), (1, 3), (2, 1), (3, 2), (3, 4)])
162
163     def test_set_position(self):
164         player = Player(0x0f, (3, 3), MOVES.BISHOP)
165         player.set_position((4, 4))
166         self.assertEqual(player.movement_mode, MOVES.ADJACENT)