Beispiel #1
0
        private void settingsClasses_MouseUp(object sender, MouseEventArgs e)
        {
            IList <SpeciesClass> selectedClasses = new List <SpeciesClass>();

            foreach (string className in settingsClasses.CheckedItems)
            {
                SpeciesClass speciesClass
                    = _allSpeciesClasses.Single(sc => sc.Name == className);
                selectedClasses.Add(speciesClass);
            }

            _settings.SpeciesClasses = selectedClasses;

            Logger.Info($"Selected classes changed. Selected classes: {selectedClasses.Count}");
        }
        public static BackendInstance GetInstance(UIAdapter ui, Random rng = null)
        {
            Logger.Debug("Creating backend instance.");

            SpeciesFileDescription speciesFileDescription = FileSystemService.GetSpeciesMappings();

            // Map species classes to list of species
            IEnumerable <(SpeciesClass, IList <SpeciesMapping>)> speciesClassMappings =
                speciesFileDescription
                .SpeciesClassMappings
                .Select(classMapping => (
                            SpeciesFactory.GetSpeciesClass(classMapping)
                            , classMapping.SpeciesClassSpeciesMappings))
                .ToList();

            IEnumerable <Species> species
                = speciesClassMappings
                  .AsParallel()
                  .SelectMany(tuple => {
                SpeciesClass parentClass = tuple.Item1;
                IList <SpeciesMapping> speciesMappings = tuple.Item2;

                IEnumerable <Species> childrenSpecies
                    = new List <Species>(speciesMappings.Count);

                childrenSpecies = childrenSpecies
                                  .Concat(speciesMappings.Select(
                                              s => SpeciesFactory.GetSpecies(s, parentClass)));

                return(childrenSpecies);
            }).ToList();

            Random rngToUse = rng ?? new Random();

            BackendInstance instance = new BackendInstance(ui, species, rngToUse);

            Logger.Debug("Species loaded and models created.");

            return(instance);
        }
        internal static Species GetSpecies(SpeciesMapping speciesMapping, SpeciesClass speciesClass)
        {
            String name = speciesMapping.SpeciesName;
            String speciesdirectoryName       = speciesMapping.SpeciesImageDirectory;
            IEnumerable <string> speciesHints = speciesMapping.SpeciesHints.ToArray();
            String directory = Path.Combine(Constants.ImageDirectory, speciesdirectoryName);

            Logger.Debug($"Building species ${name}");

            if (!Directory.Exists(directory))
            {
                throw new FileNotFoundException($"Directory {directory} was not found.");
            }

            List <SpeciesImage> speciesImages = new List <SpeciesImage>();

            String[] files = Directory.GetFiles(directory);
            foreach (String file in files)
            {
                String fileLower = file.ToLower(CultureInfo.InvariantCulture);
                if (!Constants.ImageExtensions.Any(ext => fileLower.EndsWith(ext)))
                {
                    Logger.Warn($"Found file in species folders without correct extension: {file}");
                }
                else
                {
                    SpeciesImage speciesImage = new SpeciesImage(file);
                    speciesImages.Add(speciesImage);
                }
            }

            ISet <SpeciesClass> speciesClasses = new HashSet <SpeciesClass> {
                speciesClass
            };

            return(new Species(speciesImages.AsReadOnly(), name, speciesClasses, speciesHints));
        }
Beispiel #4
0
        public async Task ShouldRunSuccessfulGame(int questions, int choices, bool fromSameClass)
        {
            (BackendInstance backEnd, IEnumerable <SpeciesClass> allClasses, MockUI ui)
                = CreateBackend();

            IEnumerable <Species> loadedSpecies
                = backEnd.GetLoadedSpecies();

            GameSettings settings = new GameSettings {
                NumberOfQuestions       = questions,
                AllowDuplicates         = false,
                SpeciesClasses          = allClasses,
                NumberOfChoices         = choices,
                TimePerImage            = null,
                InputStyle              = InputStyle.MultiChoice,
                GetChoicesFromSameClass = fromSameClass
            };

            // Start game loop
            Task gameLoop = Task.Run(() => backEnd.StartGame(settings));

            await Task.Delay(TimeSpan.FromMilliseconds(500));

            ui.Start();

            bool answerCorrect = false;
            int  correctCount  = 0;

            for (int i = 0; i < questions; i++)
            {
                await ui.WaitState();

                if (i > 0)
                {
                    // Not first answer
                    Assert.True(ui.IsNewQuestion);

                    if (answerCorrect)
                    {
                        Assert.NotNull(ui.IsCorrect);
                        Assert.True(ui.IsCorrect.Value);
                        correctCount++;
                    }
                    else
                    {
                        Assert.NotNull(ui.IsWrong);
                        Assert.True(ui.IsWrong.Value);
                    }
                }

                Assert.NotNull(ui.Image);
                Assert.Contains(ui.Correct, ui.Alternatives);

                if (fromSameClass)
                {
                    int choiceMaxLength = settings.NumberOfChoices;
                    if (settings.GetChoicesFromSameClass)
                    {
                        Species      correctSpecies      = GetSpeciesByName(loadedSpecies, ui.Correct);
                        SpeciesClass correctSpeciesClass = correctSpecies.Classes.First();
                        choiceMaxLength =
                            Math.Min(
                                choiceMaxLength,
                                loadedSpecies.Count(
                                    s => s.Classes.Any(sc => sc == correctSpeciesClass)
                                    )
                                );
                    }
                    Assert.Equal(choiceMaxLength, ui.Alternatives.Length);

                    IList <SpeciesClass> alternativeClasses
                        = ui.Alternatives
                          .Select(
                              s => GetSpeciesByName(loadedSpecies, s))
                          .Select(s => s.Classes.First()).ToList();
                    Assert.Single(alternativeClasses.Distinct());
                }
                else
                {
                    Assert.Equal(
                        Math.Min(
                            loadedSpecies.Count()
                            , settings.NumberOfChoices)
                        , ui.Alternatives.Length);
                }

                Assert.True(ui.Image.Width > 0);
                Assert.True(ui.Image.Height > 0);

                Assert.Null(ui.ErrorMessage);
                Assert.Null(ui.GameResult);
                Assert.False(ui.IsTimeout);
                Assert.False(ui.IsEnd);

                answerCorrect = RandomBool();

                string chosenAnswer
                    = answerCorrect
                                                ? ui.Correct
                                                : ui.Alternatives.Where(a => a != ui.Correct)
                      .OrderBy(e => Guid.NewGuid()).First();

                ui.ClearState();
                ui.Choose(chosenAnswer);
            }

            await ui.WaitState();

            Assert.False(ui.IsNewQuestion);

            if (answerCorrect)
            {
                Assert.NotNull(ui.IsCorrect);
                Assert.True(ui.IsCorrect.Value);
                correctCount++;
            }
            else
            {
                Assert.NotNull(ui.IsWrong);
                Assert.True(ui.IsWrong.Value);
            }

            Assert.True(gameLoop.IsCompleted);
            Assert.False(gameLoop.IsCanceled);
            Assert.False(gameLoop.IsFaulted);

            Assert.True(ui.IsEnd);
            Assert.NotNull(ui.GameResult);
            Assert.Null(ui.ErrorMessage);

            GameResult result = ui.GameResult;

            Assert.Equal(correctCount, result.CorrectAnswers);
            Assert.Equal(questions, result.TotalAnswers);
        }