File: Completion\CompletionProviders\ExplicitInterfaceTypeCompletionProviderTests.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.
 
using System;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Completion.Providers;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Completion.CompletionProviders;
 
[Trait(Traits.Feature, Traits.Features.Completion)]
public sealed class ExplicitInterfaceTypeCompletionProviderTests : AbstractCSharpCompletionProviderTests
{
    internal override Type GetCompletionProviderType()
        => typeof(ExplicitInterfaceTypeCompletionProvider);
 
    [Fact]
    public async Task TestAtStartOfClass()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int $$
            }
            """;
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Theory]
    [InlineData("record")]
    [InlineData("record class")]
    [InlineData("record struct")]
    public async Task TestAtStartOfRecord(string record)
    {
        var markup = $@"
<Workspace>
    <Project Language=""C#"" AssemblyName=""Assembly1"" CommonReferences=""true"" LanguageVersion=""Preview"">
        <Document>
using System.Collections;
 
{record} C : IList
{{
    int $$
}}
        </Document>
    </Project>
</Workspace>";
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact, WorkItem("https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_workitems?id=459044")]
    public async Task TestInMisplacedUsing()
    {
        var markup = """
            class C
            {
                using ($$)
            }
            """;
        await VerifyNoItemsExistAsync(markup); // no crash
    }
 
    [Fact]
    public async Task TestAtStartOfStruct()
    {
        var markup = """
            using System.Collections;
 
            struct C : IList
            {
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestAfterField()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int i;
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestAfterMethod_01()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                void Goo() { }
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestAfterMethod_02()
    {
        var markup = """
            using System.Collections;
 
            interface C : IList
            {
                void Goo() { }
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestAfterExpressionBody()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int Goo() => 0;
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestWithAttributeFollowing()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int Goo() => 0;
                int $$
 
                [Attr]
                int Bar();
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestWithModifierFollowing()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int Goo() => 0;
                int $$
 
                public int Bar();
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestWithTypeFollowing()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int Goo() => 0;
                int $$
 
                int Bar();
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestWithTypeFollowing2()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                int Goo() => 0;
                int $$
 
                X Bar();
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task NotInMember()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                void Goo()
                {
                    int $$
                }
            }
            """;
 
        await VerifyNoItemsExistAsync(markup);
    }
 
    [Fact]
    public async Task NotWithAccessibility()
    {
        var markup = """
            using System.Collections;
 
            class C : IList
            {
                public int $$
            }
            """;
 
        await VerifyNoItemsExistAsync(markup);
    }
 
    [Fact]
    public async Task TestInInterface()
    {
        var markup = """
            using System.Collections;
 
            interface I : IList
            {
                int $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IEnumerable");
        await VerifyItemExistsAsync(markup, "ICollection");
        await VerifyItemExistsAsync(markup, "IList");
    }
 
    [Fact]
    public async Task TestImplementedAsAsync()
    {
        var markup = """
            interface IGoo
            {
                Task Goo();
            }
 
            class MyGoo : IGoo
            {
                 async Task $$
            }
            """;
 
        await VerifyAnyItemExistsAsync(markup, hasSuggestionModeItem: true);
        await VerifyItemExistsAsync(markup, "IGoo");
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/70382")]
    public async Task TestAfterGenericType()
    {
        var markup = """
            interface I<T>
            {
                I<T> M();
            }
 
            class C<T> : I<T>
            {
                 I<T> $$
            }
            """;
 
        await VerifyItemExistsAsync(markup, "I", displayTextSuffix: "<>");
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/70382")]
    public async Task TestAfterNestedGenericType()
    {
        var markup = """
            interface I<T>
            {
                I<T> M();
            }
 
            class C<T> : I<T>
            {
                 I<I<T>> $$
            }
            """;
 
        await VerifyItemExistsAsync(markup, "I", displayTextSuffix: "<>");
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/54005")]
    public async Task TestWithStaticKeyword()
    {
        var markup = """
            interface I1
            {
                static abstract void M1();
            }
 
            class C1 : I1
            {
                static void $$
            }
            """;
 
        await VerifyItemExistsAsync(markup, "I1", displayTextSuffix: "");
    }
}