public void ReorganiseMiddleEdges_CorrectlyPositionsTheMiddleEdges_GivenThreeIncorrectlyPositionedMiddleEdges() { var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Blue, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Orange, null, Colour.Blue, null, null) } }, { { new Block(Colour.Green, null, Colour.Orange, null, null, Colour.Yellow), new Block(null, null, Colour.Green, null, null, Colour.Yellow), new Block(null, Colour.Red, Colour.Blue, null, null, Colour.Yellow) }, { new Block(Colour.Blue, null, null, null, null, Colour.Yellow), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Red, null, null, null, Colour.Yellow) }, { new Block(Colour.Green, null, null, Colour.Red, null, Colour.Yellow), new Block(null, null, null, Colour.Orange, null, Colour.Yellow), new Block(null, Colour.Orange, null, Colour.Blue, null, Colour.Yellow) } } }); var solver = new ThirdLayerSolver(cube); solver.Solve(); Assert.That(_solvedCube, Is.EquivalentTo(cube.Cube)); }
public void ReorganiseMiddleEdges_FormsTheYellowCross_GivenOnlyTheCentreBlock() { var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Blue, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Orange, null, Colour.Blue, null, null) } }, { { new Block(Colour.Orange, null, Colour.Blue, null, null, Colour.Yellow), new Block(null, null, Colour.Yellow, null, null, Colour.Green), new Block(null, Colour.Yellow, Colour.Red, null, null, Colour.Blue) }, { new Block(Colour.Yellow, null, null, null, null, Colour.Blue), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Yellow, null, null, null, Colour.Red) }, { new Block(Colour.Yellow, null, null, Colour.Orange, null, Colour.Green), new Block(null, null, null, Colour.Yellow, null, Colour.Orange), new Block(null, Colour.Green, null, Colour.Yellow, null, Colour.Red) } } }); var solver = new ThirdLayerSolver(cube); solver.Solve(); Assert.That(_solvedCube, Is.EquivalentTo(cube.Cube)); }
public void CorrectCornerOrientation_ThrowsException_GivenCubeWithOneIncorrectCorner() { var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Blue, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Orange, null, Colour.Blue, null, null) } }, { { new Block(Colour.Green, null, Colour.Yellow, null, null, Colour.Red), new Block(null, null, Colour.Green, null, null, Colour.Yellow), new Block(null, Colour.Orange, Colour.Green, null, null, Colour.Yellow) }, { new Block(Colour.Red, null, null, null, null, Colour.Yellow), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Orange, null, null, null, Colour.Yellow) }, { new Block(Colour.Red, null, null, Colour.Blue, null, Colour.Yellow), new Block(null, null, null, Colour.Blue, null, Colour.Yellow), new Block(null, Colour.Orange, null, Colour.Blue, null, Colour.Yellow) } } }); var solver = new ThirdLayerSolver(cube); var ex = Assert.Throws <Exception>(solver.Solve); Assert.That(ex.Message, Is.EqualTo("Something is wrong with the Rubix Cube layout - it should not be possible to have only one incorrect corner block.")); }
public void ReorganiseCorners_ThrowsException_GivenTwoCorrectlyPositionedCorners() { // There is no way to logically test 3 correctly positioned corners since it is impossible for all but one piece to be correct. // Two correct pieces is not possible for a valid rubix cube but it kind of makes sense that it might theoretically be possible // without looking at the actual mathematics. var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Blue, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Orange, null, Colour.Blue, null, null) } }, { { new Block(Colour.Green, null, Colour.Yellow, null, null, Colour.Orange), new Block(null, null, Colour.Green, null, null, Colour.Yellow), new Block(null, Colour.Green, Colour.Yellow, null, null, Colour.Red) }, { new Block(Colour.Red, null, null, null, null, Colour.Yellow), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Orange, null, null, null, Colour.Yellow) }, { new Block(Colour.Blue, null, null, Colour.Yellow, null, Colour.Red), new Block(null, null, null, Colour.Blue, null, Colour.Yellow), new Block(null, Colour.Blue, null, Colour.Yellow, null, Colour.Orange) } } }); var solver = new ThirdLayerSolver(cube); var ex = Assert.Throws <Exception>(solver.Solve); Assert.That(ex.Message, Is.EqualTo("Something has gone wrong. There can only be 0, 3 or 4 incorrect blocks at this stage.")); }
public void CorrectCornerOrientation_SolvesCube_GivenCubeWithFourIncorrectCorners() { var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Blue, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Orange, null, Colour.Blue, null, null) } }, { { new Block(Colour.Green, null, Colour.Yellow, null, null, Colour.Red), new Block(null, null, Colour.Green, null, null, Colour.Yellow), new Block(null, Colour.Green, Colour.Yellow, null, null, Colour.Orange) }, { new Block(Colour.Red, null, null, null, null, Colour.Yellow), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Orange, null, null, null, Colour.Yellow) }, { new Block(Colour.Blue, null, null, Colour.Yellow, null, Colour.Red), new Block(null, null, null, Colour.Blue, null, Colour.Yellow), new Block(null, Colour.Blue, null, Colour.Yellow, null, Colour.Orange) } } }); var solver = new ThirdLayerSolver(cube); solver.Solve(); Assert.That(_solvedCube, Is.EquivalentTo(cube.Cube)); }
private void SolveThirdLayer() { var solver = new ThirdLayerSolver(_cube); solver.Solve(); }
public void SolveSecondLayer_IsCorrect_GivenSwitchableMiddleEdges() { var cube = new RubixCube(new[, , ] { { { new Block(Colour.Red, null, Colour.Green, null, Colour.White, null), new Block(null, null, Colour.Green, null, Colour.White, null), new Block(null, Colour.Orange, Colour.Green, null, Colour.White, null) }, { new Block(Colour.Red, null, null, null, Colour.White, null), new Block(null, null, null, null, Colour.White, null), new Block(null, Colour.Orange, null, null, Colour.White, null) }, { new Block(Colour.Red, null, null, Colour.Blue, Colour.White, null), new Block(null, null, null, Colour.Blue, Colour.White, null), new Block(null, Colour.Orange, null, Colour.Blue, Colour.White, null) } }, { { new Block(Colour.Red, null, Colour.Green, null, null, null), new Block(null, null, Colour.Green, null, null, null), new Block(null, Colour.Orange, Colour.Green, null, null, null) }, { new Block(Colour.Red, null, null, null, null, null), new Block(null, null, null, null, null, null), new Block(null, Colour.Orange, null, null, null, null) }, { new Block(Colour.Red, null, null, Colour.Yellow, null, null), new Block(null, null, null, Colour.Blue, null, null), new Block(null, Colour.Green, null, Colour.Yellow, null, null) } }, { { new Block(Colour.Orange, null, Colour.Blue, null, null, Colour.Yellow), new Block(null, null, Colour.Blue, null, null, Colour.Red), new Block(null, Colour.Blue, Colour.Yellow, null, null, Colour.Red) }, { new Block(Colour.Yellow, null, null, null, null, Colour.Orange), new Block(null, null, null, null, null, Colour.Yellow), new Block(null, Colour.Blue, null, null, null, Colour.Yellow) }, { new Block(Colour.Green, null, null, Colour.Red, null, Colour.Yellow), new Block(null, null, null, Colour.Orange, null, Colour.Blue), new Block(null, Colour.Orange, null, Colour.Yellow, null, Colour.Green) } } }); var solver = new SecondLayerSolver(cube); solver.Solve(); var thirdLayerSolver = new ThirdLayerSolver(cube); thirdLayerSolver.Solve(); Assert.That(_solvedCube, Is.EquivalentTo(cube.Cube)); }