Skip to content

Commit b2dc6cd

Browse files
committed
Fix many more tests
1 parent af3c387 commit b2dc6cd

13 files changed

+80
-134
lines changed

axelrod/evolvable_player.py

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class EvolvablePlayer(Player):
2222

2323
def __init__(self, seed=None):
2424
super().__init__()
25+
# if set_seed:
2526
self.set_seed(seed=seed)
2627

2728
def overwrite_init_kwargs(self, **kwargs):

axelrod/strategies/cycler.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,9 @@ def __init__(
111111
mutation_potency: int = 1,
112112
seed: int = None
113113
) -> None:
114-
self.set_seed(seed=seed)
114+
EvolvablePlayer.__init__(self, seed=seed)
115115
cycle, cycle_length = self._normalize_parameters(cycle, cycle_length)
116-
# The following __init__ sets self.cycle = cycle
117116
Cycler.__init__(self, cycle=cycle)
118-
EvolvablePlayer.__init__(self)
119117
# Overwrite init_kwargs in the case that we generated a new cycle from cycle_length
120118
self.overwrite_init_kwargs(
121119
cycle=cycle,
@@ -162,7 +160,7 @@ def crossover(self, other) -> EvolvablePlayer:
162160
cycle_list = crossover_lists(self.cycle, other.cycle, self._random)
163161
cycle = "".join(cycle_list)
164162
cycle, _ = self._normalize_parameters(cycle)
165-
return self.create_new(cycle=cycle)
163+
return self.create_new(cycle=cycle, seed=self._random.random_seed_int())
166164

167165

168166
class CyclerDC(Cycler):

axelrod/strategies/darwin.py

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
indicated by their classifier). We do not recommend putting a lot of time in to
44
optimising it.
55
"""
6-
from collections import defaultdict
76
from typing import Optional
87

98
from axelrod.action import Action

axelrod/tests/strategies/test_better_and_better.py

+15-58
Original file line numberDiff line numberDiff line change
@@ -23,72 +23,29 @@ class TestBetterAndBetter(TestPlayer):
2323

2424
def test_strategy(self):
2525
"""Tests that the strategy gives expected behaviour."""
26+
expected_actions = [(D, D)] * 90 + [(C, D)]
2627
self.versus_test(
2728
axl.Defector(),
28-
expected_actions=[
29-
(D, D),
30-
(D, D),
31-
(D, D),
32-
(D, D),
33-
(C, D),
34-
(D, D),
35-
(D, D),
36-
(D, D),
37-
(D, D),
38-
],
29+
expected_actions=expected_actions,
3930
seed=6,
4031
)
32+
expected_actions = [(D, C)] * 10
4133
self.versus_test(
4234
axl.Cooperator(),
43-
expected_actions=[
44-
(D, C),
45-
(D, C),
46-
(D, C),
47-
(D, C),
48-
(D, C),
49-
(D, C),
50-
(D, C),
51-
(D, C),
52-
(D, C),
53-
],
35+
expected_actions=expected_actions,
5436
seed=8,
5537
)
38+
expected_actions = [(D, D)] * 41 + [(C, D)]
5639
self.versus_test(
5740
axl.Defector(),
58-
expected_actions=[
59-
(C, D),
60-
(D, D),
61-
(D, D),
62-
(D, D),
63-
(D, D),
64-
(D, D),
65-
(D, D),
66-
(D, D),
67-
(D, D),
68-
],
69-
seed=1514,
41+
expected_actions=expected_actions,
42+
seed=13,
7043
)
71-
actions = []
72-
for index in range(200):
73-
if index in [
74-
64,
75-
79,
76-
91,
77-
99,
78-
100,
79-
107,
80-
111,
81-
119,
82-
124,
83-
127,
84-
137,
85-
141,
86-
144,
87-
154,
88-
192,
89-
196,
90-
]:
91-
actions.append((C, D))
92-
else:
93-
actions.append((D, D))
94-
self.versus_test(axl.Defector(), expected_actions=actions, seed=8)
44+
expected_indices = [18, 39, 49, 67, 77, 116, 139, 142, 149]
45+
m = axl.Match((self.player(), axl.Defector()), turns=150, seed=111)
46+
result = m.play()
47+
indices = []
48+
for index, actions in enumerate(result):
49+
if actions == (C, D):
50+
indices.append(index)
51+
self.assertEqual(expected_indices, indices)

axelrod/tests/strategies/test_cycler.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -180,20 +180,20 @@ def test_normalized_parameters(self):
180180
def test_crossover_even_length(self):
181181
cycle1 = "C" * 6
182182
cycle2 = "D" * 6
183-
cross_cycle = "CCCDDD"
183+
cross_cycle = "CCCCCD"
184184

185-
player1 = self.player_class(cycle=cycle1, seed=3)
186-
player2 = self.player_class(cycle=cycle2)
185+
player1 = self.player_class(cycle=cycle1, seed=4)
186+
player2 = self.player_class(cycle=cycle2, seed=5)
187187
crossed = player1.crossover(player2)
188188
self.assertEqual(cross_cycle, crossed.cycle)
189189

190190
def test_crossover_odd_length(self):
191191
cycle1 = "C" * 7
192192
cycle2 = "D" * 7
193-
cross_cycle = "CCCDDDD"
193+
cross_cycle = "CCDDDDD"
194194

195-
player1 = self.player_class(cycle=cycle1, seed=5)
196-
player2 = self.player_class(cycle=cycle2)
195+
player1 = self.player_class(cycle=cycle1, seed=6)
196+
player2 = self.player_class(cycle=cycle2, seed=7)
197197
crossed = player1.crossover(player2)
198198
self.assertEqual(cross_cycle, crossed.cycle)
199199

axelrod/tests/strategies/test_geller.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_returns_foil_inspection_strategy_of_opponent(self):
6767
self.versus_test(axl.Darwin(), expected_actions=[(C, C), (C, C), (C, C)], seed=3)
6868

6969
self.versus_test(
70-
axelrod.MindReader(), expected_actions=[(D, D), (D, D), (D, D)], seed=1
70+
axl.MindReader(), expected_actions=[(D, D), (D, D), (D, D)], seed=1
7171
)
7272

7373

axelrod/tests/strategies/test_headsup.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def test_rounds(self):
5656
self.versus_test(
5757
axl.ZDGTFT2(),
5858
axl.Bully(),
59-
[C, D, D, C, C, C],
59+
[C, D, D, C, C, D],
6060
[D, D, C, C, D, D],
6161
seed=2,
6262
)
@@ -69,9 +69,9 @@ def test_rounds(self):
6969
self.versus_test(
7070
axl.ZDExtort2(),
7171
axl.TitForTat(),
72-
[C, D, D, D, D, D],
73-
[C, C, D, D, D, D],
74-
seed=2,
72+
[C, D, C, D, D, D],
73+
[C, C, D, C, D, D],
74+
seed=100,
7575
)
7676

7777

axelrod/tests/strategies/test_hmm.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class TestEvolvedHMM5(TestPlayer):
187187

188188
def test_strategy(self):
189189
actions = [(C, C), (C, D), (D, C), (D, D), (D, C)]
190-
self.versus_test(opponent=axl.Alternator(), expected_actions=actions)
190+
self.versus_test(opponent=axl.Alternator(), expected_actions=actions, seed=2)
191191

192192

193193
class TestEvolvedHMM5vsCooperator(TestMatch):

axelrod/tests/strategies/test_inverse.py

+9-18
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,15 @@ class TestInverse(TestPlayer):
2323

2424
def test_strategy(self):
2525
# Test that as long as the opponent has not defected the player will
26-
# cooperate.
27-
self.versus_test(axl.Cooperator(), expected_actions=[(C, C)])
28-
29-
# Tests that if opponent has played all D then player chooses D.
30-
self.versus_test(axl.Defector(), expected_actions=[(C, D)] + [(D, D)] * 9)
31-
32-
expected_actions = [
33-
(C, D),
34-
(D, C),
35-
(D, C),
36-
(D, D),
37-
(D, C),
38-
(C, C),
39-
(C, C),
40-
(C, C),
41-
(C, D),
42-
(D, D),
43-
]
26+
# cooperate, regardless of the random seed.
27+
self.versus_test(axl.Cooperator(), expected_actions=[(C, C)], seed=None)
28+
29+
# Tests that if opponent has played all D then player chooses D,
30+
# regardless of the random seed.
31+
self.versus_test(axl.Defector(), expected_actions=[(C, D)] + [(D, D)] * 9, seed=None)
32+
33+
expected_actions = [(C, D), (D, C), (D, C), (C, D), (D, C), (C, C),
34+
(D, C), (C, C), (C, D), (D, D)]
4435
self.versus_test(
4536
axl.MockPlayer(actions=[a[1] for a in expected_actions]),
4637
expected_actions=expected_actions,

axelrod/tests/strategies/test_memorytwo.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class TestMemoryStochastic(TestPlayer):
153153
}
154154

155155
def test_strategy(self):
156-
rng = axelrod.RandomGenerator(seed=7888)
156+
rng = axl.RandomGenerator(seed=7888)
157157
vector = [rng.random() for _ in range(16)]
158158

159159
actions = [(C, C), (C, C), (D, D), (C, C), (D, C), (D, D), (D, C)]

axelrod/tests/strategies/test_player.py

+30-31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import itertools
33
import pickle
44
import types
5+
import warnings
6+
57
import numpy as np
68

79
from hypothesis import given, settings
@@ -452,45 +454,34 @@ def test_reset_clone(self):
452454
clone = player.clone()
453455
self.assertEqual(player, clone)
454456

455-
def test_reproducibility_of_play(self):
456-
player = self.player()
457-
player_clone = player.clone()
458-
coplayer = axl.Random(0.5)
459-
coplayer_clone = coplayer.clone()
460-
m1 = axl.Match((player, coplayer), turns=10, seed=10)
461-
m2 = axl.Match((player_clone, coplayer_clone), turns=10, seed=10)
462-
m1.play()
463-
m2.play()
464-
self.assertEqual(m1.result, m2.result)
465-
466-
@given(seed=integers(min_value=1, max_value=20000000))
467-
@settings(max_examples=1)
468-
def test_clone(self, seed):
457+
@given(seed=integers(min_value=1, max_value=20000000),
458+
turns=integers(min_value=5, max_value=10),
459+
noise=integers(min_value=0, max_value=10))
460+
@settings(max_examples=1, deadline=None)
461+
def test_clone_reproducible_play(self, seed, turns, noise):
469462
# Test that the cloned player produces identical play
470-
player1 = self.player()
471-
if player1.name in ["Darwin", "Human"]:
463+
player = self.player()
464+
if player.name in ["Darwin", "Human"]:
472465
# Known exceptions
473466
return
474-
player2 = player1.clone()
475-
self.assertEqual(len(player2.history), 0)
476-
self.assertEqual(player2.cooperations, 0)
477-
self.assertEqual(player2.defections, 0)
478-
self.assertEqual(player2.state_distribution, {})
479-
self.assertEqual(player2.classifier, player1.classifier)
480-
self.assertEqual(player2.match_attributes, player1.match_attributes)
481467

482-
turns = 5
483468
for op in [
484469
axl.Cooperator(),
485470
axl.Defector(),
486471
axl.TitForTat(),
487472
axl.Random(p=0.5),
488473
]:
489-
for p in [player1, player2]:
490-
m = axl.Match((p, op), turns=turns, reset=True, seed=seed)
491-
m.play()
492-
self.assertEqual(len(player1.history), turns)
493-
self.assertEqual(player1.history, player2.history)
474+
player = self.player()
475+
player_clone = player.clone()
476+
op = op.clone()
477+
op_clone = op.clone()
478+
m1 = axl.Match((player, op), turns=turns, seed=seed, noise=noise/100.)
479+
m2 = axl.Match((player_clone, op_clone), turns=turns, seed=seed, noise=noise/100.)
480+
m1.play()
481+
m2.play()
482+
self.assertEqual(m1.result, m2.result)
483+
self.assertEqual(player, player_clone)
484+
self.assertEqual(op, op_clone)
494485

495486
@given(
496487
strategies=strategy_lists(
@@ -582,6 +573,10 @@ def versus_test(
582573
match_attributes=match_attributes,
583574
seed=seed
584575
)
576+
if match._stochastic and (seed is None):
577+
warnings.warn(
578+
"Test Match in TestPlayer.versus_test is stochastic "
579+
"but no random seed was given.")
585580
self.assertEqual(match.play(), expected_actions)
586581

587582
if attrs:
@@ -645,8 +640,12 @@ def versus_test(
645640
raise ValueError("Mismatched History lengths.")
646641
turns = len(expected_actions1)
647642
match = axl.Match((player1, player2), turns=turns, noise=noise, seed=seed)
648-
match.play()
649-
self.assertEqual(match.result, list(zip(expected_actions1, expected_actions2)))
643+
if match._stochastic and (seed is None):
644+
warnings.warn(
645+
"Test Match in TestMatch.versus_test is stochastic "
646+
"but no random seed was given.")
647+
result = match.play()
648+
self.assertEqual(result, list(zip(expected_actions1, expected_actions2)))
650649

651650
def test_versus_with_incorrect_history_lengths(self):
652651
"""Test the error raised by versus_test if expected actions do not

axelrod/tests/strategies/test_rand.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_strategy(self):
2828
self.versus_test(opponent, expected_actions=actions, seed=1)
2929

3030
opponent = axl.MockPlayer()
31-
actions = [(D, C), (D, C), (C, C)]
31+
actions = [(D, C), (C, C), (D, C)]
3232
self.versus_test(opponent, expected_actions=actions, seed=2)
3333

3434
opponent = axl.MockPlayer()

0 commit comments

Comments
 (0)