File: CodeActions\AddUsing\AddUsingTestsWithAddImportDiagnosticProvider.cs
Web Access
Project: src\src\EditorFeatures\CSharpTest\Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.AddImport;
using Microsoft.CodeAnalysis.CSharp.Diagnostics;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.AddUsing;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsAddImport)]
public sealed partial class AddUsingTestsWithAddImportDiagnosticProvider : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
{
    public AddUsingTestsWithAddImportDiagnosticProvider(ITestOutputHelper logger)
       : base(logger)
    {
    }
 
    internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
        => (new CSharpUnboundIdentifiersDiagnosticAnalyzer(), new CSharpAddImportCodeFixProvider());
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/829970")]
    public Task TestUnknownIdentifierGenericName()
        => TestInRegularAndScriptAsync(
            """
            class C
            {
                private [|List<int>|]
            }
            """,
            """
            using System.Collections.Generic;
 
            class C
            {
                private List<int>
            }
            """);
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/829970")]
    public Task TestUnknownIdentifierInAttributeSyntaxWithoutTarget()
        => TestInRegularAndScriptAsync(
            """
            class C
            {
                [[|Extension|]]
            }
            """,
            """
            using System.Runtime.CompilerServices;
 
            class C
            {
                [Extension]
            }
            """);
 
    [Fact]
    public Task TestOutsideOfMethodWithMalformedGenericParameters()
        => TestMissingInRegularAndScriptAsync(
            """
            using System;
            class Program
            {
                Func<[|FlowControl|] x }
            """);
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/752640")]
    public Task TestUnknownIdentifierWithSyntaxError()
        => TestInRegularAndScriptAsync(
            """
            class C
            {
                [|Directory|] private int i;
            }
            """,
            """
            using System.IO;
 
            class C
            {
                Directory private int i;
            }
            """);
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/855748")]
    public async Task TestGenericNameWithBrackets()
    {
        await TestInRegularAndScriptAsync(
            """
            class Class
            {
                [|List|]
            }
            """,
            """
            using System.Collections.Generic;
 
            class Class
            {
                List
            }
            """);
 
        await TestInRegularAndScriptAsync(
            """
            class Class
            {
                [|List<>|]
            }
            """,
            """
            using System.Collections.Generic;
 
            class Class
            {
                List<>
            }
            """);
 
        await TestInRegularAndScriptAsync(
            """
            class Class
            {
                List[|<>|]
            }
            """,
            """
            using System.Collections.Generic;
 
            class Class
            {
                List<>
            }
            """);
    }
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/867496")]
    public async Task TestMalformedGenericParameters()
    {
        await TestInRegularAndScriptAsync(
            """
            class Class
            {
                [|List<|] }
            """,
            """
            using System.Collections.Generic;
 
            class Class
            {
                List< }
            """);
 
        await TestMissingInRegularAndScriptAsync(
            """
            class Class
            {
                [|List<Y x;|] }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/18621")]
    public Task TestIncompleteMemberWithAsyncTaskReturnType()
        => TestInRegularAndScriptAsync(
            """
            using System.Collections.Generic;
            using System.Threading.Tasks;
 
            namespace X
            {
                class ProjectConfiguration
                {
                }
            }
 
            namespace ConsoleApp282
            {
                class Program
                {
                    public async Task<IReadOnlyCollection<[|ProjectConfiguration|]>>
                }
            }
            """,
            """
            using System.Collections.Generic;
            using System.Threading.Tasks;
            using X;
 
            namespace X
            {
                class ProjectConfiguration
                {
                }
            }
 
            namespace ConsoleApp282
            {
                class Program
                {
                    public async Task<IReadOnlyCollection<ProjectConfiguration>>
                }
            }
            """);
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/23667")]
    public Task TestMissingDiagnosticForNameOf()
        => TestDiagnosticMissingAsync(
            """
            using System;
 
            class C
            {
                Action action = () => {
                    var x = [|nameof|](System);
            #warning xxx
                };
            }
            """);
}