def test_scatter_and_return(self):
     c = Cube()
     c.change_by(Move.BACK)
     c.change_by(Move.LEFT_CTR)
     c.change_by(Move.DOWN)
     self.assertFalse(c.is_solved())
     c.change_by(Move.DOWN_CTR)
     c.change_by(Move.LEFT)
     c.change_by(Move.BACK_CTR)
     self.assertTrue(c.is_solved())
Ejemplo n.º 2
0
    def solve(self,
              root: Cube,
              timeout: Union[int, None] = None) -> Union[List[Move], None]:
        self._stop = threading.Event()
        if root.is_solved(): return []
        self._initialize_tree(root)
        self._backup_stack = []
        root = ImmutableCube(root)

        if timeout is not None:
            timer = threading.Timer(timeout, lambda: self._stop.set())
            timer.daemon = True
            timer.start()

        while not self._stop.is_set():
            if self._traverse_for_solved(root):
                return self._extract_final_sequence(root)
            self._backup()
        return None
    def test_mutability(self):
        mut = Cube()
        changed = mut.change_by(Move.DOWN)

        self.assertFalse(mut.is_solved())
        self.assertListEqual(mut.front, changed.front)
 def test_back_move_and_return(self):
     c = Cube()
     c.change_by(Move.BACK)
     self.assertFalse(c.is_solved())
     c.change_by(Move.BACK_CTR)
     self.assertTrue(c.is_solved())
 def test_left_move_and_return(self):
     c = Cube()
     c.change_by(Move.LEFT)
     self.assertFalse(c.is_solved())
     c.change_by(Move.LEFT_CTR)
     self.assertTrue(c.is_solved())
 def test_down_move_and_return(self):
     c = Cube()
     c.change_by(Move.DOWN)
     c.change_by(Move.DOWN_CTR)
     self.assertTrue(c.is_solved())
 def test_not_solved_after_move(self):
     c = Cube()
     c.change_by(Move.DOWN)
     self.assertFalse(c.is_solved())