private static ChessBoard GetHorizontalMirroredCb(ChessBoard cb)
        {
            var testCb = ChessBoardInstances.Get(1);

            for (var color = White; color <= Black; color++)
            {
                for (var piece = Pawn; piece <= King; piece++)
                {
                    testCb.Pieces[color][piece] = Util.MirrorHorizontal(cb.Pieces[color][piece]);
                }
            }

            testCb.ColorToMove = cb.ColorToMove;
            ChessBoardUtil.Init(testCb);
            testCb.MoveCounter = cb.MoveCounter;
            return(testCb);
        }
        private static ChessBoard GetVerticalMirroredCb(ChessBoard cb)
        {
            var testCb = ChessBoardInstances.Get(1);

            for (var piece = Pawn; piece <= King; piece++)
            {
                testCb.Pieces[White][piece] = Util.MirrorVertical(cb.Pieces[Black][piece]);
            }

            for (var piece = Pawn; piece <= King; piece++)
            {
                testCb.Pieces[Black][piece] = Util.MirrorVertical(cb.Pieces[White][piece]);
            }

            testCb.ColorToMove = cb.ColorToMoveInverse;
            ChessBoardUtil.Init(testCb);
            testCb.MoveCounter = cb.MoveCounter;
            return(testCb);
        }
        public static void TestValues(ChessBoard cb)
        {
            var  iterativeZk        = cb.ZobristKey;
            var  iterativeZkPawn    = cb.PawnZobristKey;
            var  iterativeAllPieces = cb.AllPieces;
            var  iterativePsqt      = cb.PsqtScore;
            var  phase            = cb.Phase;
            long materialKey      = cb.MaterialKey;
            var  testPieceIndexes = new int[64];

            Array.Copy(cb.PieceIndexes, testPieceIndexes, cb.PieceIndexes.Length);

            Assert.IsTrue(BitOperations.TrailingZeroCount(cb.Pieces[White][King]) == cb.KingIndex[White]);
            Assert.IsTrue(BitOperations.TrailingZeroCount(cb.Pieces[Black][King]) == cb.KingIndex[Black]);

            ChessBoardUtil.Init(cb);

            // zobrist keys
            Assert.IsTrue(iterativeZk == cb.ZobristKey);
            Assert.IsTrue(iterativeZkPawn == cb.PawnZobristKey);

            // combined pieces
            Assert.IsTrue(iterativeAllPieces == cb.AllPieces);

            // psqt
            Assert.IsTrue(iterativePsqt == cb.PsqtScore);

            // piece-indexes
            for (var i = 0; i < testPieceIndexes.Length; i++)
            {
                Assert.IsTrue(testPieceIndexes[i] == cb.PieceIndexes[i]);
            }

            Assert.IsTrue(phase == cb.Phase);
            Assert.IsTrue(materialKey == cb.MaterialKey);
        }