Пример #1
0
    def test_game_with_dots_in_player_name(self):
        """ Test vetoes with names containing dots.
        """

        test_game = game.Game(parse_game.parse_game( \
                codecs.open('testing/testdata/game-20120415-072057-6d356cf1.html', encoding='utf-8').read()))
        last_state = None
        game_state_iterator = test_game.game_state_iterator()
        for game_state in game_state_iterator:
            last_state = game_state
        self.assertEquals(test_game.vetoes[str(test_game.all_player_names().index(u'nrggirl'))], int(dominioncards.PirateShip.index))
        self.assertEquals(test_game.vetoes[str(test_game.all_player_names().index(u'Mr.Penskee'))], int(dominioncards.Masquerade.index))
Пример #2
0
def goals_for(game_id, player=None, goal_name=None):
    """Return the list of goals for the passed game id"""
    test_game = game.Game(parse_game.parse_game( \
            codecs.open('testing/testdata/'+game_id, encoding='utf-8').read()))
    found_goals = goals.check_goals(test_game)

    if player:
        found_goals = [g for g in found_goals if g['player'] == player]

    if goal_name:
        found_goals = [g for g in found_goals if g['goal_name'] == goal_name]

    return found_goals
Пример #3
0
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 15 11:41:23 2018

@author: Michael Gallimore (@mikegallimore)
"""

import parse_game
import argparse

parser = argparse.ArgumentParser()

### creates arguments to make use of in functions
parser.add_argument("--season_ID", dest="season_ID", required=False)
parser.add_argument("--game_ID", dest="game_ID", required=False)

args = parser.parse_args()

### passes the arguments through to parse_game.py
parse_game.parse_game(args.season_ID, args.game_ID)

### to run this program, open your Python command prompt and make sure you're working out of the proper directory
### in the console, enter the run_game.py file with season and game arguments
### example: python run_game.py --season_ID 20172018 --game_ID 20570
Пример #4
0
def annotate_game(contents, game_id, debug=False):
    """ Decorate game contents with some JS that makes a score keeper 
    and provides anchors per turn."""
    contents = contents.replace('—', '---').replace(
        'semistatic/log.css', 'client.css')
    parsed_game = parse_game.parse_game(contents, dubious_check = False)
    states = []
    
    game_val = game.Game(parsed_game)
    # win_prob_enabled = len(game_val.get_player_decks()) == 2
    win_prob_enabled = False
    if win_prob_enabled:
        predictions = win_predictor.predict_all_turns(game_val)

    for idx, game_state in enumerate(game_val.game_state_iterator()):
        encoded = game_state.encode_game_state()
        encoded['win_prob'] = predictions[idx] if win_prob_enabled else 0
        states.append(encoded)

    parsed_game['game_states'] = states

    ret = u''

    start_body = contents.find('<body>') + len('<body>')
    ret += contents[:start_body]
    ret += """
<div id="game-display"></div>
<script src="static/flot/jquery.js"></script>
<script src="static/game_viewer.js"></script>
<script src="static/flot/jquery.js"></script>
<script src="static/flot/jquery.flot.js"></script>
<script type="text/javascript">
        var game = %s;
        var card_list = %s;
        $(document).ready(DecorateGame);
</script>
""" % (json.dumps(parsed_game, indent=2), 
       open('static/card_list.js', 'r').read())
    contents = contents[start_body:]
    if debug > 2:
        ret += _pretty_format_html(parsed_game)
    if debug > 1:
        for turn in game_val.get_turns():
            ret += '%d %d %d %s %s<br>' % (
                turn.get_turn_no(),
                turn.get_player().TurnOrder(), turn.get_poss_no(),
                turn.turn_dict.get(POSSESSION, False),
                turn.get_player().name())

    import cStringIO as StringIO
    output_buf = StringIO.StringIO()
    if not parse_game.check_game_sanity(game_val, output_buf):
        ret += 'Parsing error, data mismatch, '
        ret += '<a href="game?game_id=%s&debug=1">be a hero, find the ' % game_id
        ret += 'bug</a> and tell the <a href="mailto:[email protected]?Subject=Game%20Annotation%20Error"> Council Room Developers</a><br>'
        ret += output_buf.getvalue().replace('\n', '<br>\n')

    cur_turn_ind = 0
    
    split_turn_chunks = parse_game.split_turns(contents)
    ret += split_turn_chunks[0]
    split_turn_chunks.pop(0)

    for idx, (turn_chunk, game_state) in enumerate(
        itertools.izip(split_turn_chunks, game_val.game_state_iterator())):
        split_chunk = turn_chunk.split('\n')

        turn_id = game_state.turn_label()
        show_turn_id = game_state.turn_label(for_anchor=True)
        ret += '<div id="%s"></div>' % turn_id
        ret += '<a name="%s"></a><a href="#%s">%s</a>' % (
            show_turn_id, show_turn_id, split_chunk[0])

        if debug:
            ret += '<br>' + repr(game_val.get_turns()[cur_turn_ind]).replace(
                '\n', '<br>')
        cur_turn_ind += 1

        if idx != len(split_turn_chunks) - 1:
            ret += turn_chunk[turn_chunk.find('\n'):]
        else:            
            before_end = turn_chunk.find('</html')
            ret += turn_chunk[turn_chunk.find('\n'): before_end]
            win_prob_graph = ''

            if win_prob_enabled:
                win_prob_graph = make_graph('win prob', 'win-prob-graph')
            ret += """
<div id="end-game"></div>
<table>
  %s
  %s
  %s
  %s
</table>
""" % (make_graph('score', 'score-graph'), make_graph('money', 'money-graph'),
       win_prob_graph, get_goals(game_val))
            ret += '</div>&nbsp<br>\n' * 10 
            ret += '</html>'
    return ret
Пример #5
0
def annotate_game(contents, game_id, debug=False):
    """ Decorate game contents with some JS that makes a score keeper 
    and provides anchors per turn."""
    contents = contents.replace('&mdash;',
                                '---').replace('semistatic/log.css',
                                               'client.css')
    parsed_game = parse_game.parse_game(contents, dubious_check=False)
    states = []

    game_val = game.Game(parsed_game)
    # win_prob_enabled = len(game_val.get_player_decks()) == 2
    win_prob_enabled = False
    if win_prob_enabled:
        predictions = win_predictor.predict_all_turns(game_val)

    for idx, game_state in enumerate(game_val.game_state_iterator()):
        encoded = game_state.encode_game_state()
        encoded['win_prob'] = predictions[idx] if win_prob_enabled else 0
        states.append(encoded)

    parsed_game['game_states'] = states

    ret = u''

    start_body = contents.find('<body>') + len('<body>')
    ret += contents[:start_body]
    ret += """
<div id="game-display"></div>
<script src="static/flot/jquery.js"></script>
<script src="static/game_viewer.js"></script>
<script src="static/flot/jquery.js"></script>
<script src="static/flot/jquery.flot.js"></script>
<script type="text/javascript">
        var game = %s;
        var card_list = %s;
        $(document).ready(DecorateGame);
</script>
""" % (json.dumps(parsed_game, indent=2), open('static/card_list.js',
                                               'r').read())
    contents = contents[start_body:]
    if debug > 2:
        ret += _pretty_format_html(parsed_game)
    if debug > 1:
        for turn in game_val.get_turns():
            ret += '%d %d %d %s %s<br>' % (turn.get_turn_no(), turn.get_player(
            ).TurnOrder(), turn.get_poss_no(), turn.turn_dict.get(
                'poss', False), turn.get_player().name())

    import cStringIO as StringIO
    output_buf = StringIO.StringIO()
    if not parse_game.check_game_sanity(game_val, output_buf):
        ret += 'Parsing error, data mismatch, '
        ret += '''<a href="game?game_id=%s&debug=1">be a hero, find the 
bug</a> and tell [email protected]<br>''' % game_id
        ret += output_buf.getvalue().replace('\n', '<br>\n')

    cur_turn_ind = 0

    split_turn_chunks = parse_game.split_turns(contents)
    ret += split_turn_chunks[0]
    split_turn_chunks.pop(0)

    for idx, (turn_chunk, game_state) in enumerate(
            itertools.izip(split_turn_chunks, game_val.game_state_iterator())):
        split_chunk = turn_chunk.split('\n')

        turn_id = game_state.turn_label()
        show_turn_id = game_state.turn_label(for_anchor=True)
        ret += '<div id="%s"></div>' % turn_id
        ret += '<a name="%s"></a><a href="#%s">%s</a>' % (
            show_turn_id, show_turn_id, split_chunk[0])

        if debug:
            ret += '<br>' + repr(game_val.get_turns()[cur_turn_ind]).replace(
                '\n', '<br>')
        cur_turn_ind += 1

        if idx != len(split_turn_chunks) - 1:
            ret += turn_chunk[turn_chunk.find('\n'):]
        else:
            before_end = turn_chunk.find('</html')
            ret += turn_chunk[turn_chunk.find('\n'):before_end]
            win_prob_graph = ''

            if win_prob_enabled:
                win_prob_graph = make_graph('win prob', 'win-prob-graph')
            ret += """
<div id="end-game"></div>
<table>
  %s
  %s
  %s
  %s
</table>
""" % (make_graph('score', 'score-graph'), make_graph(
                'money', 'money-graph'), win_prob_graph, get_goals(game_val))
            ret += '</div>&nbsp<br>\n' * 10
            ret += '</html>'
    return ret
Пример #6
0
class TestFrontendUsage(unittest.TestCase):
    outpost_game = game.Game(parse_game.parse_game( \
            open('testing/testdata/game-20101015-094051-95e0a59e.html', 'r').read()))

    def test_single_game_overall_stats(self):
        stats = count_buys.DeckBuyStats()
        count_buys.accum_buy_stats([self.outpost_game], stats)

        # Harem bought by both players
        cstats = stats[dominioncards.Harem]
        self.assertEquals(cstats.available.freq, 2)
        self.assertEquals(cstats.any_gained.freq, 2)

        # Salvager only bought by winner
        cstats = stats[dominioncards.Salvager]
        self.assertEquals(cstats.available.freq, 2)
        self.assertEquals(cstats.any_gained.freq, 1)

        # Potion only bought by loser
        cstats = stats[dominioncards.Potion]
        self.assertEquals(cstats.available.freq, 2)
        self.assertEquals(cstats.any_gained.freq, 1)

        # Outpost only bought by loser
        cstats = stats[dominioncards.Outpost]
        self.assertEquals(cstats.available.freq, 2)
        self.assertEquals(cstats.any_gained.freq, 1)

        # Workshop not bought by either player
        cstats = stats[dominioncards.Workshop]
        self.assertEquals(cstats.available.freq, 2)
        self.assertEquals(cstats.any_gained.freq, 0)

        # Chapel not present in this game
        cstats = stats[dominioncards.Chapel]
        self.assertEquals(cstats.available.freq, 0)
        self.assertEquals(cstats.any_gained.freq, 0)

    def test_single_game_winner_stats(self):
        stats = count_buys.DeckBuyStats()
        targ_name = 'moop'
        match_name = lambda g, name: name_merger.norm_name(name) == targ_name
        count_buys.accum_buy_stats([self.outpost_game], stats, match_name)
        count_buys.add_effectiveness(stats, stats)

        # Harem bought by both players
        cstats = stats[dominioncards.Harem]
        self.assertEquals(cstats.available.freq, 1)
        self.assertEquals(cstats.any_gained.freq, 1)
        self.assertEquals(cstats.effect_with().freq, 1)
        self.assertEquals(cstats.effect_without().freq, 0)
        self.assertEquals(cstats.effectiveness_gain.freq, 1)

        # Salvager only bought by winner
        cstats = stats[dominioncards.Salvager]
        self.assertEquals(cstats.available.freq, 1)
        self.assertEquals(cstats.any_gained.freq, 1)
        self.assertEquals(cstats.effect_with().freq, 1)
        self.assertEquals(cstats.effect_without().freq, 0)
        self.assertEquals(cstats.effectiveness_gain.freq, 1)

        # Potion only bought by loser
        cstats = stats[dominioncards.Potion]
        self.assertEquals(cstats.available.freq, 1)
        self.assertEquals(cstats.any_gained.freq, 0)
        self.assertEquals(cstats.effect_with().freq, 0)
        self.assertEquals(cstats.effect_without().freq, 1)
        self.assertEquals(cstats.effectiveness_gain.freq, 0)

        # Outpost only bought by loser
        cstats = stats[dominioncards.Outpost]
        self.assertEquals(cstats.available.freq, 1)
        self.assertEquals(cstats.any_gained.freq, 0)
        self.assertEquals(cstats.effect_with().freq, 0)
        self.assertEquals(cstats.effect_without().freq, 1)
        self.assertEquals(cstats.effectiveness_gain.freq, 0)

        # Workshop not bought by either player
        cstats = stats[dominioncards.Workshop]
        self.assertEquals(cstats.available.freq, 1)
        self.assertEquals(cstats.any_gained.freq, 0)
        self.assertEquals(cstats.effect_with().freq, 0)
        self.assertEquals(cstats.effect_without().freq, 1)
        self.assertEquals(cstats.effectiveness_gain.freq, 0)

        # Chapel not present in this game
        cstats = stats[dominioncards.Chapel]
        self.assertEquals(cstats.available.freq, 0)
        self.assertEquals(cstats.any_gained.freq, 0)
        self.assertEquals(cstats.effect_with().freq, 0)
        self.assertEquals(cstats.effect_without().freq, 0)
Пример #7
0
 def testParseGameWithReverseTurnOrder(self):
     parsed_game = parse_game.parse_game(ParseGameTest.EVIL_GAME_CONTENTS)
     self.assertEquals(parsed_game['decks'][0]['order'], 2)
     self.assertEquals(parsed_game['decks'][1]['order'], 1)
Пример #8
0
 def testParseGameWithEvilName(self):
     parsed_game = parse_game.parse_game(ParseGameTest.EVIL_GAME_CONTENTS)
     self.assertEquals(set(parsed_game['players']),
                       set(['8----------------------d', 'dcg']))
Пример #9
0
    def testParseGame(self):
        parsed_game = parse_game.parse_game(
            u"""<html><head><link rel="stylesheet" href="/dom/client.css"><title>Dominion Game #2083</title></head><body><pre>Alenia wins!
All <span class=card-victory>Provinces</span> are gone.

cards in supply: <span cardname="Coppersmith" class=card-none>Coppersmith</span>, <span cardname="Expand" class=card-none>Expand</span>, <span cardname="Gardens" class=card-victory>Gardens</span>, <span cardname="Mining Village" class=card-none>Mining Village</span>, <span cardname="Nobles" class=card-victory-action>Nobles</span>, <span cardname="Outpost" class=card-duration>Outpost</span>, <span cardname="Pearl Diver" class=card-none>Pearl Diver</span>, <span cardname="Thief" class=card-none>Thief</span>, <span cardname="Throne Room" class=card-none>Throne Room</span>, and <span cardname="Worker's Village" class=card-none>Worker's Village</span>

----------------------

<b>Alenia: 58 points</b> (8 <span class=card-victory>Provinces</span> and 5 <span class=card-victory-action>Nobles</span>); 24 turns
        opening: <span class=card-treasure>Silver</span> / <span class=card-none>Coppersmith</span>
        [37 cards] 5 <span class=card-victory-action>Nobles</span>, 3 <span class=card-none>Expands</span>, 3 <span class=card-none>Pearl Divers</span>, 3 <span class=card-none>Worker's Villages</span>, 1 <span class=card-duration>Outpost</span>, 1 <span class=card-none>Throne Room</span>, 5 <span class=card-treasure>Coppers</span>, 8 <span class=card-treasure>Silvers</span>, 8 <span class=card-victory>Provinces</span>

<b>AndMyAxe!: 30 points</b> (5 <span class=card-victory>Gardens</span> [46 cards], 7 <span class=card-victory>Estates</span>, and a <span class=card-victory>Duchy</span>); 23 turns
           opening: <span class=card-treasure>Silver</span> / <span class=card-none>Worker's Village</span>
           [46 cards] 6 <span class=card-none>Worker's Villages</span>, 5 <span class=card-victory>Gardens</span>, 1 <span class=card-none>Coppersmith</span>, 1 <span class=card-duration>Outpost</span>, 1 <span class=card-none>Throne Room</span>, 21 <span class=card-treasure>Coppers</span>, 3 <span class=card-treasure>Silvers</span>, 7 <span class=card-victory>Estates</span>, 1 <span class=card-victory>Duchy</span>

----------------------

trash: a <span class=card-treasure>Silver</span>, 3 <span class=card-victory>Gardens</span>, a <span class=card-victory>Duchy</span>, 3 <span class=card-victory>Estates</span>, 2 <span class=card-treasure>Coppers</span>, a <span class=card-none>Coppersmith</span>, and 3 <span class=card-none>Expands</span>
league game: no

<hr/><b>Game log</b>

Turn order is Alenia and then AndMyAxe!.

<span class=logonly>(Alenia's first hand: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>
<span class=logonly>(AndMyAxe!'s first hand: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 1 ---
Alenia plays 3 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-treasure>Silver</span>.
<span class=logonly>(Alenia draws: an <span class=card-victory>Estate</span> and 4 <span class=card-treasure>Coppers</span>.)</span>

   --- AndMyAxe!'s turn 1 ---
   AndMyAxe! plays 3 <span class=card-treasure>Coppers</span>.
   AndMyAxe! buys a <span class=card-treasure>Silver</span>.
   <span class=logonly>(AndMyAxe! draws: an <span class=card-victory>Estate</span> and 4 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 2 ---
Alenia plays 4 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-none>Coppersmith</span>.
(Alenia reshuffles.)
<span class=logonly>(Alenia draws: an <span class=card-victory>Estate</span>, a <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Coppers</span>, and a <span class=card-none>Coppersmith</span>.)</span>

   --- AndMyAxe!'s turn 2 ---
   AndMyAxe! plays 4 <span class=card-treasure>Coppers</span>.
   AndMyAxe! buys a <span class=card-none>Worker's Village</span>.
   (AndMyAxe! reshuffles.)
   <span class=logonly>(AndMyAxe! draws: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 3 ---
Alenia plays a <span class=card-none>Coppersmith</span>.
... making each <span class=card-treasure>Copper</span> worth $2.
Alenia plays a <span class=card-treasure>Silver</span> and 2 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-victory-action>Nobles</span>.
<span class=logonly>(Alenia draws: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

All <span class=card-victory>Provinces</span> are gone.
Alenia wins!
</pre></body></html>""")
        self.assertEquals(parsed_game['players'], ['alenia', 'andmyaxe!'])
        self.assertEquals(parsed_game['decks'][0]['name'], 'Alenia')
        self.assertEquals(parsed_game['decks'][0]['points'], 58)
        self.assertEquals(parsed_game['decks'][0]['order'], 1)
        self.assertEquals(parsed_game['decks'][1]['name'], 'AndMyAxe!')
        self.assertEquals(parsed_game['decks'][1]['order'], 2)
        self.assertEquals(len(parsed_game['decks'][0]['turns']), 3)
        self.assertEquals(len(parsed_game['decks'][1]['turns']), 2)

        self.assertEquals(parsed_game['decks'][0]['win_points'], 2.0)
        self.assertEquals(parsed_game['decks'][1]['win_points'], 0.0)

        self.assertEquals(parsed_game['decks'][0]['turns'][2]['plays'],
                          ['Coppersmith', 'Silver', 'Copper', 'Copper'])
        self.assertEquals(parsed_game['supply'], [
            "Coppersmith", "Expand", "Gardens", "Mining Village", "Nobles",
            "Outpost", "Pearl Diver", "Thief", "Throne Room",
            "Worker's Village"
        ])
Пример #10
0
 def testParseGameWithReverseTurnOrder(self):
     parsed_game = parse_game.parse_game(ParseGameTest.EVIL_GAME_CONTENTS)
     self.assertEquals(parsed_game['decks'][0]['order'], 2)
     self.assertEquals(parsed_game['decks'][1]['order'], 1)
Пример #11
0
 def testParseGameWithEvilName(self):
     parsed_game = parse_game.parse_game(ParseGameTest.EVIL_GAME_CONTENTS)
     self.assertEquals(set(parsed_game['players']), 
                       set(['8----------------------d', 'dcg']))
Пример #12
0
    def testParseGame(self):
        parsed_game = parse_game.parse_game(u"""<html><head><link rel="stylesheet" href="/dom/client.css"><title>Dominion Game #2083</title></head><body><pre>Alenia wins!
All <span class=card-victory>Provinces</span> are gone.

cards in supply: <span cardname="Coppersmith" class=card-none>Coppersmith</span>, <span cardname="Expand" class=card-none>Expand</span>, <span cardname="Gardens" class=card-victory>Gardens</span>, <span cardname="Mining Village" class=card-none>Mining Village</span>, <span cardname="Nobles" class=card-victory-action>Nobles</span>, <span cardname="Outpost" class=card-duration>Outpost</span>, <span cardname="Pearl Diver" class=card-none>Pearl Diver</span>, <span cardname="Thief" class=card-none>Thief</span>, <span cardname="Throne Room" class=card-none>Throne Room</span>, and <span cardname="Worker's Village" class=card-none>Worker's Village</span>

----------------------

<b>Alenia: 58 points</b> (8 <span class=card-victory>Provinces</span> and 5 <span class=card-victory-action>Nobles</span>); 24 turns
        opening: <span class=card-treasure>Silver</span> / <span class=card-none>Coppersmith</span>
        [37 cards] 5 <span class=card-victory-action>Nobles</span>, 3 <span class=card-none>Expands</span>, 3 <span class=card-none>Pearl Divers</span>, 3 <span class=card-none>Worker's Villages</span>, 1 <span class=card-duration>Outpost</span>, 1 <span class=card-none>Throne Room</span>, 5 <span class=card-treasure>Coppers</span>, 8 <span class=card-treasure>Silvers</span>, 8 <span class=card-victory>Provinces</span>

<b>AndMyAxe!: 30 points</b> (5 <span class=card-victory>Gardens</span> [46 cards], 7 <span class=card-victory>Estates</span>, and a <span class=card-victory>Duchy</span>); 23 turns
           opening: <span class=card-treasure>Silver</span> / <span class=card-none>Worker's Village</span>
           [46 cards] 6 <span class=card-none>Worker's Villages</span>, 5 <span class=card-victory>Gardens</span>, 1 <span class=card-none>Coppersmith</span>, 1 <span class=card-duration>Outpost</span>, 1 <span class=card-none>Throne Room</span>, 21 <span class=card-treasure>Coppers</span>, 3 <span class=card-treasure>Silvers</span>, 7 <span class=card-victory>Estates</span>, 1 <span class=card-victory>Duchy</span>

----------------------

trash: a <span class=card-treasure>Silver</span>, 3 <span class=card-victory>Gardens</span>, a <span class=card-victory>Duchy</span>, 3 <span class=card-victory>Estates</span>, 2 <span class=card-treasure>Coppers</span>, a <span class=card-none>Coppersmith</span>, and 3 <span class=card-none>Expands</span>
league game: no

<hr/><b>Game log</b>

Turn order is Alenia and then AndMyAxe!.

<span class=logonly>(Alenia's first hand: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>
<span class=logonly>(AndMyAxe!'s first hand: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 1 ---
Alenia plays 3 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-treasure>Silver</span>.
<span class=logonly>(Alenia draws: an <span class=card-victory>Estate</span> and 4 <span class=card-treasure>Coppers</span>.)</span>

   --- AndMyAxe!'s turn 1 ---
   AndMyAxe! plays 3 <span class=card-treasure>Coppers</span>.
   AndMyAxe! buys a <span class=card-treasure>Silver</span>.
   <span class=logonly>(AndMyAxe! draws: an <span class=card-victory>Estate</span> and 4 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 2 ---
Alenia plays 4 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-none>Coppersmith</span>.
(Alenia reshuffles.)
<span class=logonly>(Alenia draws: an <span class=card-victory>Estate</span>, a <span class=card-treasure>Silver</span>, 2 <span class=card-treasure>Coppers</span>, and a <span class=card-none>Coppersmith</span>.)</span>

   --- AndMyAxe!'s turn 2 ---
   AndMyAxe! plays 4 <span class=card-treasure>Coppers</span>.
   AndMyAxe! buys a <span class=card-none>Worker's Village</span>.
   (AndMyAxe! reshuffles.)
   <span class=logonly>(AndMyAxe! draws: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

--- Alenia's turn 3 ---
Alenia plays a <span class=card-none>Coppersmith</span>.
... making each <span class=card-treasure>Copper</span> worth $2.
Alenia plays a <span class=card-treasure>Silver</span> and 2 <span class=card-treasure>Coppers</span>.
Alenia buys a <span class=card-victory-action>Nobles</span>.
<span class=logonly>(Alenia draws: 2 <span class=card-victory>Estates</span> and 3 <span class=card-treasure>Coppers</span>.)</span>

All <span class=card-victory>Provinces</span> are gone.
Alenia wins!
</pre></body></html>""")
        self.assertEquals(parsed_game['players'], ['alenia', 'andmyaxe!'])
        self.assertEquals(parsed_game['decks'][0]['name'], 'Alenia')
        self.assertEquals(parsed_game['decks'][0]['points'], 58)
        self.assertEquals(parsed_game['decks'][0]['order'], 1)
        self.assertEquals(parsed_game['decks'][1]['name'], 'AndMyAxe!')
        self.assertEquals(parsed_game['decks'][1]['order'], 2)
        self.assertEquals(len(parsed_game['decks'][0]['turns']), 3)
        self.assertEquals(len(parsed_game['decks'][1]['turns']), 2)
        
        self.assertEquals(parsed_game['decks'][0]['win_points'], 2.0)
        self.assertEquals(parsed_game['decks'][1]['win_points'], 0.0)

        self.assertEquals(parsed_game['decks'][0]['turns'][2]['plays'], 
                          ['Coppersmith', 'Silver', 'Copper', 'Copper'])
        self.assertEquals(parsed_game['supply'],
                          ["Coppersmith", 
                           "Expand",
                           "Gardens",
                           "Mining Village",
                           "Nobles",
                           "Outpost",
                           "Pearl Diver",
                           "Thief", 
                           "Throne Room",
                           "Worker's Village"])
Пример #13
0
def get_test_game(game_id):
    """Return the parsed Game for the passed game id"""
    return game.Game(parse_game.parse_game( \
            codecs.open('testing/testdata/'+game_id, encoding='utf-8').read()))
Пример #14
0
def get_test_game(game_id):
    """Return the parsed Game for the passed game id"""
    return game.Game(parse_game.parse_game( \
            codecs.open('testing/testdata/'+game_id, encoding='utf-8').read()))
 def test_parse(self):
     """Testing that I can parse the game"""
     pgn = '1.e4 { [%clk 0:00:05] } e5 { [%clk 0:00:10] }'
     parsed = parse.parse_game(pgn)
     self.assertEqual(len(parsed), 2)
     self.assertEqual([s.time for s in parsed], [5, 10])