Ejemplo n.º 1
0
        public void TestCleared()
        {
            using (var workspace = new TestWorkspace(TestExportProvider.ExportProviderWithCSharpAndVisualBasic))
            {
                var mutex     = new ManualResetEvent(false);
                var document  = workspace.CurrentSolution.AddProject("TestProject", "TestProject", LanguageNames.CSharp).AddDocument("TestDocument", string.Empty);
                var document2 = document.Project.AddDocument("TestDocument2", string.Empty);

                var diagnosticService = new DiagnosticService(AsynchronousOperationListenerProvider.NullProvider);

                var source1 = new TestDiagnosticUpdateSource(support: false, diagnosticData: null);
                diagnosticService.Register(source1);

                var source2 = new TestDiagnosticUpdateSource(support: false, diagnosticData: null);
                diagnosticService.Register(source2);

                diagnosticService.DiagnosticsUpdated += MarkSet;

                // add bunch of data to the service for both sources
                RaiseDiagnosticEvent(mutex, source1, workspace, document.Project.Id, document.Id, Tuple.Create(workspace, document));
                RaiseDiagnosticEvent(mutex, source1, workspace, document.Project.Id, document.Id, Tuple.Create(workspace, document.Project, document));
                RaiseDiagnosticEvent(mutex, source1, workspace, document2.Project.Id, document2.Id, Tuple.Create(workspace, document2));

                RaiseDiagnosticEvent(mutex, source2, workspace, document.Project.Id, null, Tuple.Create(workspace, document.Project));
                RaiseDiagnosticEvent(mutex, source2, workspace, null, null, Tuple.Create(workspace));

                // confirm data is there.
                var data1 = diagnosticService.GetDiagnostics(workspace, null, null, null, false, CancellationToken.None);
                Assert.Equal(5, data1.Count());

                diagnosticService.DiagnosticsUpdated -= MarkSet;

                // confirm clear for a source
                mutex.Reset();
                var count = 0;
                diagnosticService.DiagnosticsUpdated += MarkCalled;

                source1.RaiseDiagnosticsClearedEvent();

                mutex.WaitOne();

                // confirm there are 2 data left
                var data2 = diagnosticService.GetDiagnostics(workspace, null, null, null, false, CancellationToken.None);
                Assert.Equal(2, data2.Count());

                void MarkCalled(object sender, DiagnosticsUpdatedArgs args)
                {
                    // event is serialized. no concurrent call
                    if (++count == 3)
                    {
                        mutex.Set();
                    }
                }

                void MarkSet(object sender, DiagnosticsUpdatedArgs args)
                {
                    mutex.Set();
                }
            }
        }
Ejemplo n.º 2
0
        public async Task TestCleared()
        {
            using var workspace = new TestWorkspace(composition: FeaturesTestCompositions.Features);
            var mutex     = new ManualResetEvent(false);
            var document  = workspace.CurrentSolution.AddProject("TestProject", "TestProject", LanguageNames.CSharp).AddDocument("TestDocument", string.Empty);
            var document2 = document.Project.AddDocument("TestDocument2", string.Empty);

            var diagnosticService = GetDiagnosticService(workspace);

            var source1 = new TestDiagnosticUpdateSource(support: false, diagnosticData: null);

            diagnosticService.Register(source1);

            var source2 = new TestDiagnosticUpdateSource(support: false, diagnosticData: null);

            diagnosticService.Register(source2);

            diagnosticService.DiagnosticsUpdated += MarkSet;

            // add bunch of data to the service for both sources
            RaiseDiagnosticEvent(mutex, source1, workspace, document.Project.Id, document.Id, Tuple.Create(workspace, document));
            RaiseDiagnosticEvent(mutex, source1, workspace, document.Project.Id, document.Id, Tuple.Create(workspace, document.Project, document));
            RaiseDiagnosticEvent(mutex, source1, workspace, document2.Project.Id, document2.Id, Tuple.Create(workspace, document2));

            RaiseDiagnosticEvent(mutex, source2, workspace, document.Project.Id, null, Tuple.Create(workspace, document.Project));
            RaiseDiagnosticEvent(mutex, source2, workspace, null, null, Tuple.Create(workspace));

            var diagnosticMode = DiagnosticMode.Default;

            // confirm data is there.
            var data1 = await diagnosticService.GetPushDiagnosticsAsync(workspace, null, null, null, includeSuppressedDiagnostics : false, diagnosticMode, CancellationToken.None);

            Assert.Equal(5, data1.Count());

            diagnosticService.DiagnosticsUpdated -= MarkSet;

            // confirm clear for a source
            mutex.Reset();
            var count = 0;

            diagnosticService.DiagnosticsUpdated += MarkCalled;

            source1.RaiseDiagnosticsClearedEvent();

            mutex.WaitOne();

            // confirm there are 2 data left
            var data2 = await diagnosticService.GetPushDiagnosticsAsync(workspace, null, null, null, includeSuppressedDiagnostics : false, diagnosticMode, CancellationToken.None);

            Assert.Equal(2, data2.Count());

            void MarkCalled(object sender, DiagnosticsUpdatedArgs args)
            {
                // event is serialized. no concurrent call
                if (++count == 3)
                {
                    mutex.Set();
                }
            }

            void MarkSet(object sender, DiagnosticsUpdatedArgs args)
            {
                mutex.Set();
            }
        }