def test_start_valid_moves(): board = SplineState() expected_moves = [True] * 16 + [False] * 14 valid_moves = board.get_valid_moves() assert valid_moves.tolist() == expected_moves
def test_double_update(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters(240, 240, 'spline_double_update') as (actual, expected): expected_scene = QGraphicsScene(0, 0, 240, 240) expected_scene.addPixmap( SplineDisplay.load_pixmap('board-1.png', QSize(240, 240))).setPos(1, 0) white_ball = SplineDisplay.load_pixmap('ball-w-shadow-1.png', QSize(60, 60)) black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png', QSize(60, 60)) expected_scene.addPixmap(black_ball).setPos(11, 10) expected_scene.addPixmap(white_ball).setPos(63, 10) expected_scene.addPixmap(black_ball).setPos(115, 62) expected_scene.render(expected) display = SplineDisplay() trigger_resize(display, 300, 240) display.update_board( SplineState("""\ A C E G 7 W B . . 7 5 . . . W 5 3 . . . . 3 1 . . . . 1 A C E G """)) display.update_board( SplineState("""\ A C E G 7 B W . . 7 5 . . B . 5 3 . . . . 3 1 . . . . 1 A C E G """)) display.resize(348, 264) render_display(display, actual)
def test_add_stone_bad_row(): board1 = SplineState("""\ A C E G 7 . . . . 7 5 . W B . 5 3 . W B . 3 1 . . . . 1 A C E G """) with pytest.raises(ValueError, match='Invalid move: 9C.'): board1.parse_move('9C')
def test_add_stone_third_level(): board1 = SplineState("""\ A C E G 7 . B B W 7 5 . W B W 5 3 . W B B 3 1 . . . . 1 A C E G B D F 6 . W B 6 4 . B W 4 2 . . . 2 B D F """) expected_display = """\ A C E G 7 . B B W 7 5 . W B W 5 3 . W B B 3 1 . . . . 1 A C E G B D F 6 . W B 6 4 . B W 4 2 . . . 2 B D F C E 5 . W 5 3 . . 3 C E """ move = board1.parse_move('5e') board2 = board1.make_move(move) display = board2.display(show_coordinates=True) assert display == expected_display
def __init__(self): display = SplineDisplay() display.update_board( SplineState('''\ A C E G 7 W B W B 7 5 B W B W 5 3 W B W B 3 1 W W B . 1 A C E G B D F 6 W B B 6 4 B B W 4 2 W W . 2 B D F C E 5 . B 5 3 B . 3 C E ''')) display.resize(300, 224) super().__init__(display)
def test_win_row(): board = SplineState("""\ A C E G 7 . . . . 7 5 W W W W 5 3 . B B . 3 1 . B B . 1 A C E G """) expected_winner = board.WHITE winner = board.get_winner() assert winner == expected_winner
def test_win_column(): board = SplineState("""\ A C E G 7 W W B . 7 5 W W B W 5 3 W B B . 3 1 . B B . 1 A C E G """) expected_winner = board.BLACK winner = board.get_winner() assert winner == expected_winner
def test_win_diagonal(): board = SplineState("""\ A C E G 7 W W B . 7 5 W W B B 5 3 W B W B 3 1 . B B W 1 A C E G """) expected_winner = board.WHITE winner = board.get_winner() assert winner == expected_winner
def test_valid_moves_after_win(): board = SplineState("""\ A C E G 7 . W B . 7 5 . W B . 5 3 . W B . 3 1 . . B . 1 A C E G """) expected_valid_moves = [False] * 30 valid_moves = board.get_valid_moves() assert expected_valid_moves == valid_moves.tolist()
def test_start_display(): board = SplineState() expected_display = """\ A C E G 7 . . . . 7 5 . . . . 5 3 . . . . 3 1 . . . . 1 A C E G """ display = board.display(show_coordinates=True) assert display == expected_display
def test_init_text(): expected_display = """\ A C E G 7 . . . . 7 5 . W . . 5 3 . . B . 3 1 . . . . 1 A C E G """ board = SplineState(text=expected_display) display = board.display(show_coordinates=True) assert display == expected_display
def test_add_stone_lower_case(): board1 = SplineState() expected_display = """\ A C E G 7 . . . . 7 5 . . . . 5 3 . . B . 3 1 . . . . 1 A C E G """ move = board1.parse_move('3e') board2 = board1.make_move(move) display = board2.display(show_coordinates=True) assert display == expected_display
def test_full_spaces_valid_moves(): board = SplineState("""\ A C E G 7 . . . . 7 5 . W . . 5 3 . . B . 3 1 . . . . 1 A C E G """) expected_valid_moves = [True] * 16 + [False] * 14 # full spaces are no longer valid moves expected_valid_moves[6] = expected_valid_moves[9] = False valid_moves = board.get_valid_moves() assert valid_moves.tolist() == expected_valid_moves
def test_second_level_valid_moves(): board = SplineState("""\ A C E G 7 . . . . 7 5 . W B . 5 3 . W B . 3 1 . . . . 1 A C E G """) expected_valid_moves = [True] * 16 + [False] * 14 # full spaces are no longer valid moves expected_valid_moves[5:7] = expected_valid_moves[9:11] = [False, False] # centre of second level is now supported expected_valid_moves[20] = True valid_moves = board.get_valid_moves() assert valid_moves.tolist() == expected_valid_moves
def test_get_levels(): board = SplineState("""\ A C E G 7 W W W . 7 5 W W B W 5 3 W B B . 3 1 . B B . 1 A C E G B D F 6 B W . 6 4 B W B 4 2 . W . 2 B D F """) w = board.WHITE b = board.BLACK n = board.NO_PLAYER u = board.UNUSABLE expected_levels = [[[n, b, b, n], [w, b, b, n], [w, w, b, w], [w, w, w, n]], [[n, w, n, u], [b, w, b, u], [b, w, n, u], [u, u, u, u]], [[n, n, u, u], [n, n, u, u], [u, u, u, u], [u, u, u, u]], [[n, u, u, u], [u, u, u, u], [u, u, u, u], [u, u, u, u]]] assert board.get_levels().tolist() == expected_levels
def test_init_text_partial(): text = """\ Headers ignored ! WxB garbage ??B W """ expected_display = """\ A C E G 7 W B . . 7 5 B W . . 5 3 . . . . 3 1 . . . . 1 A C E G """ board = SplineState(text=text) display = board.display(show_coordinates=True) assert display == expected_display
def test_init_text_bad(): text = """\ A C E G 7 . . . . 7 5 . W . . 5 3 . . B . 3 1 . X . . 1 A C E G """ with pytest.raises(ValueError, match="Unexpected 'X' at line 8, column 5."): SplineState(text=text)
def test_display_move(move_index: int, expected_display: str): board = SplineState("""\ A C E G 7 . . . . 7 5 . . . . 5 3 . . . . 3 1 . . . . 1 A C E G B D F 6 . . . 6 4 . . . 4 2 . . . 2 B D F """) display = board.display_move(move_index) assert display == expected_display
def test_get_move_count(): board = SplineState("""\ A C E G 7 . . . . 7 5 . W B . 5 3 . B W . 3 1 . . . . 1 A C E G B D F 6 . . . 6 4 . B . 4 2 . . . 2 B D F """) move_count = board.get_move_count() assert move_count == 5
def test_win_column_level_2(): board = SplineState("""\ A C E G 7 W W W . 7 5 W W B W 5 3 W B B . 3 1 . B B . 1 A C E G B D F 6 B W . 6 4 B W B 4 2 . W . 2 B D F """) expected_winner = board.WHITE winner = board.get_winner() assert winner == expected_winner
def test_add_stone_second_level(): board1 = SplineState("""\ A C E G 7 . . . . 7 5 . W B . 5 3 . W B . 3 1 . . . . 1 A C E G """) expected_display = """\ A C E G 7 . . . . 7 5 . W B . 5 3 . W B . 3 1 . . . . 1 A C E G B D F 6 . . . 6 4 . B . 4 2 . . . 2 B D F """ move = board1.parse_move('4D') board2 = board1.make_move(move) display = board2.display(show_coordinates=True) assert display == expected_display
def test_init_text_second_level(): expected_display = """\ A C E G 7 . . . . 7 5 . W B . 5 3 . W B . 3 1 . . . . 1 A C E G B D F 6 . . . 6 4 . R . 4 2 . . . 2 B D F """ board = SplineState(text=expected_display) display = board.display(show_coordinates=True) assert display == expected_display
def test_second_level(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters(240, 240, 'spline_second_level') as (actual, expected): expected_scene = QGraphicsScene(0, 0, 240, 240) expected_scene.addPixmap( SplineDisplay.load_pixmap('board-1.png', QSize(240, 240))).setPos(1, 0) white_ball = SplineDisplay.load_pixmap('ball-w-shadow-1.png', QSize(60, 60)) black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png', QSize(60, 60)) expected_scene.addPixmap(black_ball).setPos(11, 62) expected_scene.addPixmap(white_ball).setPos(63, 62) expected_scene.addPixmap(white_ball).setPos(11, 10) expected_scene.addPixmap(black_ball).setPos(63, 10) expected_scene.addPixmap(black_ball).setPos(37, 36) expected_scene.render(expected) display = SplineDisplay() display.update_board( SplineState("""\ A C E G 7 W B . . 7 5 B W . . 5 3 . . . . 3 1 . . . . 1 A C E G B D F 6 B . . 6 4 . . . 4 2 . . . 2 B D F """)) display.resize(348, 264) render_display(display, actual)
def test_first_level(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters(240, 240, 'spline_first_level') as (actual, expected): expected_scene = QGraphicsScene(0, 0, 240, 240) expected_scene.addPixmap( SplineDisplay.load_pixmap('board-1.png', QSize(240, 240))).setPos(1, 0) white_ball = SplineDisplay.load_pixmap('ball-w-shadow-1.png', QSize(60, 60)) black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png', QSize(60, 60)) expected_scene.addPixmap(white_ball).setPos(11, 10) expected_scene.addPixmap(black_ball).setPos(63, 10) expected_scene.addPixmap(black_ball).setPos(167, 62) expected_scene.render(expected) display = SplineDisplay() display.update_board( SplineState("""\ A C E G 7 W B . . 7 5 . . . B 5 3 . . . . 3 1 . . . . 1 A C E G """)) display.resize(348, 264) render_display(display, actual) white_icon = SplineDisplay.load_pixmap('ball-w-shadow-1.png').toImage() assert display.ui.player_pixmap.pixmap().toImage() == white_icon
def test_hover_leave_existing(pixmap_differ: PixmapDiffer): actual: QPainter expected: QPainter with pixmap_differ.create_painters( 240, 240, 'spline_hover_leave_existing') as (actual, expected): expected_scene = QGraphicsScene(0, 0, 240, 240) expected_scene.addPixmap( SplineDisplay.load_pixmap('board-1.png', QSize(240, 240))).setPos(1, 0) black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png', QSize(60, 60)) expected_scene.addPixmap(black_ball).setPos(115, 114) expected_scene.render(expected) display = SplineDisplay() display.update_board( SplineState("""\ A C E G 7 . . . . 7 5 . . . . 5 3 . . B . 3 1 . . . . 1 A C E G """)) height = 0 row = 1 column = 2 piece_item = display.item_levels[height][row][column] display.resize(348, 264) display.grab() # Force layout to recalculate. display.on_hover_leave(piece_item) render_display(display, actual)
def __init__(self): display = SplineDisplay() display.update_board( SplineState('''\ A C E G 7 W B W . 7 5 B B B W 5 3 W B B . 3 1 W W B . 1 A C E G B D F 6 W B . 6 4 W . . 4 2 W . . 2 B D F ''')) display.resize(300, 224) super().__init__(display)
def __init__(self): super().__init__(SplineState())