public void RandomTest()
        {
            Random random      = new Random(7777777);
            int    repetitions = 20;

            TimeSpan timeout        = TimeSpan.FromSeconds(1);
            int      returnLength   = 18;
            int      requiredLength = 20;

            for (int repetition = 0; repetition < repetitions; repetition++)
            {
                Alg       scramble = Alg.FromRandomMoves(random.Next(20, 30), random);
                CubieCube cube     = CubieCube.FromAlg(scramble);

                Alg solution = TwoPhaseSolver.FindSolution(cube, timeout, returnLength, requiredLength);
                Console.WriteLine("\nScramble: " + scramble + "\nSolution: " + solution + "\nLength: " + solution.Length);

                Assert.IsTrue(solution.Length <= 20);

                CubieCube expected = CubieCube.CreateSolved();
                CubieCube result   = CubieCube.CreateSolved();

                result.ApplyAlg(scramble);
                result.ApplyAlg(solution);

                Assert.AreEqual(expected, result);
            }
        }
示例#2
0
        public void EquatorPermutationCoordTest() //Tests GetEquatorPermutationCoord, SetEquatorPermutationCoord
        {
            Random random      = new Random(7777777);
            int    length      = 50;
            int    repetitions = 50;

            //if solved permutation corresponds to the coordinate 0
            //SetEquatorPermutationCoord()
            CubieCube expected = CubieCube.CreateSolved();
            CubieCube result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));

            Coordinates.SetEquatorOrder(result, 0);
            CubingAssert.HaveEqualEquatorEdgePermutation(expected, result);

            expected = CubieCube.FromAlg(Alg.FromString("R2 L2"));
            result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            Coordinates.SetEquatorOrder(result, Coordinates.NumEquatorOrders - 1);

            //GetEquatorPermutationCoord()
            result = CubieCube.CreateSolved();
            Assert.AreEqual(0, Coordinates.GetEquatorOrder(result));

            result.ApplyAlg(Alg.FromString("F' R' B' D' L2"));
            Assert.AreEqual(0, Coordinates.GetEquatorOrder(result));

            //apply B1
            int       expectedCoord = 17;
            CubieCube cube          = CubieCube.CreateSolved();

            cube.ApplyMove(Move.B1);
            int resultCoord = Coordinates.GetEquatorOrder(cube);

            Assert.AreEqual(expectedCoord, resultCoord);

            //apply B2
            expectedCoord = 6;
            cube          = CubieCube.CreateSolved();
            cube.ApplyMove(Move.B2);
            resultCoord = Coordinates.GetEquatorOrder(cube);
            Assert.AreEqual(expectedCoord, resultCoord);

            //if applying GetEquatorPermutationCoord() and SetEquatorPermutationCoord() results in the same array as at the beginning
            for (int repetition = 0; repetition < repetitions; repetition++)
            {
                expected = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
                result   = CubieCube.CreateSolved();

                int coord = Coordinates.GetEquatorOrder(expected);
                Coordinates.SetEquatorOrder(result, coord);

                CubingAssert.HaveEqualEquatorEdgePermutation(expected, result);
            }

            //exceptions
            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.GetEquatorOrder(null));

            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.SetEquatorOrder(null, 0));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEquatorOrder(CubieCube.CreateSolved(), -1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEquatorOrder(CubieCube.CreateSolved(), Coordinates.NumEquatorOrders));
        }
示例#3
0
        public void StaticTest(string algString)
        {
            Alg       scramble = Alg.FromString(algString);
            CubieCube cube     = CubieCube.FromAlg(scramble);

            TimeSpan timeout       = TimeSpan.FromSeconds(1);
            float    returnValue   = 4000;
            float    requiredValue = 5000;

            float[] weights =
            {
                169.658122242946f,
                253.796705882179f,
                211.084512473536f,
                206.193406852305f,
                299.809258427086f,
                155.496912851115f,
                158.690899467791f,
                281.70422762001f,
                346.448146439892f,
                274.885031555195f,
                311.019164835258f,
                258.486161100002f,
                196.885474673572f,
                275.657440421246f,
                214.624405800259f,
                322.649818802591f,
                354.012863621357f,
                321.02200029978f
            };

            float[] weightedPhase2PruningTable = WeightedPruningTables.CreateWeightedPhase2CornerEquatorTable(weights);

            Alg solution = WeightedTwoPhaseSolver.FindSolution(cube, timeout, returnValue, requiredValue, weights, weightedPhase2PruningTable);

            Console.WriteLine("Scramble: " + scramble + "\nSolution: " + solution + "\nLength: " + solution.Length);

            Assert.IsTrue(solution.Select(move => weights[(int)move]).Sum() <= requiredValue);

            CubieCube expected = CubieCube.CreateSolved();
            CubieCube result   = CubieCube.CreateSolved();

            result.ApplyAlg(scramble);
            result.ApplyAlg(solution);

            Assert.AreEqual(expected, result);
        }
示例#4
0
        public void SexyMoveTest(Action <CubieCube, CubieCube> test)
        {
            Alg sexyMove = Alg.FromString("R U R' U'");

            foreach (Rotation rotation in Enum.GetValues(typeof(Rotation)))
            {
                CubieCube expected = CubieCube.CreateSolved();
                CubieCube result   = CubieCube.CreateSolved();
                result.ApplyAlg(sexyMove.Rotate(rotation) * 6);

                test(expected, result);
            }
        }
        public void StaticTest(string algString)
        {
            Alg       scramble = Alg.FromString(algString);
            CubieCube cube     = CubieCube.FromAlg(scramble);

            TimeSpan timeout        = TimeSpan.FromSeconds(1);
            int      returnLength   = 0;
            int      requiredLength = 20;

            Alg solution = TwoPhaseSolver.FindSolution(cube, timeout, returnLength, requiredLength);

            Console.WriteLine("Scramble: " + scramble + "\nSolution: " + solution + "\nLength: " + solution.Length);

            Assert.IsTrue(solution.Length <= 20);

            CubieCube expected = CubieCube.CreateSolved();
            CubieCube result   = CubieCube.CreateSolved();

            result.ApplyAlg(scramble);
            result.ApplyAlg(solution);

            Assert.AreEqual(expected, result);
        }
示例#6
0
        public void Inverse()
        {
            CubieCube expected    = CubieCube.CreateSolved();
            Random    random      = new Random(7777777);
            int       length      = 50;
            int       repetitions = 50;

            for (int repetition = 0; repetition < repetitions; repetition++)
            {
                Alg       alg    = Alg.FromRandomMoves(length, random);
                CubieCube result = CubieCube.FromAlg(alg);
                result.Inverse();
                result.ApplyAlg(alg);

                Assert.AreEqual(expected, result);
            }
        }
示例#7
0
        public void MoveReplacementTest(Action <CubieCube, CubieCube> test)
        {
            Alg uReplacementAlg = Alg.FromString("R L' F2 B2 R L' D L R' B2 F2 L R'");

            foreach (Move move in Enum.GetValues(typeof(Move)))
            {
                foreach (Rotation rotation in Enum.GetValues(typeof(Rotation)))
                {
                    if (Face.U.Rotate(rotation) == move.Face())
                    {
                        CubieCube result = CubieCube.CreateSolved();
                        result.ApplyMove(move);
                        CubieCube expected = CubieCube.CreateSolved();
                        expected.ApplyAlg(uReplacementAlg.Rotate(rotation) * move.QuarterTurns());

                        test(expected, result);
                    }
                }
            }
        }
示例#8
0
        public void ApplyMovesTest()
        {
            Random random = new Random(7777777);
            int    length = 50;

            Alg alg = Alg.FromRandomMoves(length, random);

            CubieCube expected = CubieCube.CreateSolved();

            expected.ApplyAlg(alg);

            CubieCube result = CubieCube.CreateSolved();

            foreach (Move move in alg)
            {
                result.ApplyMove(move);
            }

            Assert.AreEqual(expected, result);
            Assert.ThrowsException <ArgumentNullException>(()
                                                           => CubieCube.CreateSolved().ApplyAlg(null));
        }