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())
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())