Skip to content

Commit 367a787

Browse files
authored
Merge pull request #721 from Axelrod-Python/719
Tournaments can run on Windows
2 parents e8cc129 + 506a17e commit 367a787

File tree

15 files changed

+196
-101
lines changed

15 files changed

+196
-101
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ cache.txt
1313
test.csv
1414
summary.csv
1515
basic_tournament.csv
16+
test_outputs/*csv
17+
test_outputs/*cache

appveyor.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
environment:
22
matrix:
3-
- PYTHON: "C:\\Python27"
4-
- PYTHON: "C:\\Python34"
53
- PYTHON: "C:\\Python35"
64
install:
75
- "%PYTHON%\\python.exe -m pip install -r requirements.txt"
86
build: off
97
test_script:
108
- "%PYTHON%\\python.exe -m unittest discover"
9+
- "%PYTHON%\\python.exe doctests.py"

axelrod/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
from __future__ import absolute_import
2+
import os
3+
4+
on_windows = os.name == 'nt'
25

36
# The order of imports matters!
47
from .actions import Actions, flip_action

axelrod/result_set.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ def write_summary(self, filename):
739739
"""
740740
summary_data = self.summarise()
741741
with open(filename, 'w') as csvfile:
742-
writer = csv.writer(csvfile)
742+
writer = csv.writer(csvfile, lineterminator='\n')
743743
writer.writerow(self.player._fields)
744744
for player in summary_data:
745745
writer.writerow(player)

axelrod/tests/integration/test_tournament.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import unittest
22
import axelrod
3-
import tempfile
43
import filecmp
54

65
from axelrod.strategy_transformers import FinalTransformer
@@ -34,9 +33,9 @@ def test_full_tournament(self):
3433
tournament = axelrod.Tournament(name='test', players=strategies,
3534
game=self.game, turns=2,
3635
repetitions=2)
37-
tmp_file = tempfile.NamedTemporaryFile()
36+
filename = "test_outputs/test_tournament.csv"
3837
self.assertIsNone(tournament.play(progress_bar=False,
39-
filename=tmp_file.name,
38+
filename=filename,
4039
build_results=False))
4140

4241
def test_serial_play(self):
@@ -50,6 +49,8 @@ def test_serial_play(self):
5049
actual_outcome = sorted(zip(self.player_names, scores))
5150
self.assertEqual(actual_outcome, self.expected_outcome)
5251

52+
@unittest.skipIf(axelrod.on_windows,
53+
"Parallel processing not supported on Windows")
5354
def test_parallel_play(self):
5455
tournament = axelrod.Tournament(
5556
name=self.test_name,
@@ -71,10 +72,10 @@ def test_repeat_tournament_deterministic(self):
7172
players=deterministic_players,
7273
game=self.game, turns=2,
7374
repetitions=2)
74-
files.append(tempfile.NamedTemporaryFile())
75-
tournament.play(progress_bar=False, filename=files[-1].name,
75+
files.append("test_outputs/stochastic_tournament_{}.csv".format(_))
76+
tournament.play(progress_bar=False, filename=files[-1],
7677
build_results=False)
77-
self.assertTrue(filecmp.cmp(files[0].name, files[1].name))
78+
self.assertTrue(filecmp.cmp(files[0], files[1]))
7879

7980
def test_repeat_tournament_stochastic(self):
8081
"""
@@ -89,10 +90,10 @@ def test_repeat_tournament_stochastic(self):
8990
players=stochastic_players,
9091
game=self.game, turns=2,
9192
repetitions=2)
92-
files.append(tempfile.NamedTemporaryFile())
93-
tournament.play(progress_bar=False, filename=files[-1].name,
93+
files.append("test_outputs/stochastic_tournament_{}.csv".format(_))
94+
tournament.play(progress_bar=False, filename=files[-1],
9495
build_results=False)
95-
self.assertTrue(filecmp.cmp(files[0].name, files[1].name))
96+
self.assertTrue(filecmp.cmp(files[0], files[1]))
9697

9798

9899
class TestNoisyTournament(unittest.TestCase):

axelrod/tests/unit/test_deterministic_cache.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from axelrod import DeterministicCache, TitForTat, Defector, Random
55

66
import pickle
7-
import tempfile
87

98

109
class TestDeterministicCache(unittest.TestCase):
@@ -96,10 +95,10 @@ def test_load(self):
9695
self.assertEqual(cache[self.test_key], self.test_value)
9796

9897
def test_load_error_for_inccorect_format(self):
99-
tmp_file = tempfile.NamedTemporaryFile()
100-
with open(tmp_file.name, 'wb') as io:
98+
filename = "test_outputs/test.cache"
99+
with open(filename, 'wb') as io:
101100
pickle.dump(range(5), io)
102101

103102
with self.assertRaises(ValueError):
104103
cache = DeterministicCache()
105-
cache.load(tmp_file.name)
104+
cache.load(filename)

axelrod/tests/unit/test_resultset.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from numpy import mean, std, nanmedian
66

7-
import tempfile
87
import csv
98

109
from hypothesis import given, settings
@@ -16,6 +15,8 @@ class TestResultSet(unittest.TestCase):
1615
@classmethod
1716
def setUpClass(cls):
1817

18+
cls.filename = "test_outputs/test_results.csv"
19+
1920
cls.players = (axelrod.Alternator(), axelrod.TitForTat(), axelrod.Defector())
2021
cls.turns = 5
2122
cls.matches = {
@@ -410,11 +411,10 @@ def test_summarise(self):
410411
ranked_median_wins)
411412

412413
def test_write_summary(self):
413-
tmp_file = tempfile.NamedTemporaryFile()
414414
rs = axelrod.ResultSet(self.players, self.interactions,
415415
progress_bar=False)
416-
rs.write_summary(filename=tmp_file.name)
417-
with open(tmp_file.name, "r") as csvfile:
416+
rs.write_summary(filename=self.filename)
417+
with open(self.filename, "r") as csvfile:
418418
ranked_names = []
419419
csvreader = csv.reader(csvfile)
420420
for row in csvreader:
@@ -427,46 +427,45 @@ def test_write_summary(self):
427427

428428

429429
class TestResultSetFromFile(unittest.TestCase):
430-
tmp_file = tempfile.NamedTemporaryFile(mode='w', delete=False)
430+
filename = "test_outputs/test_results_from_file.csv"
431431
players = [axelrod.Cooperator(),
432432
axelrod.TitForTat(),
433433
axelrod.Defector()]
434434
tournament = axelrod.Tournament(players=players, turns=2, repetitions=3)
435-
tournament.play(filename=tmp_file.name)
436-
tmp_file.close()
435+
tournament.play(filename=filename)
437436

438-
interactions = iu.read_interactions_from_file(tmp_file.name)
437+
interactions = iu.read_interactions_from_file(filename)
439438

440439
def test_init(self):
441-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
440+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
442441
self.assertEqual(brs.players, [str(p) for p in self.players])
443442
self.assertEqual(brs.nplayers, len(self.players))
444443
self.assertEqual(brs.nrepetitions, 3)
445444

446445
def test_init_with_different_game(self):
447446
game = axelrod.Game(p=-1, r=-1, s=-1, t=-1)
448-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False,
447+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False,
449448
game=game)
450449
self.assertEqual(brs.game.RPST(), (-1, -1, -1, -1))
451450

452451
def test_init_with_progress_bar(self):
453452
"""Just able to test that no error occurs"""
454-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=True)
453+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=True)
455454
self.assertEqual(brs.nplayers, len(self.players))
456455
self.assertEqual(brs.nrepetitions, 3)
457456
self.assertEqual(brs.num_interactions, 18)
458457

459458
def test_init_with_num_interactions(self):
460459
"""Just able to test that no error occurs"""
461-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=True,
460+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=True,
462461
num_interactions=18)
463462
self.assertEqual(brs.nplayers, len(self.players))
464463
self.assertEqual(brs.nrepetitions, 3)
465464
self.assertEqual(brs.num_interactions, 18)
466465

467466
def test_init_with_players_nrepetitions(self):
468467
"""Just able to test that no error occurs"""
469-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=True,
468+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=True,
470469
num_interactions=18, nrepetitions=3,
471470
players=[str(p) for p in self.players])
472471
self.assertEqual(brs.nplayers, len(self.players))
@@ -476,13 +475,13 @@ def test_init_with_players_nrepetitions(self):
476475
def test_equality(self):
477476
"""A test that checks overall equality by comparing to the base result
478477
set class"""
479-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
478+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
480479
rs = axelrod.ResultSet(self.players, self.interactions, progress_bar=False)
481480
self.assertEqual(rs, brs)
482481

483482
def test_interactions_equality(self):
484-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False,
485-
keep_interactions=True)
483+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False,
484+
keep_interactions=True)
486485
rs = axelrod.ResultSet(self.players, self.interactions, progress_bar=False)
487486
self.assertEqual(rs.interactions, brs.interactions)
488487

@@ -492,11 +491,11 @@ def test_interactions_equality(self):
492491
max_repetitions=3))
493492
@settings(max_examples=50, timeout=0)
494493
def test_equality_with_round_robin(self, tournament):
495-
tmp_file = tempfile.NamedTemporaryFile(mode='w', delete=False)
496-
tournament.play(filename=tmp_file.name, progress_bar=False,
494+
filename = "test_outputs/test_results.csv"
495+
tournament.play(filename=filename, progress_bar=False,
497496
build_results=False)
498-
brs = axelrod.ResultSetFromFile(tmp_file.name, progress_bar=False)
499-
interactions = iu.read_interactions_from_file(tmp_file.name)
497+
brs = axelrod.ResultSetFromFile(filename, progress_bar=False)
498+
interactions = iu.read_interactions_from_file(filename)
500499
rs = axelrod.ResultSet(tournament.players, interactions,
501500
progress_bar=False)
502501

@@ -511,11 +510,11 @@ def test_equality_with_round_robin(self, tournament):
511510
max_repetitions=3))
512511
@settings(max_examples=50, timeout=0)
513512
def test_equality_with_prob_end(self, tournament):
514-
tmp_file = tempfile.NamedTemporaryFile(mode='w', delete=False)
515-
tournament.play(filename=tmp_file.name, progress_bar=False,
513+
filename = "test_outputs/test_results.csv"
514+
tournament.play(filename=filename, progress_bar=False,
516515
build_results=False)
517-
brs = axelrod.ResultSetFromFile(tmp_file.name, progress_bar=False)
518-
interactions = iu.read_interactions_from_file(tmp_file.name)
516+
brs = axelrod.ResultSetFromFile(filename, progress_bar=False)
517+
interactions = iu.read_interactions_from_file(filename)
519518
rs = axelrod.ResultSet(tournament.players, interactions,
520519
progress_bar=False)
521520

@@ -526,14 +525,14 @@ def test_equality_with_prob_end(self, tournament):
526525
self.assertEqual(rs.cooperation, brs.cooperation)
527526

528527
def test_read_players_and_repetitions(self):
529-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
528+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
530529
players, nrepetitions = brs._read_players_and_repetition_numbers()
531530
expected_players = ['Cooperator', 'Tit For Tat', 'Defector']
532531
self.assertEqual(brs.players, expected_players)
533532
self.assertEqual(nrepetitions, 3)
534533

535534
def test_update_repetitions(self):
536-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
535+
brs = axelrod.ResultSetFromFile(filename=self.filename, progress_bar=False)
537536
brs.repetitions_d = {}
538537
brs._update_repetitions((0, 0))
539538
self.assertEqual(brs.repetitions_d, {(0, 0): 1})
@@ -543,7 +542,7 @@ def test_update_repetitions(self):
543542
self.assertEqual(brs.repetitions_d, {(0, 0): 2, (0, 1): 1})
544543

545544
def test_build_repetitions(self):
546-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
545+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
547546
brs.repetitions_d = {}
548547
brs._update_repetitions((0, 0))
549548
brs._update_repetitions((0, 0))
@@ -552,7 +551,7 @@ def test_build_repetitions(self):
552551
self.assertFalse(hasattr(brs, 'repetitions_d'))
553552

554553
def test_update_players(self):
555-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
554+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
556555
brs.players_d = {}
557556
brs._update_players((0, 0), ('Cooperator', 'Cooperator'))
558557
self.assertEqual(brs.players_d, {0: 'Cooperator'})
@@ -562,7 +561,7 @@ def test_update_players(self):
562561
self.assertEqual(brs.players_d, {0: 'Cooperator', 1: 'Defector'})
563562

564563
def test_build_players(self):
565-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
564+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
566565
brs.players_d = {}
567566
brs._update_players((0, 0), ('Cooperator', 'Cooperator'))
568567
brs._update_players((0, 1), ('Cooperator', 'Defector'))
@@ -571,7 +570,7 @@ def test_build_players(self):
571570
self.assertFalse(hasattr(brs, 'players_d'))
572571

573572
def test_build_read_match_chunks(self):
574-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
573+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
575574
matches = brs.read_match_chunks()
576575
chunk = next(matches)
577576
self.assertEqual(chunk[0], ['0'] * 2 + ['Cooperator'] * 2 + ['CC'] * 2)
@@ -580,7 +579,7 @@ def test_build_read_match_chunks(self):
580579
self.assertEqual(len(list(matches)), 5)
581580

582581
def test_build_all(self):
583-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
582+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
584583
rs = axelrod.ResultSet(self.players, self.interactions,
585584
progress_bar=False)
586585

@@ -608,7 +607,7 @@ def test_buid_empty_metrics(self):
608607
for player in plist]
609608

610609
expected_good_partner_rating = [0 for player in plist]
611-
brs = axelrod.ResultSetFromFile(self.tmp_file.name, progress_bar=False)
610+
brs = axelrod.ResultSetFromFile(self.filename, progress_bar=False)
612611
brs.match_lengths = []
613612
brs.wins = []
614613
brs.scores = []

0 commit comments

Comments
 (0)