Ejemplo n.º 1
0
def test_FullGame_VillageWins():
    game = Game()
    manager = getInstance(game)
    print('game marshalling no players yet.')
    manager.printGameState()

    manager.transition(Actions.ADD_PLAYER, executor='1')
    manager.transition(Actions.ADD_PLAYER, executor='2')
    manager.transition(Actions.ADD_PLAYER, executor='3')
    manager.transition(Actions.ADD_PLAYER, executor='4')
    print('enough players have joined to start')
    manager.printGameState()

    manager.transition(Actions.START_GAME)
    manager = getInstance(game)
    print('game begins')
    manager.printGameState()

    mafia = [p for p in manager.gameState.players if p.role == Roles.MAFIA][0]
    to_kill = [
        p for p in manager.gameState.players
        if p.role == Roles.VILLAGER and p.state == PlayerStates.ALIVE
    ][0]
    manager.transition(Actions.MURDER, to_kill.id, mafia.id)
    manager = getInstance(game)
    print('the mafia has killed a villager')
    manager.printGameState()

    to_accuse = [
        p for p in manager.gameState.players
        if p.role == Roles.MAFIA and p.state == PlayerStates.ALIVE
    ][0]
    living_villagers = [
        p for p in manager.gameState.players
        if p.role == Roles.VILLAGER and p.state == PlayerStates.ALIVE
    ]
    accuser1, accuser2 = living_villagers[0], living_villagers[1]
    manager.transition(Actions.ACCUSE, to_accuse.id, accuser1.id)
    manager.transition(Actions.ACCUSE, to_accuse.id, accuser2.id)
    manager = getInstance(game)
    print('the villagers accuse a member of the mafia')
    manager.printGameState()

    manager.transition(Actions.GUILTY, executor='1')
    manager.transition(Actions.GUILTY, executor='2')
    manager.transition(Actions.GUILTY, executor='3')
    manager.transition(Actions.GUILTY, executor='4')
    print('the murderer has been executed')
    print(
        'game over village wins. organized crime has been purged from the town'
    )
    manager.printGameState()

    assert game.state == GameStates.GAME_OVER
Ejemplo n.º 2
0
def test_FullGame_MafiaWins():
    game = Game()
    manager = getInstance(game)
    print('game marshalling no players yet.')
    manager.printGameState()

    manager.transition(Actions.ADD_PLAYER, executor='1')
    manager.transition(Actions.ADD_PLAYER, executor='2')
    manager.transition(Actions.ADD_PLAYER, executor='3')
    manager.transition(Actions.ADD_PLAYER, executor='4')
    print('enough players have joined to start')
    manager.printGameState()

    manager.transition(Actions.START_GAME)
    print('game begins')
    manager.printGameState()
    manager = getInstance(game)

    mafia = [p for p in manager.gameState.players if p.role == Roles.MAFIA][0]
    to_kill = [
        p for p in manager.gameState.players
        if p.role == Roles.VILLAGER and p.state == PlayerStates.ALIVE
    ][0]
    manager.transition(Actions.MURDER, to_kill.id, mafia.id)
    print('the mafia has killed a villager')
    manager.printGameState()
    manager = getInstance(game)

    villagers = [
        p for p in manager.gameState.players
        if p.role == Roles.VILLAGER and p.state == PlayerStates.ALIVE
    ]
    to_accuse = villagers[0]
    accuser = villagers[1]
    manager.transition(Actions.ACCUSE, to_accuse.id, accuser.id)
    manager.transition(Actions.ACCUSE, to_accuse.id, mafia.id)
    print('the villagers accuse one of their own')
    manager.printGameState()
    manager = getInstance(game)

    manager.transition(Actions.GUILTY, executor='1')
    manager.transition(Actions.GUILTY, executor='2')
    manager.transition(Actions.GUILTY, executor='3')
    manager.transition(Actions.GUILTY, executor='4')
    print('an innocent man has died')
    print('game over mafia wins. they control the town')
    manager.printGameState()

    assert game.state == GameStates.GAME_OVER
Ejemplo n.º 3
0
def test_MultipleMafiaMembers_MustAgreeOnWhoToKill():
    player1 = createVillager('test1')
    player2 = createVillager('test2')
    mafia1 = createMafia('mafia1')
    mafia2 = createMafia('mafia2')
    state = Game()
    state.state = GameStates.NIGHT
    state.players = [player1, player2, createVillager(), createVillager(), mafia1, mafia2]
    systemUnderTest = getInstance(state)
    #mafia 1 wants to kill player 1
    systemUnderTest.transition(Actions.MURDER, player1.id, mafia1.id)

    assert state.state == GameStates.NIGHT
    assert player1.state == PlayerStates.ALIVE

    #mafia 2 wants to kill player 2
    systemUnderTest.transition(Actions.MURDER, player2.id, mafia2.id)

    assert state.state == GameStates.NIGHT
    assert player1.state == PlayerStates.ALIVE
    assert player2.state == PlayerStates.ALIVE

    #mafia 1 decides to agree and kill player2 instead
    systemUnderTest.transition(Actions.MURDER, player2.id, mafia1.id)

    assert state.state == GameStates.DAY
    assert player2.state == PlayerStates.DEAD
Ejemplo n.º 4
0
def test_GameStateMarshallingWithEnoughPlayers_GameStartAction_StateIsNight():
    state = Game()
    state.state = GameStates.MARSHALLING
    state.players = [Player(), Player(), Player(), Player()]
    systemUnderTest = getInstance(state)

    success = systemUnderTest.transition(Actions.START_GAME)

    assert state.state == GameStates.NIGHT
    assert success
Ejemplo n.º 5
0
def test_GameStateMarshalling_AddPlayerAction_PlayerAdded():
    state = Game()
    p_id = 'test'
    state.state = GameStates.MARSHALLING
    systemUnderTest = getInstance(state)

    success = systemUnderTest.transition(Actions.ADD_PLAYER, executor=p_id)

    assert p_id in [p.id for p in state.players]
    assert success
Ejemplo n.º 6
0
def test_GameStateMarshalling_AddPlayerWithDupeId_PlayerNotAdded():
    state = Game()
    p_id = 'test'
    state.state = GameStates.MARSHALLING
    systemUnderTest = getInstance(state)

    systemUnderTest.transition(Actions.ADD_PLAYER, p_id)
    success = systemUnderTest.transition(Actions.ADD_PLAYER, p_id)

    assert len(state.players) == 1
    assert not success
Ejemplo n.º 7
0
def test_GameStateMarshalling_RemovePlayerAction_PlayerRemoved():
    state = Game()
    state.state = GameStates.MARSHALLING
    systemUnderTest = getInstance(state)
    player = createVillager('test')
    state.players = [player]

    success = systemUnderTest.transition(Actions.REMOVE_PLAYER,
                                         executor=player.id)

    assert player not in state.players
    assert success
Ejemplo n.º 8
0
def test_GameStateNight_MurderAction_StateIsDayPlayerDead():
    player = createVillager('test')
    mafia = createMafia('mafia')
    state = Game()
    state.state = GameStates.NIGHT
    state.players = [player, createVillager(), createVillager(), mafia]
    systemUnderTest = getInstance(state)

    systemUnderTest.transition(Actions.MURDER, player.id, mafia.id)

    assert state.state == GameStates.DAY
    assert player.state == PlayerStates.DEAD
Ejemplo n.º 9
0
def test_GameStateNight_MurderResultsInVillagerCountEqualingMafia_StateIsGameOver():
    player = createVillager('test')
    mafia = createMafia('mafia')
    state = Game()
    state.state = GameStates.NIGHT
    state.players = [player, createVillager(), mafia]
    systemUnderTest = getInstance(state)

    systemUnderTest.transition(Actions.MURDER, player.id, mafia.id)

    assert state.state == GameStates.GAME_OVER
    assert player.state == PlayerStates.DEAD
Ejemplo n.º 10
0
def test_CanNotCastVoteIfOnTrial():
    state = Game()
    state.state = GameStates.TRIAL
    systemUnderTest = getInstance(state)
    mafia = createMafia('test')
    villager1 = createVillager('v1')
    villager2 = createVillager('v2')
    mafia.state = PlayerStates.ON_TRIAL
    state.players = [mafia, villager1, villager2]

    systemUnderTest.transition(Actions.GUILTY, executor=mafia.id)
    assert mafia.vote == None
Ejemplo n.º 11
0
def test_GameStateDay_OneAccuseAction_StateIsStillDay():
    state = Game()
    state.state = GameStates.DAY
    systemUnderTest = getInstance(state)
    accused = createVillager('test')
    p1 = createVillager('p1')
    p2 = createVillager('p2')
    state.players = [accused, p1, p2]

    systemUnderTest.transition(Actions.ACCUSE, accused.id, p1.id)

    assert state.state == GameStates.DAY
    assert accused.state == PlayerStates.ALIVE
Ejemplo n.º 12
0
def test_VillagerCanNotMurder():
    player1 = createVillager('test1')
    player2 = createVillager('test1')
    mafia = createMafia('mafia')
    state = Game()
    state.state = GameStates.NIGHT
    state.players = [player1, player2, mafia]
    systemUnderTest = getInstance(state)

    systemUnderTest.transition(Actions.MURDER, player2.id, player1.id)

    assert state.state == GameStates.NIGHT
    assert player2.state == PlayerStates.ALIVE
Ejemplo n.º 13
0
def test_DeadManCanNotAccuse():
    state = Game()
    state.state = GameStates.DAY
    systemUnderTest = getInstance(state)
    dead_player = createVillager('test')
    live_player = createVillager('v1')
    dead_player.state=PlayerStates.DEAD
    state.players = [dead_player, live_player]

    result = systemUnderTest.transition(Actions.ACCUSE, live_player.id, dead_player.id)

    assert state.state == GameStates.DAY
    assert result == False
Ejemplo n.º 14
0
def test_GameStateDay_TwoAccuseActions_StateIsTrialPlayerIsOnTrial():
    state = Game()
    state.state = GameStates.DAY
    systemUnderTest = getInstance(state)
    accused = createVillager('test')
    p1 = createVillager('p1')
    p2 = createVillager('p2')
    state.players = [accused, p1, p2]

    systemUnderTest.transition(Actions.ACCUSE, accused.id, p1.id)
    systemUnderTest.transition(Actions.ACCUSE, accused.id, p2.id)

    assert state.state == GameStates.TRIAL
    assert accused.state == PlayerStates.ON_TRIAL
Ejemplo n.º 15
0
def test_GameStateTrial_LastMafiaMemberFoundGuilty_StateIsGameOver():
    state = Game()
    state.state = GameStates.TRIAL
    systemUnderTest = getInstance(state)
    mafia = createMafia('test')
    villager1 = createVillager('v1')
    villager2 = createVillager('v2')
    mafia.state = PlayerStates.ON_TRIAL
    state.players = [mafia, villager1, villager2]

    systemUnderTest.transition(Actions.GUILTY, executor='v1')
    systemUnderTest.transition(Actions.GUILTY, executor='v2')

    assert state.state == GameStates.GAME_OVER
    assert mafia.state == PlayerStates.DEAD
Ejemplo n.º 16
0
def test_GameStateMarshallingWithEnoughPlayers_GameStartAction_PlayersAssignedRoles(
):
    num_players = random.randint(4, 10)
    expected_mafia = num_players // 3
    expected_villagers = num_players - expected_mafia
    state = Game()
    state.state = GameStates.MARSHALLING
    state.players = [Player() for x in range(num_players)]
    systemUnderTest = getInstance(state)

    systemUnderTest.transition(Actions.START_GAME)

    assert len([p for p in state.players
                if p.role == Roles.MAFIA]) == expected_mafia
    assert len([p for p in state.players
                if p.role == Roles.VILLAGER]) == expected_villagers
Ejemplo n.º 17
0
def test_GameStateTrial_FoundGuiltyAction_StateIsNightPlayerOnTrialIsDead():
    state = Game()
    state.state = GameStates.TRIAL
    systemUnderTest = getInstance(state)
    player = createVillager('test')
    villager1 = createVillager('v1')
    villager2 = createVillager('v2')
    mafia = createMafia('m')
    player.state = PlayerStates.ON_TRIAL
    state.players = [player, villager2, villager1, mafia]

    systemUnderTest.transition(Actions.NOT_GUILTY, executor='v1')
    systemUnderTest.transition(Actions.GUILTY, executor='v2')
    systemUnderTest.transition(Actions.GUILTY, executor='m')

    assert state.state == GameStates.NIGHT
    assert player.state == PlayerStates.DEAD
Ejemplo n.º 18
0
def test_GameStateTrial_FoundNotGuiltyAction_StateIsDayPlayerOnTrialIsAlive():
    state = Game()
    state.state = GameStates.TRIAL
    systemUnderTest = getInstance(state)
    player = createVillager('test')
    villager1 = createVillager('v1')
    villager2 = createVillager('v2')
    villager3 = createVillager('v3')
    villager3.state = PlayerStates.DEAD
    mafia = createMafia('m')
    player.state = PlayerStates.ON_TRIAL
    state.players = [player, villager2, villager1, mafia, villager3]

    systemUnderTest.transition(Actions.GUILTY, executor='m')
    assert state.state == GameStates.TRIAL
    systemUnderTest.transition(Actions.NOT_GUILTY, executor='v1')
    assert state.state == GameStates.TRIAL
    systemUnderTest.transition(Actions.NOT_GUILTY, executor='v2')

    assert state.state == GameStates.DAY
    assert player.state == PlayerStates.ALIVE
Ejemplo n.º 19
0
def lambda_handler(event, context):
    print(f"Received event:\n{json.dumps(event)}\nWith context:\n{context}")
    gameRepo = GameStateRepo()

    game_id, channel_id, action, player_id, target_id = extractParameters(
        event)
    if action == HELP:
        response = {
            'statusCode':
            200,
            'headers': {},
            'body':
            json.dumps({
                'response_type': 'ephemeral',
                'text': get_help_message()
            }),
            'isBase64Encoded':
            False
        }
    elif action == NEW_GAME:
        state = gameRepo.CreateNewGame(game_id, {'channel_id': channel_id})
        if state == None:
            response_type = 'ephemeral'
            message = json.dumps('Game already exists.')
        else:
            response_type = 'in_channel'
            message = json.dumps(
                'A new game of mafia is about to start. type /mafia join to get in on the action.'
            )
        response = {
            'statusCode':
            200,
            'headers': {},
            'body':
            json.dumps({
                'response_type': response_type,
                'text': message,
                'game_id': game_id
            }),
            'isBase64Encoded':
            False
        }
    else:
        gameState = gameRepo.GetGameState(game_id)
        if gameState == None:
            return None
        manager = getInstance(gameState)
        success = manager.transition(action,
                                     executor=player_id,
                                     data=target_id)
        response_type = 'ephemeral'
        if success:
            updateSlack(gameRepo._serializeGame(gameState), action, player_id,
                        target_id)
            response_text = 'Got it!'
        else:
            response_text = get_state_change_message(gameState, False, action,
                                                     player_id, target_id)
        print(f'Response message: {response_text}')
        gameRepo.UpdateGame(gameState)
        response = {
            'statusCode':
            200,
            'headers': {},
            'body':
            json.dumps({
                'response_type': response_type,
                'text': response_text,
                'game_id': game_id
            }),
            'isBase64Encoded':
            False
        }
    return response