def test_successors_correctness(self):
        succs = StateSuccessorFinder(States.state1).get_successors()
        self.assertEqual(
            set([
                States.state1_succ1, States.state1_succ2, States.state1_succ3,
                States.state1_succ4, States.state1_succ5
            ]), succs)

        succs = StateSuccessorFinder(States.state5).get_successors()
        self.assertTrue(States.state5_succ1 in succs)
	def test_get_movable_directions_of_block(self):
		t = StateSuccessorFinder(States.state1)
		self.assertEqual(t.get_movable_directions_of_block(1),
			set(["r", "d"]))
		
		self.assertEqual(t.get_movable_directions_of_block(2),
			set(["l", "u", "d"]))
		
		t = StateSuccessorFinder(States.state3)
		self.assertEqual(t.get_movable_directions_of_block(1),
			set(["u", "r", "d", "l"]))
	def test_get_neighbor_cells(self):
		t = StateSuccessorFinder(States.state0)
		
		self.assertEqual(t.get_neighbor_cells((0, 0)),
			{"u": None, "r": (0, 1), "d": (1, 0), "l": None})
		
		self.assertEqual(t.get_neighbor_cells((1, 0)),
			{"u": (0, 0), "r": (1, 1), "d": (2, 0), "l": None})
		
		self.assertEqual(t.get_neighbor_cells((M - 1, N - 1)),
			{"u": (M - 2, N - 1), "r": None, "d": None, "l": (M - 1, N - 2)})
		
		self.assertEqual(t.get_neighbor_cells((1, 2)),
			{"u": (0, 2), "r": (1, 3), "d": (2, 2), "l": (1, 1)})
    def test_successors_count(self):
        succs = StateSuccessorFinder(States.state1).get_successors()
        self.assertEqual(len(succs), 5)

        succs = StateSuccessorFinder(States.state0).get_successors()
        self.assertEqual(len(succs), 0)

        succs = StateSuccessorFinder(States.state4).get_successors()
        self.assertEqual(len(succs), 4)

        succs = StateSuccessorFinder(States.state3).get_successors()
        self.assertEqual(len(succs), 4)

        succs = StateSuccessorFinder(States.state_full).get_successors()
        self.assertEqual(len(succs), 0)
    def test_get_movable_directions_of_block(self):
        t = StateSuccessorFinder(States.state1)
        self.assertEqual(t.get_movable_directions_of_block(1), set(["r", "d"]))

        self.assertEqual(t.get_movable_directions_of_block(2),
                         set(["l", "u", "d"]))

        t = StateSuccessorFinder(States.state3)
        self.assertEqual(t.get_movable_directions_of_block(1),
                         set(["u", "r", "d", "l"]))
    def test_get_neighbor_cells(self):
        t = StateSuccessorFinder(States.state0)

        self.assertEqual(t.get_neighbor_cells((0, 0)), {
            "u": None,
            "r": (0, 1),
            "d": (1, 0),
            "l": None
        })

        self.assertEqual(t.get_neighbor_cells((1, 0)), {
            "u": (0, 0),
            "r": (1, 1),
            "d": (2, 0),
            "l": None
        })

        self.assertEqual(t.get_neighbor_cells((M - 1, N - 1)), {
            "u": (M - 2, N - 1),
            "r": None,
            "d": None,
            "l": (M - 1, N - 2)
        })

        self.assertEqual(t.get_neighbor_cells((1, 2)), {
            "u": (0, 2),
            "r": (1, 3),
            "d": (2, 2),
            "l": (1, 1)
        })
    def test_get_movable_blocks(self):
        t = StateSuccessorFinder(States.state0)
        self.assertEqual(t.get_movable_blocks(), set())

        t = StateSuccessorFinder(States.state1)
        self.assertEqual(
            t.get_movable_blocks(),
            set([
                (1, "r"),
                (1, "d"),
                (2, "u"),
                (2, "l"),
                (2, "d"),
            ]))

        t = StateSuccessorFinder(States.state4)
        self.assertEqual(t.get_movable_blocks(),
                         set([
                             (4, "d"),
                             (3, "d"),
                             (3, "r"),
                             (2, "r"),
                         ]))
	def test_get_movable_blocks(self):
		t = StateSuccessorFinder(States.state0)
		self.assertEqual(t.get_movable_blocks(), set())
		
		t = StateSuccessorFinder(States.state1)
		self.assertEqual(t.get_movable_blocks(), set([
			(1, "r"),
			(1, "d"),
			(2, "u"),
			(2, "l"),
			(2, "d"),
		]))
		
		t = StateSuccessorFinder(States.state4)
		self.assertEqual(t.get_movable_blocks(), set([
			(4, "d"),
			(3, "d"),
			(3, "r"),
			(2, "r"),
		]))