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));
        }
예제 #6
0
        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));
        }