bang/backend/tests/character_test.py
2021-08-20 11:36:26 +03:00

367 lines
13 KiB
Python

from random import randint
from bang.characters import *
from tests.dummy_socket import DummySocket
from bang.deck import Deck
from bang.game import Game
from bang.players import Player, PendingAction
from bang.cards import *
def test_bartcassidy():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), BartCassidy()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if isinstance(g.players[g.turn].character, BartCassidy):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[(g.turn+1)%2].hand = []
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0)]
assert len(g.players[(g.turn+1)%2].hand) == 0
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert len(g.players[(g.turn+1)%2].hand) == 1
def test_blackjack():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(1)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [BlackJack()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
g.players[g.turn].hand = []
g.deck.cards.insert(1, Bang(Suit.HEARTS, 1))
g.players[g.turn].draw('')
assert len(g.players[g.turn].hand) == 3
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.deck.cards.insert(1, Bang(Suit.CLUBS, 1))
g.players[g.turn].draw('')
assert len(g.players[g.turn].hand) == 2
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.deck.cards.insert(1, Bang(Suit.DIAMONDS, 1))
g.players[g.turn].draw('')
assert len(g.players[g.turn].hand) == 3
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.deck.cards.insert(1, Bang(Suit.SPADES, 1))
g.players[g.turn].draw('')
assert len(g.players[g.turn].hand) == 2
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
def test_calamityjanet():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), CalamityJanet()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if isinstance(g.players[g.turn].character, CalamityJanet):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[(g.turn+1)%2].hand = [Bang(0,0)]
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0)]
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND
g.players[(g.turn+1)%2].respond(0)
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
g.players[g.turn].hand = [Mancato(0,0)]
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].lives == 1
def test_ElGringo():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), ElGringo()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if isinstance(g.players[g.turn].character, ElGringo):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[(g.turn+1)%2].hand = []
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0), Bang(0,0)]
assert len(g.players[(g.turn+1)%2].hand) == 0
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert len(g.players[(g.turn+1)%2].hand) == 1
assert len(g.players[g.turn].hand) == 0
def test_JesseJones():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), JesseJones()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, JesseJones):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[(g.turn+1)%2].hand = [Bang(0,0)]
g.players[g.turn].draw('p1' if g.turn == 0 else 'p0')
g.players[g.turn].hand = [Bang(0,0), Bang(0,0)]
assert len(g.players[(g.turn+1)%2].hand) == 0
assert len(g.players[g.turn].hand) == 2
def test_Jourdonnais():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), Jourdonnais()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if isinstance(g.players[g.turn].character, Jourdonnais):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0)]
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].pending_action == PendingAction.PICK
def test_KitCarlson():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), KitCarlson()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, KitCarlson):
g.players[g.turn].draw('')
g.players[g.turn].hand = [Mancato(0,0)]
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
assert g.players[g.turn].pending_action == PendingAction.CHOOSE
assert len(g.players[g.turn].available_cards) == 3
g.players[g.turn].choose(0)
assert len(g.players[g.turn].available_cards) == 2
g.players[g.turn].choose(1)
assert g.players[g.turn].pending_action == PendingAction.PLAY
def test_LuckyDuke():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [LuckyDuke(), LuckyDuke()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
g.players[0].equipment = [Prigione(0,0)]
g.players[1].equipment = [Prigione(0,0)]
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
assert g.players[g.turn].pending_action == PendingAction.PICK
g.deck.cards.insert(0, Bang(Suit.SPADES,0))
g.deck.cards.insert(1, Bang(Suit.HEARTS,0))
g.players[g.turn].pick()
assert g.players[g.turn].pending_action == PendingAction.DRAW
def test_PaulRegret():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), PaulRegret()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
pls = g.get_visible_players(g.players[0])
assert len(pls) == 1
assert pls[0]['name'] == g.players[1].name
assert pls[0]['dist'] > g.players[0].get_sight()
def test_PedroRamirez():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), PedroRamirez()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, PedroRamirez):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.deck.scrap_pile.append(Bang(0,0))
g.players[g.turn].hand = []
g.players[g.turn].draw('scrap')
assert len(g.players[g.turn].hand) == 2
assert g.players[g.turn].hand[0].number == 0
assert g.players[g.turn].hand[0].suit == 0
assert isinstance(g.players[g.turn].hand[0], Bang)
def test_RoseDoolan():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 2), RoseDoolan()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
g.players[0].equipment = [Mustang(0,0)]
g.players[0].notify_self()
pls = g.get_visible_players(g.players[1])
print(pls)
assert len(pls) == 1
assert pls[0]['name'] != g.players[1].name
assert pls[0]['dist'] <= g.players[1].get_sight()
def test_SidKetchum():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), SidKetchum()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, SidKetchum):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
g.players[g.turn].lives = 1
g.players[g.turn].scrap(0)
assert g.players[g.turn].lives == 1
g.players[g.turn].scrap(0)
assert g.players[g.turn].lives == 2
def test_SlabTheKiller():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), SlabTheKiller()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, SlabTheKiller):
g.players[g.turn].draw('')
g.players[g.turn].hand = [Mancato(0,0)]
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0)]
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND
g.players[(g.turn+1)%2].respond(0)
assert g.players[(g.turn+1)%2].pending_action == PendingAction.RESPOND
g.players[(g.turn+1)%2].respond(-1)
assert g.players[(g.turn+1)%2].pending_action == PendingAction.WAIT
assert g.players[(g.turn+1)%2].lives == 3
def test_SuzyLafayette():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), SuzyLafayette()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
g.players[1].hand = []
assert len(g.players[1].hand) == 0
g.players[1].notify_self()
assert len(g.players[1].hand) == 1
g.players[g.turn].end_turn()
def test_VultureSam():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(3)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), Character('test_char', 4), VultureSam()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if isinstance(g.players[g.turn].character, VultureSam):
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0), Bang(0,0), Bang(0,0), Bang(0,0)]
g.players[g.turn].end_turn()
while not isinstance(g.players[g.turn].character, VultureSam):
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0), Bang(0,0), Bang(0,0), Bang(0,0)]
g.players[g.turn].lives = 0
g.players[g.turn].notify_self()
assert len(g.players[2].hand) == 8
return
def test_WillyTheKid():
sio = DummySocket()
g = Game('test', sio)
ps = [Player(f'p{i}', f'p{i}', sio) for i in range(2)]
for p in ps:
g.add_player(p)
g.start_game()
test_chars = [Character('test_char', 4), WillyTheKid()]
for p in ps:
p.available_characters = [test_chars.pop(0)]
p.set_character(p.available_characters[0].name)
if not isinstance(g.players[g.turn].character, WillyTheKid):
g.players[g.turn].draw('')
g.players[g.turn].hand = []
g.players[g.turn].end_turn()
g.players[g.turn].draw('')
g.players[g.turn].hand = [Bang(0,0), Bang(0,0), Bang(0,0)]
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].lives == 3
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].lives == 2
g.players[g.turn].play_card(0, g.players[(g.turn+1)%2].name)
assert g.players[(g.turn+1)%2].lives == 1