def test_get_critter_moves():
    crit0Mock = mock.Mock()
    crit0Mock.get_move_list.return_value = 'move list'
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [crit0Mock, None, None, None])
    assert battleInfo.get_critter_moves(0) == 'move list'
    assert battleInfo.get_critter_moves(1) == None
def test_do_ai_enter():
    aiMock = mock.Mock()
    aiMock.do_switch.return_value = []
    battleInfo = battle.BattleInfo('fighter', aiMock,
                                   [None, None, 'crit2', 'crit3'])
    battleInfo.do_ai_enter()
    assert battleInfo.critters == [None, None, 'crit2', 'crit3']

    battleInfo.critters = [None, None, 'crit2', None]
    battleInfo.do_ai_enter()
    assert battleInfo.critters == [None, None, 'crit2', None]

    aiMock.do_switch.return_value = ['crit2']
    battleInfo.critters = ['crit0', None, None, 'crit3']
    battleInfo.do_ai_enter()
    assert battleInfo.critters == ['crit0', None, 'crit2', 'crit3']

    battleInfo.critters = [None, 'crit1', None, None]
    battleInfo.do_ai_enter()
    assert battleInfo.critters == [None, 'crit1', 'crit2', None]

    battleInfo.critters = [None, None, None, None]
    aiMock.do_switch.return_value = ['crit2', 'crit3']
    battleInfo.do_ai_enter()
    assert battleInfo.critters == [None, None, 'crit2', 'crit3']
def test_valid_critter_info():
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   ['crit0', None, None, 'crit3'])
    assert battleInfo.valid_critter(0) == True
    assert battleInfo.valid_critter(1) == False
    assert battleInfo.valid_critter(2) == False
    assert battleInfo.valid_critter(3) == True
    assert battleInfo.valid_critter(4) == False  # out of bounds
def test_get_defender():
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   ['crit0', None, 'crit2', None])
    assert battleInfo.get_defender(0, 2) == 2
    assert battleInfo.get_defender(0, 1) == 1
    assert battleInfo.get_defender(0, 3) == 2
    assert battleInfo.get_defender(2, 1) == 0
    assert battleInfo.get_defender(2, 3) == 3
def test_get_critter_hps():
    crit0Mock = mock.Mock()
    crit0Mock.currenthp = 30
    crit2Mock = mock.Mock()
    crit2Mock.currenthp = 40
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [crit0Mock, None, crit2Mock, None])
    assert battleInfo.get_critter_hps() == ['30', '', '40', '']
def test_get_critter_names():
    crit0Mock = mock.Mock()
    crit0Mock.name = 'crit0'
    crit3Mock = mock.Mock()
    crit3Mock.name = 'crit3'
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [crit0Mock, None, None, crit3Mock])
    assert battleInfo.get_critter_names() == ['crit0', '', '', 'crit3']
def test_is_attacking_enemy():
    battleInfo = battle.BattleInfo('fighter', 'ai', [])
    assert battleInfo.is_attacking_enemy(0, 1) == False
    assert battleInfo.is_attacking_enemy(0, 2) == True
    assert battleInfo.is_attacking_enemy(1, 0) == False
    assert battleInfo.is_attacking_enemy(1, 3) == True
    assert battleInfo.is_attacking_enemy(2, 0) == True
    assert battleInfo.is_attacking_enemy(2, 3) == False
    assert battleInfo.is_attacking_enemy(3, 1) == True
    assert battleInfo.is_attacking_enemy(3, 2) == False
def test_get_targets():
    crit1Mock = mock.Mock()
    crit1Mock.name = 'crit1'
    crit2Mock = mock.Mock()
    crit2Mock.name = 'crit2'
    crit3Mock = mock.Mock()
    crit3Mock.name = 'crit3'
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [None, crit1Mock, crit2Mock, crit3Mock])
    assert battleInfo.get_targets(1) == ['', '', 'crit2', 'crit3']
def test_get_critter_spd_order(randomMock):
    crit1Mock = mock.Mock()
    crit1Mock.get_speed.return_value = 40
    crit2Mock = mock.Mock()
    crit2Mock.get_speed.return_value = 40
    crit3Mock = mock.Mock()
    crit3Mock.get_speed.return_value = 50
    randomMock.side_effect = [0.1, 0.2, 0.6]
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [None, crit1Mock, crit2Mock, crit3Mock])
    assert battleInfo.get_critter_spd_order() == \
        [crit3Mock, crit2Mock, crit1Mock]
def test_eligible_critter():
    crit0Mock = mock.Mock()
    crit0Mock.name = 'sameName'
    crit0Mock.dead = False
    crit1Mock = mock.Mock()
    crit1Mock.name = 'sameName'
    crit1Mock.dead = False
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   [None, crit1Mock, None, None])
    assert battleInfo.eligible_critter(crit1Mock) == False
    assert battleInfo.eligible_critter(crit0Mock) == True
    crit0Mock.dead = True
    assert battleInfo.eligible_critter(crit0Mock) == False
def test_enter_is_possible():
    crit0Mock = mock.Mock()
    crit0Mock.dead = False
    crit1Mock = mock.Mock()
    crit1Mock.dead = False
    fighterMock = mock.Mock()
    fighterMock.critters = [crit0Mock]
    battleInfo = battle.BattleInfo(fighterMock, 'ai',
                                   [crit0Mock, None, None, None])
    assert battleInfo.enter_is_possible() == False
    fighterMock.critters.append(crit1Mock)
    assert battleInfo.enter_is_possible() == True
    battleInfo.critters[1] = crit1Mock
    assert battleInfo.enter_is_possible() == False
def test_vaild_switch_info():
    critMocks = []
    for i in range(4):
        critMocks.append(mock.Mock())
        critMocks[-1].dead = False
    fighterMock = mock.Mock()
    fighterMock.critters = critMocks
    battleInfo = battle.BattleInfo(
        fighterMock, 'ai', [critMocks[1], critMocks[3], None, 'aicrit0'])
    assert battleInfo.valid_switch(0, 0) == True
    assert battleInfo.valid_switch(1, 1) == True
    assert battleInfo.valid_switch(0, 2) == False
    with pytest.raises(Exception):
        battleInfo.valid_switch(2, 0)
def test_get_ordered_turns(randomMock):
    crit0Mock = mock.Mock()
    crit0Mock.get_speed.return_value = 50
    crit1Mock = mock.Mock()
    crit1Mock.get_speed.return_value = 70
    crit2Mock = mock.Mock()
    crit2Mock.get_speed.return_value = 30
    crit3Mock = mock.Mock()
    crit3Mock.get_speed.return_value = 50
    actions = [(0, 2, 'bite'), (1, 0, -1), (2, 0, 'growl'), (3, 0, 'tackle')]
    randomMock.side_effect = [0.1, 0.6, 0.2, 0.8]
    battleInfo = battle.BattleInfo(
        'fighter', 'ai', [crit0Mock, crit1Mock, crit2Mock, crit3Mock])
    assert battleInfo.get_ordered_turns(actions) == \
        [(1, 0, -1), (3, 0, 'tackle'), (0, 2, 'bite'), (2, 0, 'growl')]
def test_determine_winner():
    fighterMock = mock.Mock()
    aiMock = mock.Mock()
    battleInfo = battle.BattleInfo(fighterMock, aiMock, [])
    fighterMock.has_playable_critters.return_value = True
    aiMock.has_playable_critters.return_vale = True
    assert battleInfo.determine_winner() == None

    fighterMock.has_playable_critters.return_value = False
    assert battleInfo.determine_winner() == 'ai'

    aiMock.has_playable_critters.return_value = False
    assert battleInfo.determine_winner() == 'both'

    fighterMock.has_playable_critters.return_value = True
    assert battleInfo.determine_winner() == 'fighter'
def test_perform_switch():
    critMocks = []
    for i in range(3):
        critMocks.append(mock.Mock())
        critMocks[i].dead = False
        critMocks[i].name = 'crit{}'.format(i)
    fighterMock = mock.Mock()
    fighterMock.critters = [critMocks[0], critMocks[1], critMocks[2]]
    battleInfo = battle.BattleInfo(fighterMock, 'ai',
                                   [critMocks[0], None, 'aicrit0', None])
    battleInfo.perform_switch(0, 1)
    assert battleInfo.critters == [critMocks[2], None, 'aicrit0', None]

    with pytest.raises(Exception):
        battleInfo.perform_switch(1, 0)

    with pytest.raises(Exception):
        assert battleInfo.perform_switch(0, 2)
def test_critter_switch_options():
    critMocks = []
    for i in range(5):
        critMocks.append(mock.Mock())
        critMocks[-1].dead = False
    fighterMock = mock.Mock()
    fighterMock.critters = [
        critMocks[0], critMocks[1], critMocks[2], critMocks[3], critMocks[4]
    ]
    battleInfo = battle.BattleInfo(
        fighterMock, 'ai', [critMocks[2], critMocks[0], 'aiCrit0', 'aiCrit1'])
    assert battleInfo.critter_switch_options() == [
        critMocks[1], critMocks[3], critMocks[4]
    ]

    fighterMock.critters = [critMocks[0], critMocks[2]]
    assert battleInfo.critter_switch_options() == []

    fighterMock.critters = []
    assert battleInfo.critter_switch_options() == []
def test_perform_enter():
    critMocks = []
    for i in range(4):
        critMocks.append(mock.Mock())
        critMocks[i].dead = False
    fighterMock = mock.Mock()
    fighterMock.critters = critMocks
    battleInfo = battle.BattleInfo(fighterMock, 'ai',
                                   [None, None, 'ai0', 'ai1'])
    battleInfo.perform_enter(0)
    assert battleInfo.critters == [critMocks[0], None, 'ai0', 'ai1']

    battleInfo.perform_enter(4)
    assert battleInfo.critters == [critMocks[0], None, 'ai0', 'ai1']

    battleInfo.perform_enter(2)
    assert battleInfo.critters == [critMocks[0], critMocks[3], 'ai0', 'ai1']

    with pytest.raises(Exception):
        battleInfo.perform_enter(1)
def test_execute_action():
    critMocks = []
    for i in range(4):
        critMocks.append(mock.Mock())
        critMocks[-1].dead = False
    fighterMock = mock.Mock()
    fighterMock.critters = [critMocks[0], critMocks[1], critMocks[3]]
    battleInfo = battle.BattleInfo(
        fighterMock, 'ai', [critMocks[0], critMocks[3], critMocks[2], None])
    battleInfo.execute_action((1, 0, -1))
    assert battleInfo.critters == [
        critMocks[0], critMocks[1], critMocks[2], None
    ]

    critMocks[0].attack.return_value = 'attack info'
    critMocks[2].defend.return_value = ['info0', 'info1']
    critMocks[2].dead = True
    assert len(battleInfo.execute_action((0, 3, 'move'))) == 3
    critMocks[0].attack.assert_called_with('move')
    critMocks[2].defend.assert_called_with('attack info')
    assert battleInfo.critters == [critMocks[0], critMocks[1], None, None]
def test_battle_info_init():
    battleInfo = battle.BattleInfo('fighter', 'ai', 'crits')
    assert battleInfo.fighter == 'fighter'
    assert battleInfo.aiFighter == 'ai'
    assert battleInfo.critters == 'crits'
def test_critter_leave():
    battleInfo = battle.BattleInfo('fighter', 'ai',
                                   ['crit0', 'crit1', 'crit2', 'crit3'])
    battleInfo.critter_leave(2)
    assert battleInfo.critters == ['crit0', 'crit1', None, 'crit3']
def test_switch_defender():
    battleInfo = battle.BattleInfo('fighter', 'ai', [])
    assert battleInfo.switch_defender(0) == 1
    assert battleInfo.switch_defender(1) == 0
    assert battleInfo.switch_defender(2) == 3
    assert battleInfo.switch_defender(3) == 2