File: Formatters\UnnecessaryImportsFormatterTests.cs
Web Access
Project: ..\..\..\test\dotnet-format.UnitTests\dotnet-format.UnitTests.csproj (dotnet-format.UnitTests)
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.
 
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Tools.Analyzers;
using Microsoft.CodeAnalysis.Tools.Formatters;
 
namespace Microsoft.CodeAnalysis.Tools.Tests.Formatters
{
    public class UnnecessaryImportsFormatterTests : CSharpFormatterTests
    {
        internal const string IDE0005 = nameof(IDE0005);
        internal const string Style = nameof(Style);
 
        private const string RemoveUnnecessaryImportDiagnosticKey =
            AnalyzerOptionsExtensions.DotnetDiagnosticPrefix + "." + IDE0005 + "." + AnalyzerOptionsExtensions.SeveritySuffix;
        private const string RemoveUnnecessaryImportCategoryKey =
            AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticPrefix + "." + AnalyzerOptionsExtensions.CategoryPrefix + "-" + Style + "." + AnalyzerOptionsExtensions.SeveritySuffix;
 
        private protected override ICodeFormatter Formatter => AnalyzerFormatter.CodeStyleFormatter;
 
        public UnnecessaryImportsFormatterTests(ITestOutputHelper output)
        {
            TestOutputHelper = output;
        }
 
        [Fact]
        public async Task WhenNotFixingCodeSyle_AndHasUnusedImports_NoChange()
        {
            var code =
@"using System;
 
internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>();
 
            await AssertCodeUnchangedAsync(code, editorConfig, fixCategory: FixCategory.Whitespace, codeStyleSeverity: DiagnosticSeverity.Info);
        }
 
        [Fact]
        public async Task WhenIDE0005NotConfigured_AndHasUnusedImports_NoChange()
        {
            var code =
@"using System;
 
internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>();
 
            await AssertCodeUnchangedAsync(code, editorConfig, fixCategory: FixCategory.Whitespace | FixCategory.CodeStyle, codeStyleSeverity: DiagnosticSeverity.Info);
        }
 
        [Theory]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Info)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Info)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Warning)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Info)]
        public async Task WhenIDE0005SeverityLowerThanFixSeverity_AndHasUnusedImports_NoChange(string key, string severity)
        {
            var code =
@"using System;
 
internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>()
            {
                [key] = severity
            };
 
            await AssertCodeUnchangedAsync(code, editorConfig, fixCategory: FixCategory.Whitespace | FixCategory.CodeStyle, codeStyleSeverity: DiagnosticSeverity.Error);
        }
 
        [Theory]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Error)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Error)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Warning)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Error)]
        public async Task WhenIDE0005SeverityEqualOrGreaterThanFixSeverity_AndHasUnusedImports_ImportRemoved(string key, string severity)
        {
            var testCode =
@"using System;
 
internal class C
{
}";
 
            var expectedCode =
@"internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>()
            {
                [key] = severity
            };
 
            await AssertCodeChangedAsync(testCode, expectedCode, editorConfig, fixCategory: FixCategory.Whitespace | FixCategory.CodeStyle, codeStyleSeverity: DiagnosticSeverity.Warning);
        }
 
        [Theory]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Error)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Error)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Warning)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Error)]
        public async Task WhenIDE0005SeverityEqualOrGreaterThanFixSeverity_AndHasUnusedImports_AndIncludedInDiagnosticsList_ImportRemoved(string key, string severity)
        {
            var testCode =
@"using System;
 
internal class C
{
}";
 
            var expectedCode =
@"internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>()
            {
                [key] = severity
            };
 
            await AssertCodeChangedAsync(testCode, expectedCode, editorConfig, fixCategory: FixCategory.Whitespace | FixCategory.CodeStyle, codeStyleSeverity: DiagnosticSeverity.Warning, diagnostics: new[] { IDE0005 });
        }
 
        [Theory]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportDiagnosticKey, Severity.Error)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Warning)]
        [InlineData(RemoveUnnecessaryImportCategoryKey, Severity.Error)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Warning)]
        [InlineData(AnalyzerOptionsExtensions.DotnetAnalyzerDiagnosticSeverityKey, Severity.Error)]
        public async Task WhenIDE0005SeverityEqualOrGreaterThanFixSeverity_AndHasUnusedImports_AndNotIncludedInDiagnosticsList_ImportNotRemoved(string key, string severity)
        {
            var testCode =
@"using System;
 
internal class C
{
}";
 
            var editorConfig = new Dictionary<string, string>()
            {
                [key] = severity
            };
 
            await AssertCodeUnchangedAsync(testCode, editorConfig, fixCategory: FixCategory.Whitespace | FixCategory.CodeStyle, codeStyleSeverity: DiagnosticSeverity.Warning, diagnostics: new[] { "IDE0073" });
        }
    }
}