public async Task BtnApplyMutantsClick() { _numberOfMutantsExecutingInParallel = Convert.ToByte(NumberOfMutantsExecutedInParallel); if (SelectedMutants.All(x => x.Level != MutantLevel.Mutant)) { if (!_silently) { MessageBoxService.Show("Click Find Mutants Or Select At Least One Mutant"); } return; } try { await InitializeMutants((ObservableCollection <object>) _selectedMutators); IsSplashScreenShown = true; if (ChkEnableDiagnostic.IsChecked) { _testDiagnosticDocument = MutationDocumentManagerService.CreateDocument( nameof(CommandPromptOutputViewer), _testDiagnosticDocumentViewModel); _buildDiagnosticDocument = MutationDocumentManagerService.CreateDocument( nameof(CommandPromptOutputViewer), _buildDiagnosticDocumentViewModel); _testDiagnosticDocument.Show(); _buildDiagnosticDocument.Show(); } MutantOperationsEnabled = false; ProgressBarMutationVisible = Visibility.Visible; MinimumProgress = 0; CurrentProgress = 0; var stopWatch = new Stopwatch(); stopWatch.Start(); _mutationProcessLog = new StringBuilder(); if (!_source.MethodDetails.SelectMany(x => x.Mutants).Any()) { if (!_silently) { MessageBoxService.Show(MutantsNotExist); } return; } var selectedMutants = SelectedMutants.Where(x => x.Level == MutantLevel.Mutant).ToList(); foreach (var mutant in _source.MethodDetails.SelectMany(x => x.Mutants)) { if (selectedMutants.All(x => x.MutantId != mutant.Id && mutant.ResultStatus == MutantStatus.NotRun)) { mutant.ResultStatus = MutantStatus.Skipped; } } _directoryFactory.BuildExtensions = BuildExtensions; _directoryFactory.NumberOfMutantsExecutingInParallel = _numberOfMutantsExecutingInParallel; _directoryFactory.DeleteDirectories(); await _directoryFactory.PrepareDirectoriesAndFiles(); var methodDetails = _source.MethodDetails.Where(x => x.TestMethods.Any()).ToList(); MaximumProgress = methodDetails.SelectMany(x => x.NotRunMutants).Count(); if (!methodDetails.Any()) { if (!_silently) { MessageBoxService.Show(NoAnyTestsExist); } return; } IsSplashScreenShown = false; _mutantExecutor = new MutantExecutor(_source, Settings) { EnableDiagnostics = ChkEnableDiagnostic.IsChecked, NumberOfMutantsExecutingInParallel = _numberOfMutantsExecutingInParallel, UseClassFilter = ChkUseClassFilter.IsChecked || _source.TestClaz.MethodDetails.Count > Convert.ToInt32(Settings.UseClassFilterTestsThreshold) || _source.TestClaz.BaseClass != null, BaseAddress = Settings.ServiceAddress }; if (_silently) { _mutantExecutor.UseClassFilter = true; } _testDiagnosticDocumentViewModel.CommandPromptOutput = HtmlTemplate; _buildDiagnosticDocumentViewModel.CommandPromptOutput = HtmlTemplate; void MutantExecutorOnMutantExecuted(object sender, MutantEventArgs e) { if (ChkEnableDiagnostic.IsChecked) { _testDiagnosticDocumentViewModel.CommandPromptOutput += e.TestLog; _buildDiagnosticDocumentViewModel.CommandPromptOutput += e.BuildLog; } CurrentProgress++; } _mutantExecutor.MutantExecuted += MutantExecutorOnMutantExecuted; await _mutantExecutor.ExecuteMutants(); _mutationProcessLog.Append(_mutantExecutor.LastExecutionOutput); _mutantExecutor.MutantExecuted -= MutantExecutorOnMutantExecuted; if (!_silently && ChkAnalyzeExternalCoverage.IsChecked && _source.ExternalCoveredClassesIncluded.Any()) { const string title = "Analyzing External Coverage"; var externalCoverageLog = _outputLogger.GetLogFromOutput(title, string.Empty); externalCoverageLog.CommandPromptOutput = HtmlTemplate; var chalkHtml = new ChalkHtml(); void OutputDataReceived(object sender, string output) => externalCoverageLog.CommandPromptOutput += output; chalkHtml.OutputDataReceived += OutputDataReceived; var mutantAnalyzer = new MutantAnalyzer(chalkHtml, Settings) { BuildInReleaseMode = _source.BuildInReleaseMode, ConcurrentTestRunners = _numberOfMutantsExecutingInParallel, EnableDiagnostics = ChkEnableDiagnostic.IsChecked, ExecuteAllTests = ChkExecuteAllTests.IsChecked, IncludeNestedClasses = _source.IncludeNestedClasses, IncludePartialClasses = _source.TestClaz.PartialClassNodesAdded, SourceProjectLibrary = _source.ClassLibrary, SurvivedThreshold = 0.01, TestClass = _source.TestClaz.FilePath, TestProject = _source.TestClaz.ClassProject, TestProjectLibrary = _source.TestClaz.ClassLibrary, UseClassFilter = ChkUseClassFilter.IsChecked, X64TargetPlatform = _source.X64TargetPlatform, UseExternalCodeCoverage = true, ProgressIndicator = '*', MutantsPerLine = Convert.ToInt32(MutantsPerLine) }; var document = MutationDocumentManagerService.CreateDocument(nameof(CommandPromptOutputViewer), externalCoverageLog); document.Title = title; document.Show(); foreach (var acc in _source.ExternalCoveredClassesIncluded) { mutantAnalyzer.ExternalCoveredMutants.AddRange(acc.MutantsLines); var projectFile = new FileInfo(acc.ClassPath).FindProjectFile(); mutantAnalyzer.SourceProjectLibrary = projectFile.FindLibraryPath()?.FullName; if (!string.IsNullOrWhiteSpace(mutantAnalyzer.SourceProjectLibrary)) { var accClass = await mutantAnalyzer.Analyze( acc.ClassPath, acc.ClassName, projectFile.FullName); accClass.CalculateMutationScore(); if (accClass.MutationScore.Survived == 0) { acc.ZeroSurvivedMutants = true; } } } chalkHtml.OutputDataReceived -= OutputDataReceived; mutantAnalyzer.ExternalCoveredMutants.Clear(); } stopWatch.Stop(); _mutantExecutor.PrintMutatorSummary(_mutationProcessLog); _mutantExecutor.PrintClassSummary(_mutationProcessLog); _mutationProcessLog.AppendLine("<fieldset style=\"margin-bottom:10; margin-top:10;\">"); _mutationProcessLog.AppendLine("Execution Time: ".PrintImportantWithLegend()); _mutationProcessLog.Append($"{stopWatch.Elapsed}".PrintWithPreTagWithMarginImportant()); _mutationProcessLog.AppendLine("</fieldset>"); _previousMutants.Clear(); foreach (var mutant in _source.MethodDetails.SelectMany(x => x.Mutants)) { var key = $"{mutant.Mutation.Location} - {mutant.Mutation.DisplayName}"; if (!_previousMutants.ContainsKey(key)) { _previousMutants.Add(key, mutant.ResultStatus); } } PrintMutants(); RunFileWatcherService(); } catch (Exception exception) { Trace.TraceError("Unknown Exception Occurred by Mutation Analyzer {0}", exception.StackTrace); MessageBoxService.Show(exception.Message); } finally { MutantOperationsEnabled = true; IsSplashScreenShown = false; ProgressBarMutationVisible = Visibility.Hidden; _directoryFactory.DeleteDirectories(); _idle = true; _silently = false; var notification = NotificationService.CreatePredefinedNotification(MutationIsCompletedNotification, string.Empty, string.Empty); await notification.ShowAsync(); } }