|
// 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;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Completion.Providers;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Completion.CompletionProviders;
[Trait(Traits.Feature, Traits.Features.Completion)]
public class PartialTypeCompletionProviderTests : AbstractCSharpCompletionProviderTests
{
internal override Type GetCompletionProviderType()
=> typeof(PartialTypeCompletionProvider);
[Fact]
public async Task TestRecommendTypesWithoutPartial()
{
var text = """
class C { }
partial class $$
""";
await VerifyItemIsAbsentAsync(text, "C");
}
[Fact]
public async Task TestPartialClass1()
{
var text = """
partial class C { }
partial class $$
""";
await VerifyItemExistsAsync(text, "C");
}
[Fact]
public async Task TestPartialGenericClass1()
{
var text = """
class Bar { }
partial class C<Bar> { }
partial class $$
""";
await VerifyItemExistsAsync(text, "C<Bar>");
}
[Fact]
public async Task TestPartialGenericClassCommitOnParen()
{
var text = """
class Bar { }
partial class C<Bar> { }
partial class $$
""";
var expected = """
class Bar { }
partial class C<Bar> { }
partial class C<
""";
await VerifyProviderCommitAsync(text, "C<Bar>", expected, '<');
}
[Fact]
public async Task TestPartialGenericClassCommitOnTab()
{
var text = """
class Bar { }
partial class C<Bar> { }
partial class $$
""";
var expected = """
class Bar { }
partial class C<Bar> { }
partial class C<Bar>
""";
await VerifyProviderCommitAsync(text, "C<Bar>", expected, null);
}
[Fact]
public async Task TestPartialGenericClassCommitOnSpace()
{
var text = """
partial class C<T> { }
partial class $$
""";
var expected = """
partial class C<T> { }
partial class C<T>
""";
await VerifyProviderCommitAsync(text, "C<T>", expected, ' ');
}
[Fact]
public async Task TestPartialClassWithModifiers()
{
var text = """
partial class C { }
internal partial class $$
""";
await VerifyItemExistsAsync(text, "C");
}
[Fact]
public async Task TestPartialStruct()
{
var text = """
partial struct S { }
partial struct $$
""";
await VerifyItemExistsAsync(text, "S");
}
[Fact]
public async Task TestPartialInterface()
{
var text = """
partial interface I { }
partial interface $$
""";
await VerifyItemExistsAsync(text, "I");
}
[Fact]
public async Task TestTypeKindMatches1()
{
var text = """
partial struct S { }
partial class $$
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestTypeKindMatches2()
{
var text = """
partial class C { }
partial struct $$
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestPartialClassesInSameNamespace()
{
var text = """
namespace N
{
partial class Goo { }
}
namespace N
{
partial class $$
}
""";
await VerifyItemExistsAsync(text, "Goo");
}
[Fact]
public async Task TestNotPartialClassesAcrossDifferentNamespaces()
{
var text = """
namespace N
{
partial class Goo { }
}
partial class $$
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestNotPartialClassesInOuterNamespaces()
{
var text = """
partial class C { }
namespace N
{
partial class $$
}
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestNotPartialClassesInOuterClass()
{
var text = """
partial class C
{
partial class $$
}
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestClassWithConstraint()
{
var text = """
partial class C1<T> where T : System.Exception { }
partial class $$
""";
var expected = """
partial class C1<T> where T : System.Exception { }
partial class C1<T>
""";
await VerifyProviderCommitAsync(text, "C1<T>", expected, null);
}
[Fact]
public async Task TestDoNotSuggestCurrentMember()
{
var text = @"partial class F$$";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestNotInTrivia()
{
var text = """
partial class C1 { }
partial class //$$
""";
await VerifyNoItemsExistAsync(text);
}
[Fact]
public async Task TestPartialClassWithReservedName()
{
var text = """
partial class @class { }
partial class $$
""";
var expected = """
partial class @class { }
partial class @class
""";
await VerifyProviderCommitAsync(text, "@class", expected, null);
}
[Fact]
public async Task TestPartialGenericClassWithReservedName()
{
var text = """
partial class @class<T> { }
partial class $$
""";
var expected = """
partial class @class<T> { }
partial class @class<T>
""";
await VerifyProviderCommitAsync(text, "@class<T>", expected, null);
}
[Fact]
public async Task TestPartialGenericInterfaceWithVariance()
{
var text = """
partial interface I<out T> { }
partial interface $$
""";
var expected = """
partial interface I<out T> { }
partial interface I<out T>
""";
await VerifyProviderCommitAsync(text, "I<out T>", expected, null);
}
}
|