def test_basic_beam_with_low_k(self):
        puzzle = Puzzle()
        puzzle.currState = "b42 135 678"

        move_count = puzzle.solve("beam", "1")

        # expect the solution to be optimal only because the solution is so short
        self.assertEqual(4, move_count)
    def test_basic_beam_with_high_k(self):
        puzzle = Puzzle()
        puzzle.currState = "b42 135 678"

        move_count = puzzle.solve("beam", "1000")

        # expect the solution to be optimal since the solution is short and k is high
        self.assertEqual(4, move_count)
    def test_h1(self):
        puzzle = Puzzle()
        puzzle.currState = "724 5b6 831"

        dist = puzzle.h1()
        self.assertEqual(8, dist)
    def test_basic_a_star_with_h2(self):
        puzzle = Puzzle()
        puzzle.currState = "b42 135 678"

        move_count = puzzle.solve("A-star", "h2")
        self.assertEqual(4, move_count)
    def test_h2(self):
        puzzle = Puzzle()
        puzzle.currState = "724 5b6 831"

        manhatten_dist = puzzle.h2()
        self.assertEqual(18, manhatten_dist)