Ejemplo n.º 1
0
        private static void TestDescriptorIsExceptionSafeCore(DiagnosticDescriptor descriptor)
        {
            var localizableTitle       = descriptor.Title;
            var localizableMessage     = descriptor.MessageFormat;
            var localizableDescription = descriptor.Description;

            // Verify exceptions from LocalizableResourceString don't go unhandled.
            var title       = localizableTitle.ToString();
            var message     = localizableMessage.ToString();
            var description = localizableDescription.ToString();

            // Verify exceptions from LocalizableResourceString are raised if OnException is set.
            var exceptions = new List <Exception>();
            var handler    = new EventHandler <Exception>((sender, ex) => exceptions.Add(ex));

            localizableTitle.OnException       += handler;
            localizableMessage.OnException     += handler;
            localizableDescription.OnException += handler;

            // Access and evaluate localizable fields.
            var unused1 = localizableTitle.ToString();
            var unused2 = localizableMessage.ToString();
            var unused3 = localizableDescription.ToString();

            Assert.Equal(3, exceptions.Count);

            // Verify DiagnosticAnalyzer.SupportedDiagnostics is also exception safe.
            var analyzer             = new MyAnalyzer(descriptor);
            var exceptionDiagnostics = new List <Diagnostic>();

            Action <Exception, DiagnosticAnalyzer, Diagnostic> onAnalyzerException = (ex, a, diag) =>
                                                                                     exceptionDiagnostics.Add(diag);
            var analyzerManager  = new AnalyzerManager(analyzer);
            var analyzerExecutor = AnalyzerExecutor.CreateForSupportedDiagnostics(
                onAnalyzerException,
                analyzerManager
                );
            var descriptors = analyzerManager.GetSupportedDiagnosticDescriptors(
                analyzer,
                analyzerExecutor
                );

            Assert.Equal(1, descriptors.Length);
            Assert.Equal(descriptor.Id, descriptors[0].Id);

            // Access and evaluate localizable fields.
            unused1 = descriptors[0].Title.ToString();
            unused2 = descriptors[0].MessageFormat.ToString();
            unused3 = descriptors[0].Description.ToString();

            // Verify logged analyzer exception diagnostics.
            Assert.Equal(3, exceptionDiagnostics.Count);
            Assert.True(
                exceptionDiagnostics.TrueForAll(AnalyzerExecutor.IsAnalyzerExceptionDiagnostic)
                );
        }