public void TestPerft(PerftPosition perftPosition, bool enableParallelism, ExpectedPerftResult expectedResult) { var fen = PerftPositionToFenMap[perftPosition]; var gameBoard = new GameBoard(fen, PerformInternalBoardValidation); var flags = PerftFlags.IncludeDivideMap; if (enableParallelism) { flags |= PerftFlags.EnableParallelism; } var includeExtraCountTypes = expectedResult.CheckCount.HasValue || expectedResult.CheckmateCount.HasValue; if (includeExtraCountTypes) { flags |= PerftFlags.IncludeExtraCountTypes; } #region For Finding Bugs in Move Generator var extraMoves = new GameMove[] { }; gameBoard = extraMoves.Aggregate(gameBoard, (current, extraMove) => current.MakeMove(extraMove)); #endregion var actualResult = gameBoard.Perft(expectedResult.Depth - extraMoves.Length, flags); string extraInfo = null; if (actualResult.Flags.HasFlag(PerftFlags.IncludeDivideMap)) { var divideResult = actualResult .DividedMoves .OrderBy(pair => pair.Key.ToString()) .Select(pair => $@" {pair.Key} -> {pair.Value}") .Join(Environment.NewLine); extraInfo = $@"{Environment.NewLine}Divide ({actualResult.DividedMoves.Count}):{Environment.NewLine}{ divideResult}"; } Console.WriteLine( @"[{0}] ({1}) {2} {{ {3} }} ({4}) : {5}{6}", MethodBase.GetCurrentMethod().GetQualifiedName(), ChessHelper.PlatformVersion, perftPosition.GetName(), fen, actualResult.Flags, actualResult, extraInfo); Console.WriteLine(); AssertPerftResult(actualResult, expectedResult); }