public void OpenFile(string assemblyName, string qualifiedClassName, int file, int line)
        {
            // Note : There may be more than one file; e.g. in the case of partial classes

            var sourceFiles = FCCEngine.GetSourceFiles(assemblyName, qualifiedClassName);

            if (!sourceFiles.Any())
            {
                var message = $"Source File(s) Not Found : [{ assemblyName }]{ qualifiedClassName }";
                Logger.Log(message);
                MessageBox.Show(message);
                return;
            }

            ThreadHelper.JoinableTaskFactory.Run(async() =>
            {
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                _dte.MainWindow.Activate();

                foreach (var sourceFile in sourceFiles)
                {
                    _dte.ItemOperations.OpenFile(sourceFile, Constants.vsViewKindCode);

                    if (line != 0)
                    {
                        ((TextSelection)_dte.ActiveDocument.Selection).GotoLine(line, false);
                    }
                }
            });
        }
Exemple #2
0
        public void OpenFile(string htmlFilePath, int file, int line)
        {
            // Note : There may be more than one file; e.g. in the case of partial classes

            var htmlFileName = Path.GetFileNameWithoutExtension(htmlFilePath);
            var sourceFiles  = FCCEngine.GetSourceFilesFromReportGeneratorHtmlFileName(htmlFileName);

            if (!sourceFiles.Any())
            {
                var message = $"Not Found : { htmlFileName }";
                Logger.Log(message);
                MessageBox.Show(message);
                return;
            }

            ThreadHelper.JoinableTaskFactory.Run(async() =>
            {
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                _dte.MainWindow.Activate();

                foreach (var sourceFile in sourceFiles)
                {
                    _dte.ItemOperations.OpenFile(sourceFile, Constants.vsViewKindCode);

                    if (line != 0)
                    {
                        ((TextSelection)_dte.ActiveDocument.Selection).GotoLine(line, false);
                    }
                }
            });
        }
        internal TestContainerDiscoverer
        (
            [Import(typeof(IOperationState))]
            IOperationState operationState,

            [Import(typeof(SVsServiceProvider))]
            IServiceProvider serviceProvider
        )
        {
            _serviceProvider = serviceProvider;

            new Thread(() =>
            {
                try
                {
                    Logger.Initialize(_serviceProvider);

                    FCCEngine.Initialize();
                    Initialize(_serviceProvider);
                    TestContainersUpdated.ToString();
                    operationState.StateChanged += OperationState_StateChanged;

                    Logger.Log($"Initialized");
                }
                catch (Exception exception)
                {
                    Logger.Log($"Failed Initialization", exception);
                }
            }).Start();
        }
Exemple #4
0
        public void OpenFile(string htmlFilePath, int file, int line)
        {
            var htmlFileName = Path.GetFileNameWithoutExtension(htmlFilePath);
            var csFileName   = FCCEngine.GetSourceFileNameFromReportGeneratorHtmlFileName(htmlFileName);

            if (string.IsNullOrWhiteSpace(csFileName))
            {
                var message = $"Not Found : { htmlFileName }";
                Logger.Log(message);
                MessageBox.Show(message);
                return;
            }

            ThreadHelper.JoinableTaskFactory.Run(async() =>
            {
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                _dte.MainWindow.Activate();

                _dte.ItemOperations.OpenFile(csFileName, Constants.vsViewKindCode);

                if (line != 0)
                {
                    ((TextSelection)_dte.ActiveDocument.Selection).GotoLine(line, false);
                }
            });
        }
Exemple #5
0
        IEnumerable <ITagSpan <T> > ITagger <T> .GetTags(NormalizedSnapshotSpanCollection spans)
        {
            var result = new List <ITagSpan <T> >();

            if (spans == null)
            {
                return(result);
            }

            foreach (var span in spans)
            {
                if (!span.Snapshot.TextBuffer.Properties.TryGetProperty(typeof(ITextDocument), out ITextDocument document))
                {
                    continue;
                }

                var startLineNumber = span.Start.GetContainingLine().LineNumber + 1;
                var endLineNumber   = span.End.GetContainingLine().LineNumber + 1;
                var coverageLines   = FCCEngine.GetLines(document.FilePath, startLineNumber, endLineNumber);

                foreach (var coverageLine in coverageLines)
                {
                    var tag      = new GlyphTag(coverageLine);
                    var tagSpan  = new TagSpan <GlyphTag>(span, tag);
                    var iTagSpan = tagSpan as ITagSpan <T>;
                    result.Add(iTagSpan);
                }
            }

            return(result);
        }
        public void SetUp()
        {
            mocker = new AutoMoqer();
            var mockDisposeAwareTaskRunner = mocker.GetMock <IDisposeAwareTaskRunner>();

            mockDisposeAwareTaskRunner.Setup(runner => runner.RunAsync(It.IsAny <Func <Task> >())).Callback <Func <Task> >(async taskProvider => await taskProvider());
            fccEngine = mocker.Create <FCCEngine>();

            var mockedAppOptions = mocker.GetMock <IAppOptions>();

            mockedAppOptions.Setup(x => x.RunMsCodeCoverage).Returns(RunMsCodeCoverage.No);
            var mockAppOptionsProvider = mocker.GetMock <IAppOptionsProvider>();

            mockAppOptionsProvider.Setup(x => x.Get()).Returns(mockedAppOptions.Object);
        }
        public void SetUp()
        {
            updatedMarginTags           = false;
            mocker                      = new AutoMoqer();
            fccEngine                   = mocker.Create <FCCEngine>();
            fccEngine.UpdateMarginTags += (UpdateMarginTagsEventArgs e) =>
            {
                updatedMarginTags = true;
            };


            fccEngine.UpdateOutputWindow += (UpdateOutputWindowEventArgs e) =>
            {
                htmlContent = e.HtmlContent;
            };
        }
 private void StopCoverageProcess()
 {
     try
     {
         _reloadCoverageThread?.Abort();
     }
     catch
     {
         // ignore
     }
     finally
     {
         _reloadCoverageThread = null;
         FCCEngine.ClearProcesses();
     }
 }
        public void SetUp()
        {
            mocker    = new AutoMoqer();
            fccEngine = mocker.Create <FCCEngine>();

            raisedUpdateMarginTags   = false;
            raisedUpdateOutputWindow = false;
            tempReportGeneratedHtml  = null;
            htmlContent = null;

            fccEngine.UpdateMarginTags += (UpdateMarginTagsEventArgs e) =>
            {
                raisedUpdateMarginTags = true;
            };

            fccEngine.UpdateOutputWindow += (UpdateOutputWindowEventArgs e) =>
            {
                raisedUpdateOutputWindow = true;
                htmlContent = e.HtmlContent;
            };
        }
 public void SetUp()
 {
     updatedMarginTags = false;
     mocker            = new AutoMoqer();
     fccEngine         = mocker.Create <FCCEngine>();
 }
        private void OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
        {
            try
            {
                if (e.State == TestOperationStates.TestExecutionStarting)
                {
                    StopCoverageProcess();                     // just to be sure
                }

                if (e.State == TestOperationStates.TestExecutionFinished)
                {
                    var settings = AppOptions.Get();

                    if (!settings.Enabled)
                    {
                        FCCEngine.CoverageLines.Clear();
                        UpdateMarginTags?.Invoke(this, null);
                        UpdateOutputWindow?.Invoke(this, null);
                        return;
                    }

                    Logger.Log("================================== START ==================================");

                    var darkMode = CurrentTheme.Equals("Dark", StringComparison.OrdinalIgnoreCase);

                    CoverageProject[] projects = null;
                    try
                    {
                        var testConfiguration = new Operation(e.Operation).Configuration;

                        var userRunSettings      = testConfiguration.UserRunSettings;
                        var runSettingsRetriever = new RunSettingsRetriever();
                        var testContainers       = testConfiguration.Containers;

                        projects = testConfiguration.Containers.Select(container =>
                        {
                            var project         = new CoverageProject();
                            project.ProjectName = container.ProjectName;
                            project.TestDllFile = container.Source;
                            project.Is64Bit     = container.TargetPlatform.ToString().ToLower().Equals("x64");

                            var containerData       = container.ProjectData;
                            project.ProjectFile     = container.ProjectData.ProjectFilePath;
                            project.RunSettingsFile = ThreadHelper.JoinableTaskFactory.Run(() => runSettingsRetriever.GetRunSettingsFileAsync(userRunSettings, containerData));
                            return(project);
                        }).ToArray();
                    }catch (Exception exc)
                    {
                        throw new Exception("Error test container discoverer reflection", exc);
                    }


                    _reloadCoverageThread = new Thread(() =>
                    {
                        try
                        {
                            // compute coverage

                            FCCEngine.ReloadCoverage(projects, darkMode);

                            // update margins

                            {
                                UpdateMarginTagsEventArgs updateMarginTagsEventArgs = null;

                                try
                                {
                                    updateMarginTagsEventArgs = new UpdateMarginTagsEventArgs
                                    {
                                    };
                                }
                                catch
                                {
                                    // ignore
                                }
                                finally
                                {
                                    UpdateMarginTags?.Invoke(this, updateMarginTagsEventArgs);
                                }
                            }

                            // update output window

                            {
                                UpdateOutputWindowEventArgs updateOutputWindowEventArgs = null;

                                try
                                {
                                    updateOutputWindowEventArgs = new UpdateOutputWindowEventArgs
                                    {
                                        HtmlContent = File.ReadAllText(FCCEngine.HtmlFilePath)
                                    };
                                }
                                catch
                                {
                                    // ignore
                                }
                                finally
                                {
                                    UpdateOutputWindow?.Invoke(this, updateOutputWindowEventArgs);
                                }
                            }

                            // log

                            Logger.Log("================================== DONE ===================================");
                        }
                        catch (Exception exception)
                        {
                            if (!(exception is ThreadAbortException) && _reloadCoverageThread != null)
                            {
                                Logger.Log("Error", exception);
                                Logger.Log("================================== ERROR ==================================");
                            }
                        }
                    });

                    _reloadCoverageThread.Start();
                }
            }
            catch (Exception exception)
            {
                Logger.Log("Error processing unit test events", exception);
            }
        }
        private void OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
        {
            try
            {
                if (e.State == TestOperationStates.TestExecutionCanceling)
                {
                    FCCEngine.StopCoverage();
                }

                if (e.State == TestOperationStates.TestExecutionStarting)
                {
                    FCCEngine.StopCoverage();
                    FCCEngine.TryReloadCoverage(settings =>
                    {
                        if (!settings.RunInParallel)
                        {
                            return(null);
                        }
                        return(GetCoverageProjects(new Operation(e.Operation).Configuration));
                    });
                }

                if (e.State == TestOperationStates.TestExecutionFinished)
                {
                    FCCEngine.TryReloadCoverage(settings =>
                    {
                        if (settings.RunInParallel)
                        {
                            return(null);
                        }

                        var operation = new Operation(e.Operation);
                        if (!settings.RunWhenTestsFail && operation.Response.FailedTests > 0)
                        {
                            Logger.Log($"Skipping coverage due to failed tests.  Option {nameof(AppOptions.RunWhenTestsFail)} is false");
                            return(null);
                        }

                        var totalTests         = operation.TotalTests;
                        var runWhenTestsExceed = settings.RunWhenTestsExceed;
                        if (totalTests > 0) // in case this changes to not reporting total tests
                        {
                            if (totalTests <= runWhenTestsExceed)
                            {
                                Logger.Log($"Skipping coverage as total tests ({totalTests}) <= {nameof(AppOptions.RunWhenTestsExceed)} ({runWhenTestsExceed})");
                                return(null);
                            }
                        }

                        return(GetCoverageProjects(operation.Configuration));
                    });
                }
            }
            catch (PropertyDoesNotExistException propertyDoesNotExistException)
            {
                Logger.Log("Error test container discoverer reflection");
                throw new Exception(propertyDoesNotExistException.Message);
            }
            catch (Exception exception)
            {
                Logger.Log("Error processing unit test events", exception);
            }
        }
        private void OperationState_StateChanged(object sender, OperationStateChangedEventArgs e)
        {
            try
            {
                if (e.State == TestOperationStates.TestExecutionStarting)
                {
                    try
                    {
                        _reloadCoverageThread?.Abort();
                    }
                    catch
                    {
                        // ignore
                    }
                    finally
                    {
                        _reloadCoverageThread = null;
                        FCCEngine.ClearProcesses();
                    }
                }

                if (e.State == TestOperationStates.TestExecutionFinished)
                {
                    var settings = AppOptions.Get();

                    if (!settings.Enabled)
                    {
                        FCCEngine.CoverageLines.Clear();
                        UpdateMarginTags?.Invoke(this, null);
                        UpdateOutputWindow?.Invoke(this, null);
                        return;
                    }

                    Logger.Log("================================== START ==================================");

                    var operationType     = e.Operation.GetType();
                    var darkMode          = CurrentTheme.Equals("Dark", StringComparison.OrdinalIgnoreCase);
                    var testConfiguration = (operationType.GetProperty("Configuration") ?? operationType.GetProperty("Configuration", BindingFlags.Instance | BindingFlags.NonPublic)).GetValue(e.Operation);
                    var testContainers    = ((IEnumerable <object>)testConfiguration.GetType().GetProperty("Containers").GetValue(testConfiguration)).ToArray();
                    var projects          = new List <CoverageProject>();

                    foreach (var container in testContainers)
                    {
                        var project           = new CoverageProject();
                        var containerType     = container.GetType();
                        var containerData     = containerType.GetProperty("ProjectData").GetValue(container);
                        var containerDataType = containerData.GetType();

                        project.ProjectGuid = containerType.GetProperty("ProjectGuid").GetValue(container).ToString();
                        project.ProjectName = containerType.GetProperty("ProjectName").GetValue(container).ToString();
                        project.TestDllFileInOutputFolder = containerType.GetProperty("Source").GetValue(container).ToString();
                        project.TestDllCompilationMode    = AssemblyUtil.GetCompilationMode(project.TestDllFileInOutputFolder);
                        project.ProjectFile = containerDataType.GetProperty("ProjectFilePath", BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic).GetValue(containerData).ToString();

                        var defaultOutputFolder = Path.GetDirectoryName(containerDataType.GetProperty("DefaultOutputPath", BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic).GetValue(containerData).ToString());
                        project.WorkFolder = Path.Combine(Path.GetDirectoryName(defaultOutputFolder), "fine-code-coverage");

                        projects.Add(project);
                    }

                    _reloadCoverageThread = new Thread(() =>
                    {
                        try
                        {
                            // compute coverage

                            FCCEngine.ReloadCoverage(projects.ToArray(), darkMode);

                            // update margins

                            {
                                UpdateMarginTagsEventArgs updateMarginTagsEventArgs = null;

                                try
                                {
                                    updateMarginTagsEventArgs = new UpdateMarginTagsEventArgs
                                    {
                                    };
                                }
                                catch
                                {
                                    // ignore
                                }
                                finally
                                {
                                    UpdateMarginTags?.Invoke(this, updateMarginTagsEventArgs);
                                }
                            }

                            // update output window

                            {
                                UpdateOutputWindowEventArgs updateOutputWindowEventArgs = null;

                                try
                                {
                                    updateOutputWindowEventArgs = new UpdateOutputWindowEventArgs
                                    {
                                        HtmlContent = File.ReadAllText(FCCEngine.HtmlFilePath)
                                    };
                                }
                                catch
                                {
                                    // ignore
                                }
                                finally
                                {
                                    UpdateOutputWindow?.Invoke(this, updateOutputWindowEventArgs);
                                }
                            }

                            // log

                            Logger.Log("================================== DONE ===================================");
                        }
                        catch (Exception exception)
                        {
                            if (!(exception is ThreadAbortException) && _reloadCoverageThread != null)
                            {
                                Logger.Log("Error", exception);
                                Logger.Log("================================== ERROR ==================================");
                            }
                        }
                    });

                    _reloadCoverageThread.Start();
                }
            }
            catch (Exception exception)
            {
                Logger.Log("Error processing unit test events", exception);
            }
        }