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)); }
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); }