Exemplo n.º 1
0
        private async Task BuildAndSetBinaries(int directoryIndex, Mutant mutant)
        {
            try
            {
                var projectFile   = _directoryFactory.GetProjectFile(directoryIndex);
                var buildExecutor = new BuildExecutor(_settings, projectFile.FullName)
                {
                    EnableLogging          = false,
                    BaseAddress            = BaseAddress,
                    OutputPath             = $"{Path.GetDirectoryName(_source.ClassLibrary)}{directoryIndex}",
                    IntermediateOutputPath = $@"{Path.GetDirectoryName(_source.ClassLibrary)}{directoryIndex}\obj\"
                };

                await BuildProject(buildExecutor);

                var log = new StringBuilder();
                void OutputDataReceived(object sender, string args) => log.Append(args.PrintWithPreTag());

                if (buildExecutor.LastBuildStatus == BuildExecutionStatus.Failed)
                {
                    if (EnableDiagnostics)
                    {
                        log.AppendLine("<fieldset style=\"margin-bottom:10\">");
                        var lineNumber = mutant.Mutation.OriginalNode.GetLocation().GetLineSpan().StartLinePosition.Line + 1;
                        log.Append(
                            $"Method: {mutant.Method.MethodName} Line: {lineNumber.ToString().PrintImportant(color: Colors.Blue)} - {mutant.Mutation.DisplayName.Encode()}"
                            .PrintWithDateTime()
                            .PrintWithPreTag());
                        buildExecutor.OutputDataReceived += OutputDataReceived;
                    }

                    await BuildProject(buildExecutor);

                    buildExecutor.OutputDataReceived -= OutputDataReceived;
                }

                if (buildExecutor.LastBuildStatus == BuildExecutionStatus.Failed)
                {
                    if (EnableDiagnostics)
                    {
                        log.AppendLine("</fieldset>");
                        _buildDiagnostics = log.ToString();
                    }
                }

                if (buildExecutor.LastBuildStatus == BuildExecutionStatus.Success)
                {
                    UpdateSourceLibrary(directoryIndex);
                    var classLibrary = Path.Combine(
                        $"{Path.GetDirectoryName(_source.TestClaz.ClassLibrary)}_test_{directoryIndex}",
                        Path.GetFileName(_source.TestClaz.ClassLibrary) ?? throw new InvalidOperationException("Could not find class library path"));
                    await ExecuteTests(mutant, classLibrary);
                }
                else
                {
                    mutant.ResultStatus = MutantStatus.BuildError;
                    OnMutantExecuted(new MutantEventArgs
                    {
                        Mutant   = mutant,
                        TestLog  = _testDiagnostics,
                        BuildLog = _buildDiagnostics
                    });
                }
            }
            catch (Exception e)
            {
                mutant.ResultStatus = MutantStatus.BuildError;
                Trace.TraceError("Unable to Execute Mutant {0} Exception: {1}", mutant.Mutation.OriginalNode.ToString().Encode(), e);
            }
        }