Esempio n. 1
0
    def test_diagonal_win_conditions_for_connect_quatro_board(self):
        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [self.player1.id, None, None, None, None, None,
                 None],  # 4/4 in a row
                [None, self.player1.id, None, None, None, None, None],  #
                [None, None, self.player1.id, None, None, None, None],  #
                [None, None, None, self.player1.id, None, None, None],  #
            ]
        })
        self.board.save()
        self.game.archived_players.set([self.player1, self.player2])
        self.assertEqual(cq_lib.get_winning_player(self.board), self.player1)

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None, None, None, None, None, None,
                 self.player2.id],  # 4/4 in a row
                [None, None, None, None, None, self.player2.id, None],  #
                [None, None, None, None, self.player2.id, None, None],  #
                [None, None, None, self.player2.id, None, None, None],  #
            ]
        })
        self.board.save()
        self.assertEqual(cq_lib.get_winning_player(self.board), self.player2)
Esempio n. 2
0
    def test_turn_timeout_task_starts_when_player_makes_non_winning_move(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertEqual(
            len(self.mock_cycle_player_turn_if_inactive.call_args_list), 1)
        self.assertEqual(
            self.mock_cycle_player_turn_if_inactive.call_args_list[0][0][0],
            game.id)
Esempio n. 3
0
    def test_game_feed_message_is_created_when_player_makes_a_move(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.assertEqual(GameFeedMessage.objects.count(), 0)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertEqual(GameFeedMessage.objects.count(), 1)
        gfm = GameFeedMessage.objects.first()
        self.assertEqual(gfm.game, game)
        self.assertEqual(gfm.message_type,
                         GameFeedMessage.MESSAGE_TYPE_PLAYER_MOVE_DROP_CHIP)
        self.mock_push_new_game_feed_message.assert_called_once_with(gfm)
Esempio n. 4
0
    def test_cycle_player_turn_if_inactive_creates_game_feed_message(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT, name="fooo",
            is_started=True, is_over=False, max_players=2)
        self.player1.game = game
        self.player1.turn_order = 1
        self.player2.game = game
        self.player2.turn_order = 2
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:self.player1.id,
            Board.STATE_KEY_BOARD_LIST:[[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(
            game=game, board_state=board_state, board_length_x=7, board_length_y=7)
        
        self.assertEqual(GameFeedMessage.objects.count(), 0)

        # Run the task
        cq_tasks.cycle_player_turn_if_inactive(
            game.id, self.player1.id, 0)

        self.assertEqual(GameFeedMessage.objects.count(), 1)
        gfm = GameFeedMessage.objects.first()
        self.assertEqual(gfm.game, game)
        self.assertEqual(gfm.message_type, GameFeedMessage.MESSAGE_TYPE_GAME_STATUS)
        self.mock_push_new_game_feed_message.assert_called_once_with(gfm)
        self.mock_alert_game_players_to_new_move.assert_called_once()
Esempio n. 5
0
    def test_active_player_and_game_tick_count_cycles_after_each_move(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player3.game = game
        self.player1.turn_order = 2
        self.player2.turn_order = 3
        self.player3.turn_order = 1
        self.player1.save()
        self.player2.save()
        self.player3.save()
        game.archived_players.set([self.player1, self.player2, self.player3])

        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player3.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        url = reverse('api-connectquat-move')
        data = {'column_index': 0}

        self.client.login(username='******', password='******')
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        board.refresh_from_db()
        game.refresh_from_db()
        board_state = cq_lib.board_state_to_obj(board)
        self.assertEqual(board_state[Board.STATE_KEY_NEXT_PLAYER_TO_ACT],
                         self.player1.id)
        self.assertEqual(game.tick_count, 1)

        self.client.login(username='******', password='******')
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        board.refresh_from_db()
        game.refresh_from_db()
        board_state = cq_lib.board_state_to_obj(board)
        self.assertEqual(board_state[Board.STATE_KEY_NEXT_PLAYER_TO_ACT],
                         self.player2.id)
        self.assertEqual(game.tick_count, 2)

        self.client.login(username='******', password='******')
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        board.refresh_from_db()
        game.refresh_from_db()
        board_state = cq_lib.board_state_to_obj(board)
        self.assertEqual(board_state[Board.STATE_KEY_NEXT_PLAYER_TO_ACT],
                         self.player3.id)
        self.assertEqual(game.tick_count, 3)
Esempio n. 6
0
    def setUp(self):
        self.game = Game.objects.create(
            name="foobar",
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            is_started=True,
            max_players=2)
        self.board = Board.objects.create(game=self.game,
                                          max_to_win=4,
                                          board_length_x=7,
                                          board_length_y=7)

        self.user1 = User.objects.create_user('*****@*****.**',
                                              password='******')
        self.player1 = Player.objects.create(user=self.user1,
                                             handle="foobar",
                                             game=self.game)
        self.user2 = User.objects.create_user('*****@*****.**',
                                              password='******')
        self.player2 = Player.objects.create(user=self.user2,
                                             handle="foobar",
                                             game=self.game)

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
Esempio n. 7
0
 def test_cycle_player_turn_if_inactive_updates_active_player(self):
     game = Game.objects.create(
         game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT, name="fooo",
         is_started=True, is_over=False, max_players=2)
     self.player1.game = game
     self.player1.turn_order = 1
     self.player2.game = game
     self.player2.turn_order = 2
     self.player1.save()
     self.player2.save()
     board_state = cq_lib.board_obj_to_serialized_state({
         Board.STATE_KEY_NEXT_PLAYER_TO_ACT:self.player1.id,
         Board.STATE_KEY_BOARD_LIST:[[None for i in range(7)] for j in range(7)]
     })
     board = Board.objects.create(
         game=game, board_state=board_state, board_length_x=7, board_length_y=7)
     
     # Run the task
     cq_tasks.cycle_player_turn_if_inactive(
         game.id, self.player1.id, 0)
     
     game.refresh_from_db()
     board.refresh_from_db()
     active_player_id = cq_lib.get_active_player_id_from_board(board)
     self.assertEqual(active_player_id, self.player2.id)
Esempio n. 8
0
    def test_player_cant_drop_chip_into_column_off_the_board(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 8}  # this column doesnt exist
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertTrue("illegal move" in response.data)
        self.mock_alert_game_players_to_new_move.assert_not_called()
Esempio n. 9
0
    def test_player_cant_drop_chip_into_a_full_column(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()

        # Create board, where column 3 is completely filled with alternating chips.
        board_list = [[None for i in range(7)] for j in range(7)]
        for row_ix, row in enumerate(board_list):
            board_list[row_ix][
                3] = self.player1.id if row_ix % 2 else self.player2.id

        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            board_list
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertTrue("illegal move" in response.data)
        self.mock_alert_game_players_to_new_move.assert_not_called()
Esempio n. 10
0
    def test_player_can_win_game_by_getting_4_in_a_row(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        game.archived_players.set([self.player1, self.player2])
        p1 = self.player1.id
        p2 = self.player2.id
        board_list = [
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, p1, p2, None, None, None],
            [None, p1, p2, p2, None, None, None],
            [p1, p2, p2, p2, None, None, None],
        ]
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            board_list
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7,
                                     max_to_win=4)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertTrue(response.data['game_over'])
        self.assertTrue(response.data['winner'], {
            'handle': self.player1.slug,
            'slug': self.player2.slug
        })

        alert_game_players_calls = self.mock_alert_game_players_to_new_move.call_args_list
        self.assertEqual(len(alert_game_players_calls), 1)

        self.assertEqual(alert_game_players_calls[0][0][0], game)
        passed_game_state = alert_game_players_calls[0][0][1]
        self.assertEqual(passed_game_state['winner'], {
            'handle': self.player1.handle,
            'slug': self.player1.slug
        })
        self.assertTrue(passed_game_state['game_over'])
        self.assertIsNotNone(game.completedgame)
        self.assertEqual(game.completedgame.winners.count(), 1)
        self.assertEqual(game.completedgame.winners.first(), self.player1)
Esempio n. 11
0
    def test_player_can_leave_a_started_connect_quatrogame_only_1_player_left(self):
        """ Test player can leave a started game that will only have 1 players leftover.
        """
        self.user2 = User.objects.create_user('*****@*****.**', password='******')
        self.player2 = Player.objects.create(user=self.user2, handle="duuude")


        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT, name="foo", max_players=3,
            is_started=True, is_over=False)
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:self.player1.id,
            Board.STATE_KEY_BOARD_LIST:[[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game, board_state=board_state)
        game_id = game.id
        self.player1.game = game
        self.player2.game = game
        self.player1.save(update_fields=['game'])
        self.player2.save(update_fields=['game'])
        self.assertEqual(game.players.count(), 2)

        self.client.login(username='******', password='******')
        url = reverse('api-lobby-leave')
        response = self.client.post(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        game.refresh_from_db()
        self.player1.refresh_from_db()
        self.assertTrue(Game.objects.filter(id=game_id).exists())
        self.assertTrue(game.is_over)
        self.assertTrue(self.player1 not in game.players.all())
        self.assertTrue(self.player2 in game.players.all())
        self.assertEqual(game.players.count(), 1)

        self.mock_push_player_quit_game_event.assert_not_called()
        self.mock_update_lobby_list_player_count.assert_not_called()
        self.mock_update_lobby_list_remove_game.assert_not_called()
        self.mock_update_lobby_list_add_connect_quatro.assert_not_called()

        self.mock_cycle_player_turn_if_inactive.assert_not_called()

        calls = self.mock_alert_game_players_to_new_move.call_args_list
        self.assertEqual(len(calls), 1)
        self.assertEqual(calls[0][0][0], game)

        passed_game_state = calls[0][0][1]
        self.assertTrue(passed_game_state['game_over'])
        self.assertEqual(
            passed_game_state['winner'],
            {'slug':self.player2.slug, 'handle':self.player2.handle})

        self.assertIsNotNone(game.completedgame)
        self.assertEqual(game.completedgame.winners.count(), 1)
        self.assertEqual(game.completedgame.winners.first(), self.player2)
Esempio n. 12
0
    def test_game_feed_message_is_generated_when_player_wins(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        game.archived_players.set([self.player1, self.player2])
        p1 = self.player1.id
        p2 = self.player2.id
        board_list = [
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, p1, p2, None, None, None],
            [None, p1, p2, p2, None, None, None],
            [p1, p2, p2, p2, None, None, None],
        ]
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            board_list
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7,
                                     max_to_win=4)
        self.assertEqual(GameFeedMessage.objects.count(), 0)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(response.data['game_over'])
        self.assertEqual(GameFeedMessage.objects.count(), 2)

        move_gfm = GameFeedMessage.objects.filter(
            game=game,
            message_type=GameFeedMessage.MESSAGE_TYPE_PLAYER_MOVE_DROP_CHIP
        ).first()
        game_over_gfm = GameFeedMessage.objects.filter(
            game=game,
            message_type=GameFeedMessage.MESSAGE_TYPE_GAME_STATUS).first()

        calls = self.mock_push_new_game_feed_message.call_args_list
        self.assertEqual(len(calls), 2)
        self.assertEqual(calls[0][0][0], move_gfm)
        self.assertEqual(calls[1][0][0], game_over_gfm)
Esempio n. 13
0
 def test_drop_chip_in_column_off_board(self):
     self.board.board_state = cq_lib.board_obj_to_serialized_state({
         Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
         self.player1.id,
         Board.STATE_KEY_BOARD_LIST: [
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
             [None, None, None, None, None, None, None],
         ]
     })
     self.assertRaises(
         cq_lib.ColumnOutOfRangeError,
         lambda: cq_lib.drop_chip(self.board, self.player2, 8))
Esempio n. 14
0
 def test_drop_chip_in_full_column(self):
     self.board.board_state = cq_lib.board_obj_to_serialized_state({
         Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
         self.player1.id,
         Board.STATE_KEY_BOARD_LIST: [
             [None, 1, None, None, None, None, None],
             [None, 2, None, None, None, None, None],
             [None, 1, None, None, None, None, None],
             [None, 1, None, None, None, None, None],
             [None, 2, None, None, None, None, None],
             [None, 1, None, None, None, None, None],
             [None, 1, None, None, None, None, None],
         ]
     })
     self.assertRaises(
         cq_lib.ColumnIsFullError,
         lambda: cq_lib.drop_chip(self.board, self.player2, 1))
Esempio n. 15
0
    def test_turn_timeout_task_does_not_start_when_player_wins(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        game.archived_players.set([self.player1, self.player2])
        p1 = self.player1.id
        p2 = self.player2.id
        board_list = [
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, None, None, None, None, None],
            [None, None, p1, p2, None, None, None],
            [None, p1, p2, p2, None, None, None],
            [p1, p2, p2, p2, None, None, None],
        ]
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            board_list
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7,
                                     max_to_win=4)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        self.assertTrue(response.data['game_over'])
        self.assertTrue(response.data['winner'], {
            'handle': self.player1.slug,
            'slug': self.player2.slug
        })
        self.mock_cycle_player_turn_if_inactive.assert_not_called()
Esempio n. 16
0
    def test_socket_event_fires_when_a_player_makes_a_move(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        alert_game_players_calls = self.mock_alert_game_players_to_new_move.call_args_list
        self.assertEqual(len(alert_game_players_calls), 1)

        self.assertEqual(alert_game_players_calls[0][0][0], game)
        passed_game_state = alert_game_players_calls[0][0][1]
        self.assertEqual(passed_game_state['board_list'][6][3],
                         self.player1.id)
        self.assertIsNone(passed_game_state['winner'])
        self.assertFalse(passed_game_state['game_over'])
        self.assertEqual(len(passed_game_state['players']), 2)
        passed_player_slugs = [p['slug'] for p in passed_game_state['players']]
        self.assertTrue(self.player1.slug in passed_player_slugs)
        self.assertTrue(self.player2.slug in passed_player_slugs)
        self.assertEqual(passed_game_state['next_player_slug'],
                         self.player2.slug)
Esempio n. 17
0
    def test_player_can_drop_chip_on_empty_board_when_its_their_turn(self):
        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT,
            name="fooo",
            is_started=True,
            max_players=2)
        self.player1.game = game
        self.player2.game = game
        self.player1.save()
        self.player2.save()
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game,
                                     board_state=board_state,
                                     board_length_x=7,
                                     board_length_y=7)

        self.client.login(username='******', password='******')
        url = reverse('api-connectquat-move')
        data = {'column_index': 3}
        response = self.client.post(url, data, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        board.refresh_from_db()
        board_state = cq_lib.board_state_to_obj(board)
        board_list = board_state[Board.STATE_KEY_BOARD_LIST]
        self.assertEqual(board_list[6][3], self.player1.id)

        chip_counts = Counter()
        for row in board_list:
            for val in row:
                chip_counts[val] += 1
        self.assertEqual(chip_counts[self.player1.id], 1)
        self.assertEqual(chip_counts[None], 48)
Esempio n. 18
0
    def test_no_win_conditions_for_connect_quatro_board(self):
        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST:
            [[None for i in range(7)] for j in range(7)]
        })
        self.board.save()
        self.assertIsNone(cq_lib.get_winning_player(self.board))

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [
                    self.player2.id,  # 3/4 in a row
                    self.player2.id,  #
                    self.player2.id,  #
                    self.player1.id,
                    self.player2.id,
                    None,
                    None
                ],
            ]
        })
        self.board.save()
        self.assertIsNone(cq_lib.get_winning_player(self.board))

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [self.player1.id, None, None, None, None, None,
                 None],  # 3/4 in a row
                [self.player1.id, None, None, None, None, None, None],  #
                [self.player1.id, None, None, None, None, None, None],  # 
            ]
        })
        self.board.save()
        self.assertIsNone(cq_lib.get_winning_player(self.board))

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None, None, None, None, None, None, None],
                [None, self.player1.id, None, None, None, None,
                 None],  # 3/4 in a row
                [None, None, self.player1.id, None, None, None, None],  #
                [None, None, None, self.player1.id, None, None, None],  #
            ]
        })
        self.board.save()
        self.assertIsNone(cq_lib.get_winning_player(self.board))

        self.board.board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:
            self.player1.id,
            Board.STATE_KEY_BOARD_LIST: [
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None for i in range(7)],
                [None, None, None, None, None, self.player1.id,
                 None],  # 3/4 in a row
                [None, None, None, None, self.player1.id, None, None],  #
                [None, None, None, self.player1.id, None, None, None],  #
            ]
        })
        self.board.save()
        self.assertIsNone(cq_lib.get_winning_player(self.board))
Esempio n. 19
0
    def test_active_player_can_leave_a_started_connect_quatrogame_still_others_left_in_the_game(self):
        """ Test player can leave a started game that will still have > 1 players leftover.
        """
        self.user2 = User.objects.create_user('*****@*****.**', password='******')
        self.player2 = Player.objects.create(user=self.user2, handle="duuude")
        self.user3 = User.objects.create_user('*****@*****.**', password='******')
        self.player3 = Player.objects.create(user=self.user3, handle="yoo-duuuude")

        game = Game.objects.create(
            game_type=Game.GAME_TYPE_CHOICE_CONNECT_QUAT, name="foo", max_players=3,
            is_started=True, is_over=False)
        board_state = cq_lib.board_obj_to_serialized_state({
            Board.STATE_KEY_NEXT_PLAYER_TO_ACT:self.player1.id,
            Board.STATE_KEY_BOARD_LIST:[[None for i in range(7)] for j in range(7)]
        })
        board = Board.objects.create(game=game, board_state=board_state)
        game_id = game.id
        self.player1.game = game
        self.player2.game = game
        self.player3.game = game
        self.player1.save(update_fields=['game'])
        self.player2.save(update_fields=['game'])
        self.player3.save(update_fields=['game'])
        self.assertEqual(game.players.count(), 3)

        self.client.login(username='******', password='******')
        url = reverse('api-lobby-leave')
        response = self.client.post(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        game.refresh_from_db()
        board.refresh_from_db()
        self.player1.refresh_from_db()
        self.assertTrue(Game.objects.filter(id=game_id).exists())
        self.assertFalse(game.is_over)
        self.assertEqual(game.tick_count, 1)
        self.assertTrue(self.player1 not in game.players.all())
        self.assertTrue(self.player2 in game.players.all())
        self.assertTrue(self.player3 in game.players.all())
        self.assertEqual(game.players.count(), 2)

        self.mock_push_player_quit_game_event.assert_not_called()
        self.mock_update_lobby_list_player_count.assert_not_called()
        self.mock_update_lobby_list_remove_game.assert_not_called()
        self.mock_update_lobby_list_add_connect_quatro.assert_not_called()

        active_player_id = cq_lib.get_active_player_id_from_board(board)
        self.mock_cycle_player_turn_if_inactive.assert_called_once_with(
            game.id, active_player_id, game.tick_count)

        calls = self.mock_alert_game_players_to_new_move.call_args_list
        self.assertEqual(len(calls), 1)
        self.assertEqual(calls[0][0][0], game)

        passed_game_state = calls[0][0][1]
        self.assertFalse(passed_game_state['game_over'])
        self.assertTrue(
            passed_game_state['next_player_slug'] in [self.player2.slug], self.player3.slug)
        self.assertEqual(len(passed_game_state['players']), 2)
        passed_player_slugs = [p['slug'] for p in passed_game_state['players']]
        self.assertTrue(self.player2.slug in passed_player_slugs)
        self.assertTrue(self.player3.slug in passed_player_slugs)
        self.assertFalse(CompletedGame.objects.filter(game=game).exists())