def test_path():
    """
    Pathクラスのテスト。
    """
    path = Path()
    # (0,1) => (0,2)の経路を登録
    path.set_path((0, 1), (0, 2))
    # (0,1) => (0,2)の経路が登録されていることを確認
    assert (0, 1) == path.get((0, 2))

    # (0,1) => (0,3)の経路を登録
    path.set_path((0, 1), (0, 3))
    # (0,1) => (0,3)の経路が登録されていることを確認
    assert (0, 1) == path.get((0, 3))

    # 経路[(0,1), (0,2)]が取得できることを確認
    assert [(0, 1), (0, 2)] == path.search_path((0, 1), (0, 2))
    # 経路[(0,1). (0,3)]が取得できることを確認
    assert [(0, 1), (0, 3)] == path.search_path((0, 1), (0, 3))
def test_path_invalid():
    """
    Pathクラスのテスト。不正な入力ver.
    """
    with pytest.raises(ArithmeticError):
        path = Path()
        # (0,1) => (0,2)の経路を登録
        path.set_path((0, 1), (0, 2))
        # (0,2) => (0,3)の経路を登録
        path.set_path((0, 2), (0, 3))
        # 存在しない始点を入力として運搬経路を取得する
        path.search_path((1, 2), (0, 3))
def test_moving_cost():
    solver = create_block_bingo([(0, 0), (0, 1)])
    # 走行体の現在地と向きを確認する
    assert (0.5, 1) == solver.position
    assert 2 == solver.direction
    path = Path()

    # (1,1)まで移動する
    solver.position = (1, 1)
    solver.direction = 4
    solver.cross_circles.move_block((1, 1))

    # --ブロックなしの動作--
    # 走行体が水平に進むとき
    solver.direction = 2  # 東向きに設定
    assert 1 == solver.moving_cost((1, 1), (1, 1.5), path)  # 直進
    assert 2 == solver.moving_cost((1, 1), (1, 0.5), path)  # 180度旋回
    solver.direction = 4  # 南向きに設定
    assert 2 == solver.moving_cost((1, 1), (1, 0.5), path)  # 右に90度旋回
    assert 2 == solver.moving_cost((1, 1), (1, 1.5), path)  # 左に90度旋回

    # 走行体が垂直に進むとき
    solver.direction = 4  # 南向きに設定
    assert 1 == solver.moving_cost((1, 1), (1.5, 1), path)  # 直進
    assert 2 == solver.moving_cost((1, 1), (0.5, 1), path)  # 180度旋回
    solver.direction = 2  # 東向きに設定
    assert 2 == solver.moving_cost((1, 1), (1.5, 1), path)  # 右に90度旋回
    assert 2 == solver.moving_cost((1, 1), (0.5, 1), path)  # 左に90度旋回

    # --ブロックありの動作--
    # 走行体が水平に進むとき
    solver.direction = 2  # 東向きに設定
    solver.cross_circles.open.append((1, 1))  # ブロックを設置
    assert 4 == solver.moving_cost((1, 1), (1, 1.5), path)  # 直進
    assert 5 == solver.moving_cost((1, 1), (1, 0.5), path)  # 180度旋回
    solver.direction = 4  # 南向きに設定
    assert 2 == solver.moving_cost((1, 1), (1, 0.5), path)  # 右に90度旋回
    assert 2 == solver.moving_cost((1, 1), (1, 1.5), path)  # 左に90度旋回

    # 走行体が垂直に進むとき
    solver.direction = 4  # 南向きに設定
    assert 4 == solver.moving_cost((1, 1), (1.5, 1), path)  # 直進
    assert 5 == solver.moving_cost((1, 1), (0.5, 1), path)  # 180度旋回
    solver.direction = 2  # 東向きに設定
    assert 2 == solver.moving_cost((1, 1), (1.5, 1), path)  # 右に90度旋回
    assert 2 == solver.moving_cost((1, 1), (0.5, 1), path)  # 左に90度旋回
def test_current_direction():
    solver = create_block_bingo([(1, 0), (2, 0), (2, 1)])
    # 走行体の現在地と向きを確認する
    assert (2.5, 1) == solver.position
    assert 2 == solver.direction

    # (2.5,1) => (2,1) => (2,2)に移動する
    path = Path()
    path.set_path((2.5, 1), (2, 1))
    solver.direction = 0
    solver.position = (2, 1)
    # 走行体の向きが北向きになっていることを確認する
    assert 0 == solver.current_direction((2, 1), path)
    path.set_path((2, 1), (2, 2))
    # 走行体の向きが東向きになっていることを確認する
    assert 2 == solver.current_direction((2, 2), path)