public ReportGeneratorJob(IReportGenerator reportGenerator, IHubContext <NotificationHub> hubContext,
                           ChessMetersContext chessMetersContext)
 {
     this.reportGenerator    = reportGenerator;
     this.hubContext         = hubContext;
     this.chessMetersContext = chessMetersContext;
 }
예제 #2
0
        public override void Load()
        {
            var builder = new DbContextOptionsBuilder <ChessMetersContext>();

            OptionsAction(builder);

            using var dbContext = new ChessMetersContext(builder.Options, new OperationalStoreOptionsMigrations());
            dbContext.Database.EnsureCreated();

            Data = dbContext.Settings.Count() != configValues.Count ? CreateAndSaveDefaultValues(dbContext) :
                   dbContext.Settings.ToDictionary(c => c.Id, c => c.Value);
        }
예제 #3
0
        private IDictionary <string, string> CreateAndSaveDefaultValues(ChessMetersContext dbContext)
        {
            var settingsToCreate = configValues.Where(x => !dbContext.Settings.Any(s => s.Id == x.Key));

            dbContext.Settings.AddRange(settingsToCreate.Select(kvp => new Setting
            {
                Id    = kvp.Key,
                Value = kvp.Value
            }).ToArray());

            dbContext.SaveChanges();
            return(dbContext.Settings.ToDictionary(x => x.Id, x => x.Value));
        }
예제 #4
0
        public async Task BuildEngineEvaluations_Should_EvaluateWithStockfishAndSaveToDbIfEvaluationNotFound()
        {
            using var context = new ChessMetersContext(options, new OperationalStoreOptionsMigrations());
            var engineProcess          = new EngineProcess();
            var stockfishEngine        = new StockfishEngine(engineProcess);
            var engineAnalyzeEvaluator = new EngineEvaluationBuilder(stockfishEngine, context);

            var treeMove = await context.TreeMoves.FirstAsync(x => !x.ParentTreeMoveId.HasValue);

            await engineAnalyzeEvaluator.StartNewGame(EngineConsts.defaultAnalyzeDepth);

            var result = await engineAnalyzeEvaluator.BuildEngineEvaluations(treeMove);

            Assert.NotNull(result);
            Assert.True(result.Id > 0);
        }
        public async Task Schedule_Should_ParsePGNAndScheduleReport()
        {
            using var context = new ChessMetersContext(options, new OperationalStoreOptionsMigrations());

            var engineProcess          = new EngineProcess();
            var stockfishEngine        = new StockfishEngine(engineProcess);
            var engineAnalyzeEvaluator = new EngineEvaluationBuilder(stockfishEngine, context);
            var gameAnalyzer           = new TreeMovesBuilder(context, engineAnalyzeEvaluator);

            var gameConverter = new GameConverter();

            var reportGenerator = new ReportGenerator(gameAnalyzer, null, context);
            var reportId        = await context.Reports.Select(x => x.Id).FirstAsync();

            var report = await reportGenerator.Schedule(reportId, EngineConsts.defaultAnalyzeDepth);

            Assert.NotNull(report);
        }
        public async Task BuildTree_Should_SetupTreeAndSaveToDbIfMoveNotFound()
        {
            string pgn = "[Event \"Live Chess\"] [Site \"Chess.com\"] [Date \"2020.11.25\"] [Round \"?\"] [White \"claudiuoprea\"] [Black \"Cest_Sebastian\"] [Result \"0-1\"] [ECO \"C26\"] [WhiteElo \"1174\"] [BlackElo \"1212\"] [TimeControl \"600\"] [EndTime \"5:58:12 PST\"] [Termination \"Cest_Sebastian won by resignation\"] 1. e4 {[%timestamp 1]} 1... e5 {[%timestamp 1]} 2. Bc4 {[%timestamp 1]} 2... Nf6 {[%timestamp 1]} 3. Nc3 {[%timestamp 16]} 3... Nc6 {[%timestamp 253]} 4. d3 {[%timestamp 21]} 4... Bb4 {[%timestamp 93]} 5. f4 {[%timestamp 79]} 5... Bxc3+ {[%timestamp 70]} 6. bxc3 {[%timestamp 10]} 6... O-O {[%timestamp 80]} 7. fxe5 {[%timestamp 91]} 7... Nxe5 {[%timestamp 66]} 8. Bb3 {[%timestamp 33]} 8... d6 {[%timestamp 52]} 9. Nf3 {[%timestamp 24]} 9... Bg4 {[%timestamp 27]} 10. h3 {[%timestamp 114]} 10... Bxf3 {[%timestamp 14]} 11. gxf3 {[%timestamp 39]} 11... d5 {[%timestamp 33]} 12. Rg1 {[%timestamp 107]} 12... dxe4 {[%timestamp 58]} 13. Bh6 {[%timestamp 48]} 13... Re8 {[%timestamp 135]} 14. Bxg7 {[%timestamp 126]} 14... Ng6 {[%timestamp 1]} 15. Bh6 {[%timestamp 250]} 15... exf3+ {[%timestamp 59]} 16. Kd2 {[%timestamp 49]} 16... f2 {[%timestamp 174]} 17. Rg2 {[%timestamp 187]} 17... Ne4+ {[%timestamp 237]} 18. Kc1 {[%timestamp 74]} 18... Nxc3 {[%timestamp 142]} 19. Qd2 {[%timestamp 109]} 19... f1=Q+ {[%timestamp 58]} 20. Kb2 {[%timestamp 60]} 20... Na4+ {[%timestamp 431]} 21. Bxa4 {[%timestamp 175]} 21... Qd4+ {[%timestamp 76]} 22. Ka3 {[%timestamp 128]} 22... Qc5+ {[%timestamp 114]} 23. Kb3 {[%timestamp 112]} 23... Qd5+ {[%timestamp 60]} 24. Ka3 {[%timestamp 35]} 24... Qfxg2 {[%timestamp 40]} 25. Qc3 {[%timestamp 74]} 25... Qd6+ {[%timestamp 179]} 26. Kb3 {[%timestamp 149]} 26... Qgd5+ {[%timestamp 69]} 27. Kb2 {[%timestamp 29]} 27... Qb6+ {[%timestamp 96]} 28. Bb3 {[%timestamp 52]} 28... Qdd4 {[%timestamp 1]} 29. Qxd4 {[%timestamp 1]} 29... Qxd4+ {[%timestamp 1]} 30. Ka3 {[%timestamp 31]} 0-1";

            using var context = new ChessMetersContext(options, new OperationalStoreOptionsMigrations());
            var engineProcess          = new EngineProcess();
            var stockfishEngine        = new StockfishEngine(engineProcess);
            var engineAnalyzeEvaluator = new EngineEvaluationBuilder(stockfishEngine, context);
            var gameAnalyzer           = new TreeMovesBuilder(context, engineAnalyzeEvaluator);

            var user = await context.Users.FirstAsync();

            var report = new Report
            {
                PGN         = pgn,
                Description = $"Unit test ${DateTime.Now}",
                UserId      = user.Id
            };

            await context.Reports.AddAsync(report);

            await context.SaveChangesAsync();

            var moves = await gameAnalyzer.BuildTree(EngineConsts.defaultAnalyzeDepth, new Game
            {
                ReportId = report.Id,
                Result   = "0-1",
                Moves    = "d2d4 d7d5 c2c4 c7c6 g1f3"
            });

            Assert.Equal(5, moves.Count());
            Assert.All(moves, x => Assert.NotEqual(0, x.Id));
            Assert.Null(moves.First().ParentTreeMoveId);
            Assert.NotNull(moves.Last().ParentTreeMoveId);
            Assert.NotNull(moves.Last().ParentTreeMove);
        }
예제 #7
0
 public GamesController(ChessMetersContext chessMetersContext)
 {
     this.chessMetersContext = chessMetersContext;
 }
예제 #8
0
 public TreeMovesBuilder(ChessMetersContext chessMetersContext, IEngineEvaluationBuilder engineAnalyzeEvaluator)
 {
     this.chessMetersContext     = chessMetersContext;
     this.engineAnalyzeEvaluator = engineAnalyzeEvaluator;
 }
예제 #9
0
 public ReportsController(ChessMetersContext chessMetersContext, IGameConverter gameConverter, ISchedulerFactory schedulerFactory)
 {
     this.chessMetersContext = chessMetersContext;
     this.gameConverter      = gameConverter;
     this.schedulerFactory   = schedulerFactory;
 }
예제 #10
0
 public ReportGenerator(ITreeMovesBuilder treeMoveBuilder, IFlagBuilder flagBuilder, ChessMetersContext chessMetersContext)
 {
     this.treeMoveBuilder    = treeMoveBuilder;
     this.flagBuilder        = flagBuilder;
     this.chessMetersContext = chessMetersContext;
 }
예제 #11
0
 public EngineEvaluationBuilder(IEngine engine, ChessMetersContext chessMetersContext)
 {
     this.engine             = engine;
     this.chessMetersContext = chessMetersContext;
 }
예제 #12
0
 public FlagBuilder(IBoardState boardState, IAssemblyLoader assemblyLoader, ChessMetersContext chessMetersContext)
 {
     this.boardState         = boardState;
     this.assemblyLoader     = assemblyLoader;
     this.chessMetersContext = chessMetersContext;
 }