' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports System.Collections.Immutable Imports System.Globalization Imports System.Threading Imports Microsoft.CodeAnalysis.Completion Imports Microsoft.CodeAnalysis.CSharp Imports Microsoft.CodeAnalysis.Editor.CSharp.Formatting Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions Imports Microsoft.CodeAnalysis.Options Imports Microsoft.CodeAnalysis.Tags Imports Microsoft.CodeAnalysis.Text Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Operations Imports Microsoft.VisualStudio.Text.Projection Imports Microsoft.VisualStudio.Utilities Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense <[UseExportProvider]> Public Class CSharpCompletionCommandHandlerTests Public Shared ReadOnly Property AllCompletionImplementations() As IEnumerable(Of Object()) Get Return TestStateFactory.GetAllCompletionImplementations() End Get End Property Public Async Function TabCommitsWithoutAUniqueMatch(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ ) state.SendTypeChars("using System.Ne") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Net", isHardSelected:=True) state.SendTypeChars("x") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Net", isSoftSelected:=True) state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains("using System.Net", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestAtEndOfFile(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$) state.SendTypeChars("us") state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains("using", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestDeletingWholeWordResetCompletionToTheDefaultItem(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class C { void M() { var replyUri = new Uri(""); $$ } } ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendTypeChars("repl") state.SendTab() For i = 1 To 7 state.SendBackspace() Await state.WaitForAsynchronousOperationsAsync() Next Await state.AssertCompletionSession() state.SendBackspace() Await state.AssertSelectedCompletionItem("AccessViolationException") End Using End Function Public Async Function TestTabsDoNotTriggerCompletion(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class C { void M() { var replyUri = new Uri(""); replyUri$$ } } ) state.SendTab() state.SendTab() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal(" replyUri" & vbTab & vbTab, state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestNotAtStartOfExistingWord(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$using) state.SendTypeChars("u") Await state.AssertNoCompletionSession() Assert.Contains("using", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestMSCorLibTypes(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class c : $$ ) state.SendTypeChars("A") Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll(displayText:={"Attribute", "Exception", "IDisposable"})) End Using End Function Public Async Function TestFiltering1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class c { $$ ) state.SendTypeChars("Sy") Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll(displayText:={"OperatingSystem", "System", "SystemException"})) Assert.False(state.CompletionItemsContainsAny(displayText:={"Exception", "Activator"})) End Using End Function ' NOTE(cyrusn): This should just be a unit test for SymbolCompletionProvider. However, I'm ' just porting the integration tests to here for now. Public Async Function TestMultipleTypes(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { $$ } struct S { } enum E { } interface I { } delegate void D(); ) state.SendTypeChars("C") Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll(displayText:={"C", "S", "E", "I", "D"})) End Using End Function ' NOTE(cyrusn): This should just be a unit test for KeywordCompletionProvider. However, I'm ' just porting the integration tests to here for now. Public Async Function TestInEmptyFile(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ ) state.SendInvokeCompletionList() Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll(displayText:={"abstract", "class", "namespace"})) End Using End Function Public Async Function TestNotAfterTypingDotAfterIntegerLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class c { void M() { 3$$ } } ) state.SendTypeChars(".") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestAfterExplicitInvokeAfterDotAfterIntegerLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class c { void M() { 3.$$ } } ) state.SendInvokeCompletionList() Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll({"ToString"})) End Using End Function Public Async Function TestTypingDotBeforeExistingDot(completionImplementation As CompletionImplementation) As Task ' Starting C# 8.0 two dots are considered as a DotDotToken of a Range expression. ' However, typing dot before a single dot (and adding the second one) should lead to a completion ' in the context of the previous token if this completion exists. Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class c { void M() { this$$.ToString() } } ) state.SendTypeChars(".") Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll({"ToString"})) End Using End Function Public Async Function TestTypingDotAfterExistingDot(completionImplementation As CompletionImplementation) As Task ' Starting C# 8.0 two dots are considered as a DotDotToken of a Range expression. ' A test above (TestTypingDotBeforeExistingDot) verifies that the completion happens ' if we type dot before a single dot. ' However, we should not have a completion if typing dot after a dot. Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class c { void M() { this.$$ToString() } } ) state.SendTypeChars(".") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestInvokingCompletionBetweenTwoDots(completionImplementation As CompletionImplementation) As Task ' Starting C# 8.0 two dots are considered as a DotDotToken of a Range expression. ' However, we may want to have a completion when invoking it aqfter the first dot. Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class c { void M() { this.$$.ToString() } } ) state.SendInvokeCompletionList() Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAll({"ToString"})) End Using End Function Public Async Function TestEnterIsConsumed(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class Class1 { void Main(string[] args) { $$ } }) state.SendTypeChars("System.TimeSpan.FromMin") state.SendReturn() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal( class Class1 { void Main(string[] args) { System.TimeSpan.FromMinutes } }.NormalizedValue, state.GetDocumentText()) End Using End Function Public Async Function TestDescription1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, /// TestDocComment /// class TestException : Exception { } class MyException : $$]]>) state.SendTypeChars("Test") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(description:="class TestException" & vbCrLf & "TestDocComment") End Using End Function Public Async Function TestObjectCreationPreselection1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, list = new$$ } }]]>) state.SendTypeChars(" ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="List", isHardSelected:=True) Assert.True(state.CompletionItemsContainsAll(displayText:={"LinkedList", "List", "System"})) state.SendTypeChars("Li") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="List", isHardSelected:=True) Assert.True(state.CompletionItemsContainsAll(displayText:={"LinkedList", "List"})) Assert.False(state.CompletionItemsContainsAny(displayText:={"System"})) state.SendTypeChars("n") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="LinkedList", displayTextSuffix:="<>", isHardSelected:=True) state.SendBackspace() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="List", isHardSelected:=True) state.SendTab() Assert.Contains("new List", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestDeconstructionDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("i") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestDeconstructionDeclaration2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("i") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestDeconstructionDeclaration3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("i") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestParenthesizedDeconstructionDeclarationWithVar(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.AssertSelectedCompletionItem(displayText:="as", isHardSelected:=False) End Using End Function Public Async Function TestParenthesizedDeconstructionDeclarationWithVarAfterComma(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.AssertSelectedCompletionItem(displayText:="as", isHardSelected:=False) End Using End Function Public Async Function TestParenthesizedVarDeconstructionDeclarationWithVar(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("a") Await state.AssertNoCompletionSession() state.SendTypeChars(", a") Await state.AssertNoCompletionSession() Assert.Contains("(var a, var (a, a)) = ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestVarDeconstructionDeclarationWithVar(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("va") Await state.AssertSelectedCompletionItem(displayText:="var", isHardSelected:=True) state.SendTypeChars(" (a") Await state.AssertNoCompletionSession() state.SendTypeChars(", a") Await state.AssertNoCompletionSession() Assert.Contains("var (a, a", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestParenthesizedDeconstructionDeclarationWithSymbol(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("vari") Await state.AssertSelectedCompletionItem(displayText:="Variable", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("(Variable ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) Await state.AssertNoCompletionSession() state.SendTypeChars("x, vari") Await state.AssertSelectedCompletionItem(displayText:="Variable", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("(Variable x, Variable ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) Await state.AssertSelectedCompletionItem(displayText:="Variable", isHardSelected:=False) Assert.True(state.CompletionItemsContainsAll({"variable"})) End Using End Function Public Async Function TestParenthesizedDeconstructionDeclarationWithInt(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("int") Await state.AssertSelectedCompletionItem(displayText:="int", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("(int ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) Await state.AssertNoCompletionSession() state.SendTypeChars("x, int") Await state.AssertSelectedCompletionItem(displayText:="int", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("(int x, int ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestIncompleteParenthesizedDeconstructionDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("va") Await state.AssertSelectedCompletionItem(displayText:="var", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("a") Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendTypeChars(", va") Await state.AssertSelectedCompletionItem(displayText:="var", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("a") Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendTypeChars(")") Assert.Contains("(var a, var a)", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestIncompleteParenthesizedDeconstructionDeclaration2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("va") Await state.AssertSelectedCompletionItem(displayText:="var", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("a") Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendTypeChars(", va") Await state.AssertSelectedCompletionItem(displayText:="var", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("a") Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendReturn() Assert.Contains("(var a, var a", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestBackspaceInIncompleteParenthesizedDeconstructionDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendBackspace() ' This completionImplementation is hard-selected because the suggestion mode never triggers on backspace ' See issue https://github.com/dotnet/roslyn/issues/15302 Await state.AssertSelectedCompletionItem(displayText:="as", isHardSelected:=True) state.SendTypeChars(", var as") state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendTypeChars(")") Await state.AssertNoCompletionSession() Assert.Contains("(var as, var a)", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestBackspaceInParenthesizedDeconstructionDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendBackspace() ' This completionImplementation is hard-selected because the suggestion mode never triggers on backspace ' See issue https://github.com/dotnet/roslyn/issues/15302 Await state.AssertSelectedCompletionItem(displayText:="as", isHardSelected:=True) state.SendTypeChars(", var as") state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="as", isSoftSelected:=True) state.SendReturn() Await state.AssertNoCompletionSession() Assert.Contains("(var as, var a", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestThrowExpression(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertSelectedCompletionItem(displayText:="Exception", isHardSelected:=True) End Using End Function Public Async Function TestThrowStatement(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertSelectedCompletionItem(displayText:="Exception", isHardSelected:=True) End Using End Function Public Async Function TestNonTrailingNamedArgumentInCSharp7_1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateTestStateFromWorkspace(completionImplementation, class C { public void M() { int better = 2; M(a: 1, $$) } public void M(int a, int bar, int c) { } } ) state.SendTypeChars("b") Await state.AssertSelectedCompletionItem(displayText:="bar", displayTextSuffix:=":", isHardSelected:=True) state.SendTypeChars("e") Await state.AssertSelectedCompletionItem(displayText:="bar", displayTextSuffix:=":", isSoftSelected:=True) End Using End Function Public Async Function TestNonTrailingNamedArgumentInCSharp7_2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateTestStateFromWorkspace(completionImplementation, class C { public void M() { int better = 2; M(a: 1, $$) } public void M(int a, int bar, int c) { } } ) state.SendTypeChars("b") Await state.AssertSelectedCompletionItem(displayText:="better", isHardSelected:=True) state.SendTypeChars("a") Await state.AssertSelectedCompletionItem(displayText:="bar", displayTextSuffix:=":", isHardSelected:=True) state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="better", isHardSelected:=True) state.SendTypeChars(", ") Assert.Contains("M(a: 1, better,", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestDefaultSwitchLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="default", isHardSelected:=True) state.SendTypeChars(";") Assert.Contains("goto default;", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestGotoOrdinaryLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("l") Await state.AssertSelectedCompletionItem(displayText:="label1", isHardSelected:=True) state.SendTypeChars(";") Assert.Contains("goto label1;", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestEscapedDefaultLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="@default", isHardSelected:=True) state.SendTypeChars(";") Assert.Contains("goto @default;", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestEscapedDefaultLabel2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="default", isHardSelected:=True) state.SendTypeChars(";") Assert.Contains("goto default;", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestEscapedDefaultLabelWithoutSwitch(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="@default", isHardSelected:=True) state.SendTypeChars(";") Assert.Contains("goto @default;", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestArrayInitialization(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("new ") Await state.AssertSelectedCompletionItem(displayText:="Class", isSoftSelected:=True) state.SendTypeChars("C") Await state.AssertSelectedCompletionItem(displayText:="Class", isHardSelected:=True) state.SendTypeChars("[") Assert.Contains("Class[] x = new Class[", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("] {") Assert.Contains("Class[] x = new Class[] {", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestImplicitArrayInitialization(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("n") Await state.AssertSelectedCompletionItem(displayText:="nameof", isHardSelected:=True) state.SendTypeChars("e") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertSelectedCompletionItem(displayText:="Class", isSoftSelected:=True) state.SendTypeChars("[") Assert.Contains("Class[] x = new [", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("] {") Assert.Contains("Class[] x = new [] {", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestImplicitArrayInitialization2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars("[") Assert.Contains("Class[] x = new[", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestImplicitArrayInitialization3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertSelectedCompletionItem(displayText:="Class", isSoftSelected:=True) Assert.Contains("Class[] x = new ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("[") Assert.Contains("Class[] x = new [", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestImplicitArrayInitialization4(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("{") Assert.Contains("Class[] x = {", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestImplicitArrayInitialization_WithTab(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertSelectedCompletionItem(displayText:="Class", isSoftSelected:=True) Assert.Contains("Class[] x = new ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTab() Assert.Contains("Class[] x = new Class", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTypelessImplicitArrayInitialization(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() state.SendTypeChars("[") Assert.Contains("var x = new [", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("] {") Assert.Contains("var x = new [] {", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTypelessImplicitArrayInitialization2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars("[") Assert.Contains("var x = new[", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTypelessImplicitArrayInitialization3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("ne") Await state.AssertSelectedCompletionItem(displayText:="new", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("var x = new ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("[") Assert.Contains("var x = new [", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestPropertyInPropertySubpattern(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) Await state.AssertNoCompletionSession() state.SendTypeChars("C") Await state.AssertSelectedCompletionItem(displayText:="Class", isHardSelected:=True) state.SendTypeChars(" { P") Await state.AssertSelectedCompletionItem(displayText:="Prop", displayTextSuffix:=":", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("{ Prop:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars(" 0, ") Await state.AssertSelectedCompletionItem(displayText:="OtherProp", displayTextSuffix:=":", isSoftSelected:=True) state.SendTypeChars("O") Await state.AssertSelectedCompletionItem(displayText:="OtherProp", displayTextSuffix:=":", isHardSelected:=True) state.SendTypeChars(": 1 }") Assert.Contains("is Class { Prop: 0, OtherProp: 1 }", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestPropertyInPropertySubpattern_TriggerWithSpace(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) Await state.AssertNoCompletionSession() state.SendTypeChars("C") Await state.AssertSelectedCompletionItem(displayText:="Class", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("is Class", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars("{ P") Await state.AssertSelectedCompletionItem(displayText:="Prop", displayTextSuffix:=":", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("is Class { Prop ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars(":") Assert.Contains("is Class { Prop :", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars(" 0, ") Await state.AssertSelectedCompletionItem(displayText:="OtherProp", displayTextSuffix:=":", isSoftSelected:=True) state.SendTypeChars("O") Await state.AssertSelectedCompletionItem(displayText:="OtherProp", displayTextSuffix:=":", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("is Class { Prop : 0, OtherProp", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) state.SendTypeChars(": 1 }") Assert.Contains("is Class { Prop : 0, OtherProp : 1 }", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestSymbolInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("F") Await state.AssertSelectedCompletionItem(displayText:="Fo", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("(F:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestSymbolInTupleLiteralAfterComma(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("F") Await state.AssertSelectedCompletionItem(displayText:="Fo", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("(x, F:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function ColonInTupleNameInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("fi") Await state.AssertSelectedCompletionItem(displayText:="first", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("first", state.GetSelectedItem().FilterText) state.SendTypeChars(":") Assert.Contains("(first:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function ColonInExactTupleNameInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("first") Await state.AssertSelectedCompletionItem(displayText:="first", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("first", state.GetSelectedItem().FilterText) state.SendTypeChars(":") Assert.Contains("(first:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function ColonInTupleNameInTupleLiteralAfterComma(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("se") Await state.AssertSelectedCompletionItem(displayText:="second", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("second", state.GetSelectedItem().FilterText) state.SendTypeChars(":") Assert.Contains("(0, second:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TabInTupleNameInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("fi") Await state.AssertSelectedCompletionItem(displayText:="first", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("first", state.GetSelectedItem().FilterText) state.SendTab() state.SendTypeChars(":") state.SendTypeChars("0") Assert.Contains("(first:0", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TabInExactTupleNameInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("first") Await state.AssertSelectedCompletionItem(displayText:="first", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("first", state.GetSelectedItem().FilterText) state.SendTab() state.SendTypeChars(":") state.SendTypeChars("0") Assert.Contains("(first:0", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TabInTupleNameInTupleLiteralAfterComma(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("se") Await state.AssertSelectedCompletionItem(displayText:="second", displayTextSuffix:=":", isHardSelected:=True) Assert.Equal("second", state.GetSelectedItem().FilterText) state.SendTab() state.SendTypeChars(":") state.SendTypeChars("1") Assert.Contains("(0, second:1", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestKeywordInTupleLiteral(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="decimal", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("(d:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTupleType(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("d") Await state.AssertSelectedCompletionItem(displayText:="decimal", isHardSelected:=True) state.SendTypeChars(" ") Assert.Contains("(decimal ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestDefaultKeyword(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("def") Await state.AssertSelectedCompletionItem(displayText:="default", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("default:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestParenthesizedExpression(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("F") Await state.AssertSelectedCompletionItem(displayText:="Fo", isHardSelected:=True) state.SendTypeChars(".") Assert.Contains("(Fo.", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestInvocationExpression(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("A") Await state.AssertSelectedCompletionItem(displayText:="Alice", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("Goo(Alice:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestInvocationExpressionAfterComma(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("B") Await state.AssertSelectedCompletionItem(displayText:="Bob", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("Goo(1, Bob:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestCaseLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("F") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Fo", isHardSelected:=True) state.SendTypeChars(":") Assert.Contains("case Fo:", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTypePreselection1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("C") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="C", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertCompletionSession() End Using End Function Public Async Function TestNewPreselectionAfterVar(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("new ") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestEscapedIdentifiers(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("@") Await state.AssertNoCompletionSession() state.SendTypeChars("r") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="@return", isHardSelected:=True) state.SendTab() Assert.Contains("@return", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestCommitUniqueItem1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendCommitUniqueCompletionListItem() Await state.AssertNoCompletionSession() Assert.Contains("WriteLine()", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestCommitUniqueItem2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendCommitUniqueCompletionListItem() Await state.AssertNoCompletionSession() End Using End Function Public Async Function CommitForUsingDirective1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ ) state.SendTypeChars("using Sys") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="System", isHardSelected:=True) state.SendTypeChars("(") Await state.AssertNoCompletionSession() Assert.Contains("using Sys(", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function CommitForUsingDirective2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ ) state.SendTypeChars("using Sys") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="System", isHardSelected:=True) state.SendTypeChars(".") Await state.AssertCompletionSession() Assert.Contains("using System.", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function CommitForUsingDirective3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("using Sys") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="System", isHardSelected:=True) state.SendTypeChars(";") Await state.AssertNoCompletionSession() state.AssertMatchesTextStartingAtLine(1, "using System;") End Using End Function Public Async Function CommitForUsingDirective4(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$ ) state.SendTypeChars("using Sys") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="System", isHardSelected:=True) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() Assert.Contains("using Sys ", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function KeywordsIncludedInObjectCreationCompletion(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { void Goo() { string s = new$$ } } ) state.SendTypeChars(" ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="string", isHardSelected:=True) Assert.True(state.GetCompletionItems().Any(Function(c) c.DisplayText = "int")) End Using End Function Public Async Function NoKeywordsOrSymbolsAfterNamedParameterWithCSharp7(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class Goo { void Test() { object m = null; Method(obj:m, $$ } void Method(object obj, int num = 23, string str = "") { } } , languageVersion:=LanguageVersion.CSharp7) state.SendTypeChars("a") Await state.AssertCompletionSession() Assert.True(state.GetCompletionItems().Any(Function(i) i.DisplayText = "num" AndAlso i.DisplayTextSuffix = ":")) Assert.False(state.GetCompletionItems().Any(Function(i) i.DisplayText = "System")) Assert.False(state.GetCompletionItems().Any(Function(c) c.DisplayText = "int")) End Using End Function Public Async Function KeywordsOrSymbolsAfterNamedParameter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class Goo { void Test() { object m = null; Method(obj:m, $$ } void Method(object obj, int num = 23, string str = "") { } } , languageVersion:=LanguageVersion.CSharp7) state.SendTypeChars("a") Await state.AssertCompletionSession() Assert.True(state.CompletionItemsContainsAny(displayText:="num", displayTextSuffix:=":")) Assert.True(state.CompletionItemsContainsAny({"System"})) Assert.True(state.CompletionItemsContainsAny({"int"})) End Using End Function Public Async Function EnumCompletionTriggeredOnSpace(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, enum Numeros { Uno, Dos } class Goo { void Bar(int a, Numeros n) { } void Baz() { Bar(0$$ } } ) state.SendTypeChars(", ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Numeros", isHardSelected:=True) Assert.Equal(1, state.GetCompletionItems().Where(Function(c) c.DisplayText = "Numeros").Count()) End Using End Function Public Async Function EnumCompletionTriggeredOnSpaceForNullables(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, enum Numeros { Uno, Dos } class Goo { void Bar(int a, Numeros? n) { } void Baz() { Bar(0$$ } } ) state.SendTypeChars(", ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Numeros", isHardSelected:=True) Assert.Equal(1, state.GetCompletionItems().Where(Function(c) c.DisplayText = "Numeros").Count()) End Using End Function Public Async Function EnumCompletionTriggeredOnDot(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, enum Numeros { Uno, Dos } class Goo { void Bar() { Numeros num = $$ } } ) state.SendTypeChars("Nu.") Await state.WaitForAsynchronousOperationsAsync() Assert.Contains("Numeros num = Numeros.", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function EnumCompletionNotTriggeredOnPlusCommitCharacter(completionImplementation As CompletionImplementation) As Task Await EnumCompletionNotTriggeredOn("+"c, completionImplementation) End Function Public Async Function EnumCompletionNotTriggeredOnLeftBraceCommitCharacter(completionImplementation As CompletionImplementation) As Task Await EnumCompletionNotTriggeredOn("{"c, completionImplementation) End Function Public Async Function EnumCompletionNotTriggeredOnSpaceCommitCharacter(completionImplementation As CompletionImplementation) As Task Await EnumCompletionNotTriggeredOn(" "c, completionImplementation) End Function Public Async Function EnumCompletionNotTriggeredOnSemicolonCommitCharacter(completionImplementation As CompletionImplementation) As Task Await EnumCompletionNotTriggeredOn(";"c, completionImplementation) End Function Private Async Function EnumCompletionNotTriggeredOn(c As Char, completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, enum Numeros { Uno, Dos } class Goo { void Bar() { Numeros num = $$ } } ) state.SendTypeChars("Nu") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Numeros", isHardSelected:=True) state.SendTypeChars(c.ToString()) Await state.WaitForAsynchronousOperationsAsync() Assert.NotEqual("Numberos", state.GetSelectedItemOpt()?.DisplayText) Assert.Contains(String.Format("Numeros num = Nu{0}", c), state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestVerbatimNamedIdentifierFiltering(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class Program { void Goo(int @int) { Goo($$ } } ) state.SendTypeChars("i") Await state.AssertCompletionSession() Assert.True(state.GetCompletionItems().Any(Function(i) i.DisplayText = "@int" AndAlso i.DisplayTextSuffix = ":")) state.SendTypeChars("n") Await state.WaitForAsynchronousOperationsAsync() Assert.True(state.GetCompletionItems().Any(Function(i) i.DisplayText = "@int" AndAlso i.DisplayTextSuffix = ":")) state.SendTypeChars("t") Await state.WaitForAsynchronousOperationsAsync() Assert.True(state.GetCompletionItems().Any(Function(i) i.DisplayText = "@int" AndAlso i.DisplayTextSuffix = ":")) End Using End Function Public Async Function TestNoPreselectInInvalidObjectCreationLocation(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, : IGoo { } interface IGoo { }]]> ) state.SendTypeChars("IGoo a = new ") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestQualifiedEnumSelection(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class Program { void Main() { Environment.GetFolderPath$$ } } ) state.SendTypeChars("(") state.SendTab() Await state.WaitForAsynchronousOperationsAsync() Assert.Contains("Environment.SpecialFolder", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestTextChangeSpanWithAtCharacter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, public class @event { $$@event() { } } ) state.SendTypeChars("public ") Await state.AssertNoCompletionSession() Assert.Contains("public @event", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function Public Async Function TestDoNotInsertColonSoThatUserCanCompleteOutAVariableNameThatDoesNotCurrentlyExist_IE_TheCyrusCase(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System.Threading; class Program { static void Main(string[] args) { Goo($$) } void Goo(CancellationToken cancellationToken) { } } ) state.SendTypeChars("can") state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains("Goo(cancellationToken)", state.GetLineTextFromCaretPosition(), StringComparison.Ordinal) End Using End Function #If False Then var a = System.TimeSpan.FromMin{ENTER}{(} #End If Public Async Function AttributeNamedPropertyCompletionCommitWithTab(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class MyAttribute : System.Attribute { public string Name { get; set; } } [MyAttribute($$ public class Goo { } ) state.SendTypeChars("Nam") state.SendTab() Await state.AssertNoCompletionSession() Assert.Equal("[MyAttribute(Name =", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function AttributeNamedPropertyCompletionCommitWithEquals(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class MyAttribute : System.Attribute { public string Name { get; set; } } [MyAttribute($$ public class Goo { } ) state.SendTypeChars("Nam=") Await state.AssertNoCompletionSession() Assert.Equal("[MyAttribute(Name =", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function AttributeNamedPropertyCompletionCommitWithSpace(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class MyAttribute : System.Attribute { public string Name { get; set; } } [MyAttribute($$ public class Goo { } ) state.SendTypeChars("Nam ") Await state.AssertNoCompletionSession() Assert.Equal("[MyAttribute(Name ", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestOverrideDefaultParameter_CSharp7(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, (S x = default(S)) { } } class D : C { override $$ } ]]>, languageVersion:=LanguageVersion.CSharp7) state.SendTypeChars(" Goo") state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains("public override void Goo(S x = default(S))", state.SubjectBuffer.CurrentSnapshot.GetText(), StringComparison.Ordinal) End Using End Function Public Async Function TestOverrideDefaultParameter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, (S x = default(S)) { } } class D : C { override $$ } ]]>) state.SendTypeChars(" Goo") state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains("public override void Goo(S x = default)", state.SubjectBuffer.CurrentSnapshot.GetText(), StringComparison.Ordinal) End Using End Function Public Async Function TestArrayAfterOptionalParameter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" Goo") state.SendTab() Await state.AssertNoCompletionSession() Assert.Contains(" public override void Goo(int x = 0, int[] y = null)", state.SubjectBuffer.CurrentSnapshot.GetText(), StringComparison.Ordinal) End Using End Function Public Async Function TestVirtualSpaces(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendReturn() Assert.True(state.TextView.Caret.InVirtualSpace) Assert.Equal(12, state.TextView.Caret.Position.VirtualSpaces) state.SendInvokeCompletionList() Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("P", isSoftSelected:=True) state.SendDownKey() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("P", isHardSelected:=True) state.SendTab() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal(" P", state.GetLineFromCurrentCaretPosition().GetText()) Dim bufferPosition = state.TextView.Caret.Position.BufferPosition Assert.Equal(13, bufferPosition.Position - bufferPosition.GetContainingLine().Start.Position) Assert.False(state.TextView.Caret.InVirtualSpace) End Using End Function Public Async Function TestNamedParameterAgainstMRU(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) ' prime the MRU state.SendTypeChars("string") state.SendTab() Await state.AssertNoCompletionSession() ' Delete what we just wrote. state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendEscape() Await state.AssertNoCompletionSession() ' ensure we still select the named param even though 'string' is in the MRU. state.SendTypeChars("Goo(s") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("s", displayTextSuffix:=":") End Using End Function Public Async Function TestMissingOnObjectCreationAfterVar1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestMissingOnObjectCreationAfterVar2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("X") Await state.AssertCompletionSession() Assert.False(state.GetCompletionItems().Any(Function(i) i.DisplayText = "X")) End Using End Function Public Async Function TestEnumInSwitch(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Numeros") End Using End Function Public Async Function TestAmbiguityInLocalDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("w") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="W") End Using End Function Public Async Function TestCompletionFilterSpanCaretBoundary(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("Met") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Method") state.SendLeftKey() state.SendLeftKey() state.SendLeftKey() state.SendTypeChars("new") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Method", isSoftSelected:=True) End Using End Function Public Async Function TestCommitCharTypedAtTheBeginingOfTheFilterSpan(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("Met") Await state.AssertCompletionSession() state.SendLeftKey() state.SendLeftKey() state.SendLeftKey() Await state.AssertSelectedCompletionItem(isSoftSelected:=True) state.SendTypeChars("!") Await state.AssertNoCompletionSession() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal("if (!Met", state.GetLineTextFromCaretPosition().Trim()) Assert.Equal("M", state.GetCaretPoint().BufferPosition.GetChar()) End Using End Function Public Async Function TestBangFiltersInDocComment(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class TestException : Exception { } ]]>) state.SendTypeChars("<") Await state.AssertCompletionSession() state.SendTypeChars("!") Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("!--") End Using End Function Public Async Function InvokeCompletionDoesNotFilter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("string") state.CompletionItemsContainsAll({"integer", "Method"}) End Using End Function Public Async Function InvokeBeforeWordDoesNotSelect(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("AccessViolationException") state.CompletionItemsContainsAll({"integer", "Method"}) End Using End Function Public Async Function InvokeCompletionSelectsWithoutRegardToCaretPosition(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("string") state.CompletionItemsContainsAll({"integer", "Method"}) End Using End Function Public Async Function TabAfterQuestionMark(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTab() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal(state.GetLineTextFromCaretPosition(), " ?" + vbTab) End Using End Function Public Async Function PreselectionIgnoresBrackets(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("static void F(int a, Func b) { }") state.SendEscape() state.TextView.Caret.MoveTo(New VisualStudio.Text.SnapshotPoint(state.SubjectBuffer.CurrentSnapshot, 220)) state.SendTypeChars("F") Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("F", displayTextSuffix:="<>") End Using End Function Public Async Function TestInvokeSnippetCommandDismissesCompletion(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$) state.SendTypeChars("us") Await state.AssertCompletionSession() state.SendInsertSnippetCommand() Await state.AssertNoCompletionSession() End Using End Function Public Async Function TestSurroundWithCommandDismissesCompletion(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, $$) state.SendTypeChars("us") Await state.AssertCompletionSession() state.SendSurroundWithCommand() Await state.AssertNoCompletionSession() End Using End Function Public Async Function LetEditorHandleOpenParen(completionImplementation As CompletionImplementation) As Task Dim expected = x = new List( } }]]>.Value.Replace(vbLf, vbCrLf) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, x = new$$ } }]]>) state.SendTypeChars(" ") Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("List") state.SendTypeChars("(") Await state.WaitForAsynchronousOperationsAsync() Assert.Equal(expected, state.GetDocumentText()) End Using End Function Public Async Function CommitMovesCaretToWordEnd(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendCommitUniqueCompletionListItem() Await state.WaitForAsynchronousOperationsAsync() Assert.Equal(state.GetLineFromCurrentCaretPosition().End, state.GetCaretPoint().BufferPosition) End Using End Function Public Async Function MatchingConsidersAtSign(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("var @this = ""goo""") state.SendReturn() state.SendTypeChars("string str = this.ToString();") state.SendReturn() state.SendTypeChars("str = @th") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("@this") End Using End Function Public Async Function AttributeFilterTextRemovesAttributeSuffix(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("At") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("At") Assert.Equal("At", state.GetSelectedItem().FilterText) End Using End Function Public Async Function PreselectExceptionOverSnippet(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("Exception") End Using End Function Public Async Function CommitNameAfterAlias(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(".act<") Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(1, "using goo = System.Action<") End Using End Function Public Async Function TestCompletionInLinkedFiles(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateTestStateFromWorkspace(completionImplementation, class C { void M() { $$ } #if Thing1 void Thing1() { } #elif Thing2 void Thing2() { } #endif } ) Dim documents = state.Workspace.Documents Dim linkDocument = documents.Single(Function(d) d.IsLinkFile) state.SendTypeChars("Thing1") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("Thing1") state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendEscape() state.Workspace.SetDocumentContext(linkDocument.Id) state.SendTypeChars("Thing1") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("Thing1") Assert.True(state.GetSelectedItem().Tags.Contains(WellKnownTags.Warning)) state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendBackspace() state.SendTypeChars("M") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("M") Assert.False(state.GetSelectedItem().Tags.Contains(WellKnownTags.Warning)) End Using End Function Public Async Function DismissUponSave(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("voi") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("void") state.SendSave() Await state.AssertNoCompletionSession() state.AssertMatchesTextStartingAtLine(3, " voi") End Using End Function Public Async Function NoCompletionWithBoxSelection(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.AssertNoCompletionSession() state.SendTypeChars("goo") Await state.AssertNoCompletionSession() End Using End Function Public Async Function TriggeredOnHash(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("#") Await state.AssertCompletionSession() End Using End Function Public Async Function RegionCompletionCommitTriggersFormatting_1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("#reg") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("region") state.SendReturn() Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(3, " #region") End Using End Function Public Async Function RegionCompletionCommitTriggersFormatting_2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("#reg") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("region") state.SendTypeChars(" ") Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(3, " #region ") End Using End Function Public Async Function EndRegionCompletionCommitTriggersFormatting_2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("#endreg") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("endregion") state.SendReturn() Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(4, " #endregion ") End Using End Function Private Class SlowProvider Inherits CommonCompletionProvider Public checkpoint As Checkpoint = New Checkpoint() Public Overrides Async Function ProvideCompletionsAsync(context As CompletionContext) As Task Await checkpoint.Task.ConfigureAwait(False) End Function Friend Overrides Function IsInsertionTrigger(text As SourceText, characterPosition As Integer, options As OptionSet) As Boolean Return True End Function End Class Public Async Function BackspaceDismissesIfComputationIsIncomplete(completionImplementation As CompletionImplementation) As Task Dim slowProvider = New SlowProvider() Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , {slowProvider}) state.SendTypeChars("f") state.SendBackspace() ' Send a backspace that goes beyond the session's applicable span ' before the model computation has finished. Then, allow the ' computation to complete. There should still be no session. state.SendBackspace() slowProvider.checkpoint.Release() Await state.AssertNoCompletionSession() End Using End Function Public Async Function TypingWithoutMatchAfterBackspaceDismissesCompletion(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendBackspace() Await state.AssertCompletionSession() state.SendTypeChars("w") Await state.AssertNoCompletionSession() End Using End Function Public Async Function CommitUniqueItemWithBoxSelection(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendReturn() state.TextView.Selection.Mode = VisualStudio.Text.Editor.TextSelectionMode.Box state.SendCommitUniqueCompletionListItem() Await state.AssertNoCompletionSession() End Using End Function Public Async Function NoPreselectionOnSpaceWhenAbuttingWord(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertNoCompletionSession() End Using End Function Public Async Function SpacePreselectionAtEndOfFile(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(" ") Await state.AssertCompletionSession() End Using End Function Public Async Function DismissOnSelectAllCommand(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) ' Note: the caret is at the file, so the Select All command's movement ' of the caret to the end of the selection isn't responsible for ' dismissing the session. state.SendInvokeCompletionList() Await state.AssertCompletionSession() state.SendSelectAll() Await state.AssertNoCompletionSession() End Using End Function Public Async Function CompletionCommitAndFormatAreSeparateUndoTransactions(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("doo;") Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(6, " doodle;") state.SendUndo() Await state.WaitForAsynchronousOperationsAsync() state.AssertMatchesTextStartingAtLine(6, "doo;") End Using End Function Public Async Function SessionNotStartedWhenCaretNotMappableIntoSubjectBuffer(completionImplementation As CompletionImplementation) As Task ' In inline diff view, typing delete next to a "deletion", ' can cause our CommandChain to be called with a subjectbuffer ' and TextView such that the textView's caret can't be mapped ' into our subject buffer. ' ' To test this, we create a projection buffer with 2 source ' spans: one of "text" content type and one based on a C# ' buffer. We create a TextView with that projection as ' its buffer, setting the caret such that it maps only ' into the "text" buffer. We then call the completionImplementation ' command handlers with commandargs based on that TextView ' but with the C# buffer as the SubjectBuffer. Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) Dim textBufferFactoryService = state.GetExportedValue(Of ITextBufferFactoryService)() Dim contentTypeService = state.GetExportedValue(Of IContentTypeRegistryService)() Dim contentType = contentTypeService.GetContentType(ContentTypeNames.CSharpContentType) Dim textViewFactory = state.GetExportedValue(Of ITextEditorFactoryService)() Dim editorOperationsFactory = state.GetExportedValue(Of IEditorOperationsFactoryService)() Dim otherBuffer = textBufferFactoryService.CreateTextBuffer("text", contentType) Dim otherExposedSpan = otherBuffer.CurrentSnapshot.CreateTrackingSpan(0, 4, SpanTrackingMode.EdgeExclusive, TrackingFidelityMode.Forward) Dim subjectBufferExposedSpan = state.SubjectBuffer.CurrentSnapshot.CreateTrackingSpan(0, state.SubjectBuffer.CurrentSnapshot.Length, SpanTrackingMode.EdgeExclusive, TrackingFidelityMode.Forward) Dim projectionBufferFactory = state.GetExportedValue(Of IProjectionBufferFactoryService)() Dim projection = projectionBufferFactory.CreateProjectionBuffer(Nothing, New Object() {otherExposedSpan, subjectBufferExposedSpan}.ToList(), ProjectionBufferOptions.None) Using disposableView As DisposableTextView = textViewFactory.CreateDisposableTextView(projection) disposableView.TextView.Caret.MoveTo(New SnapshotPoint(disposableView.TextView.TextBuffer.CurrentSnapshot, 0)) Dim editorOperations = editorOperationsFactory.GetEditorOperations(disposableView.TextView) state.SendDeleteToSpecificViewAndBuffer(disposableView.TextView, state.SubjectBuffer) Await state.AssertNoCompletionSession() End Using End Using End Function Public Async Function TestMatchWithTurkishIWorkaround1(completionImplementation As CompletionImplementation) As Task Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("is") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem("IsInterned") End Using End Using End Function Public Async Function TestMatchWithTurkishIWorkaround2(completionImplementation As CompletionImplementation) As Task Using New CultureContext(New CultureInfo("tr-TR", useUserOverride:=False)) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("ı") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem() End Using End Using End Function Public Async Function TargetTypePreselection1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("cancellationToken", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselection2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("a") Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("args", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselection_DoesNotOverrideEnumPreselection(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("E", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselection_DoesNotOverrideEnumPreselection2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("E", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselection3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("c") Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("cx", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselectionLocalsOverType(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("c") Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("cx", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselectionParameterOverMethod(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("f", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselectionConvertibility1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("c") Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("cx", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TargetTypePreselectionLocalOverProperty(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("aaq", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TestGenericCallOnTypeContainingAnonymousType(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() state.SendTypeChars("(") Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) state.AssertMatchesTextStartingAtLine(7, "new[] { new { x = 1 } }.ToArray(") End Using End Function Public Async Function TargetTypePreselectionSetterValuey(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync().ConfigureAwait(True) Await state.AssertSelectedCompletionItem("value", isHardSelected:=True).ConfigureAwait(True) End Using End Function Public Async Function TestAnonymousTypeDescription(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(description:= $"({ CSharpFeaturesResources.extension }) 'a[] System.Collections.Generic.IEnumerable<'a>.ToArray<'a>() { FeaturesResources.Anonymous_Types_colon } 'a { FeaturesResources.is_ } new {{ int x }}") End Using End Function Public Async Function TestRecursiveGenericSymbolKey(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, (List list, T oldItem, T newItem) { $$ } }]]>, extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendTypeChars("list") state.SendTypeChars(".") Await state.AssertCompletionSession() state.SendTypeChars("Add") Await state.AssertSelectedCompletionItem("Add", description:="void List.Add(T item)") End Using End Function Public Async Function TestCommitNamedParameterWithColon(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , extraExportedTypes:={GetType(CSharpEditorFormattingService)}.ToList()) state.SendInvokeCompletionList() state.SendTypeChars(":") Await state.AssertNoCompletionSession() Assert.Contains("args:", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestBackspaceSelection1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) For Each c In "Offset" state.SendBackspace() Await state.WaitForAsynchronousOperationsAsync() Next Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("DateTime") End Using End Function Public Async Function TestBackspaceSelection2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) For Each c In "Offset." state.SendBackspace() Await state.WaitForAsynchronousOperationsAsync() Next Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("DateTime") End Using End Function Public Async Function TypingNumberShouldNotDismiss1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars(".") Await state.AssertCompletionSession() state.SendTypeChars("1") Await state.AssertSelectedCompletionItem("Moo1") End Using End Function Public Async Function TargetTypingDoesNotOverrideExactMatch(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("Path") Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("Path") End Using End Function Public Async Function MRUOverTargetTyping(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendTypeChars("Configure") state.SendTab() For i = 1 To "ConfigureAwait".Length state.SendBackspace() Next state.SendInvokeCompletionList() Await state.AssertCompletionSession() Await state.AssertSelectedCompletionItem("ConfigureAwait") End Using End Function Public Async Function MovingCaretToStartSoftSelects(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class C { void M() { $$ } } ) state.SendTypeChars("Conso") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="Console", isHardSelected:=True) For Each ch In "Conso" state.SendLeftKey() Next Await state.AssertSelectedCompletionItem(displayText:="Console", isHardSelected:=False) state.SendRightKey() Await state.AssertSelectedCompletionItem(displayText:="Console", isHardSelected:=True) End Using End Function Public Async Function TestNoBlockOnCompletionItems1(completionImplementation As CompletionImplementation) As Task Dim tcs = New TaskCompletionSource(Of Boolean) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using $$ , {New TaskControlledCompletionProvider(tcs.Task)}) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.BlockForCompletionItems, LanguageNames.CSharp, False) state.SendTypeChars("Sys.") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertNoCompletionSession() Assert.Contains("Sys.", state.GetLineTextFromCaretPosition()) tcs.SetResult(True) End Using End Function Public Async Function TestNoBlockOnCompletionItems2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using $$ , {New TaskControlledCompletionProvider(Task.FromResult(True))}) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.BlockForCompletionItems, LanguageNames.CSharp, False) state.SendTypeChars("Sys") Await state.WaitForAsynchronousOperationsAsync() Await state.AssertSelectedCompletionItem(displayText:="System") state.SendTypeChars(".") Assert.Contains("System.", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestNoBlockOnCompletionItems4(completionImplementation As CompletionImplementation) As Task ' This test verifies a scenario with the following conditions: ' a. A slow completion provider ' b. The block option set to false. ' Scenario: ' 1. Type 'Sys' ' 2. Send CommitIfUnique (Ctrl + space) ' 3. Wait for 250ms. ' 4. Verify that there is no completion window shown. In the new completion, we can just start the verification and check that the verification is still running. ' 5. Check that the commit is not yet provided: there is 'Sys' but no 'System' ' 6. Simulate unblocking the provider. ' 7. Verify that the completion completes CommitIfUnique. Dim tcs = New TaskCompletionSource(Of Boolean) Dim provider = New TaskControlledCompletionProvider(tcs.Task) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using $$ , {provider}) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.BlockForCompletionItems, LanguageNames.CSharp, False) state.SendTypeChars("Sys") If completionImplementation = CompletionImplementation.Legacy Then state.SendCommitUniqueCompletionListItem() Await Task.Delay(250) state.AssertNoCompletionSessionWithNoBlock() Assert.Contains("Sys", state.GetLineTextFromCaretPosition()) Assert.DoesNotContain("System", state.GetLineTextFromCaretPosition()) tcs.SetResult(True) Else Dim task1 As Task = Nothing Dim task2 As Task = Nothing Dim providerCalledHandler = Sub() task2 = New Task( Sub() Thread.Sleep(250) Try ' 3. Check that the other task is running/hanging. Assert.Equal(TaskStatus.Running, task1.Status) Assert.Contains("Sys", state.GetLineTextFromCaretPosition()) Assert.DoesNotContain("System", state.GetLineTextFromCaretPosition()) ' Need the Finally to avoid hangs if any of Asserts failed, the task will never complete and Task.WhenAll will wait forever. Finally ' 4. Unblock the first task and the main thread. tcs.SetResult(True) End Try End Sub) task1 = Task.Run( Sub() task2.Start() ' 2. Hang here as well: getting items is waiting provider to respond. Dim completionItem = state.GetSelectedItemOpt() End Sub) End Sub AddHandler provider.ProviderCalled, providerCalledHandler ' SendCommitUniqueCompletionListItem is a synchronous operation. ' It guarantees that ProviderCalled will be triggered and after that the completion will hang waiting for a task to be resolved. ' In the new completion, when pressed -, we have to wait for the aggregate operation to complete. ' 1. Hang here. state.SendCommitUniqueCompletionListItem() Assert.NotNull(task1) Assert.NotNull(task2) Await Task.WhenAll(task1, task2) End If Await state.WaitForAsynchronousOperationsAsync() Await state.AssertNoCompletionSession() Assert.Contains("System", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestNoBlockOnCompletionItems3(completionImplementation As CompletionImplementation) As Task ' This test verifies a scenario with the following conditions: ' a. A slow completion provider ' b. The block option set to false. ' Scenario: ' 1. Type 'Sys' ' 2. Send CommitIfUnique (Ctrl + space) ' 3. Wait for 250ms. ' 4. Verify that there is no completion window shown. In the new completion, we can just start the verification and check that the verification is still running. ' 5. Check that the commit is not yet provided: there is 'Sys' but no 'System' ' 6. The next statement in the UI thread after CommitIfUnique is typing 'a'. ' 7. Simulate unblocking the provider. ' 8. Verify that ' 8.a. The old completion adds 'a' to 'Sys' and displays 'Sysa'. CommitIfUnique is canceled because it was interrupted by typing 'a'. ' 8.b. The new completion completes CommitIfUnique and then adds 'a'. Dim tcs = New TaskCompletionSource(Of Boolean) Dim provider = New TaskControlledCompletionProvider(tcs.Task) Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using $$ , {provider}) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.BlockForCompletionItems, LanguageNames.CSharp, False) state.SendTypeChars("Sys") If completionImplementation = CompletionImplementation.Legacy Then state.SendCommitUniqueCompletionListItem() Await Task.Delay(250) state.AssertNoCompletionSessionWithNoBlock() Assert.Contains("Sys", state.GetLineTextFromCaretPosition()) Assert.DoesNotContain("System", state.GetLineTextFromCaretPosition()) state.SendTypeChars("a") tcs.SetResult(True) Await state.WaitForAsynchronousOperationsAsync() Await state.AssertCompletionSession() Assert.Contains("Sysa", state.GetLineTextFromCaretPosition()) Else Dim task1 As Task = Nothing Dim task2 As Task = Nothing Dim providerCalledHandler = Sub() task2 = New Task( Sub() Thread.Sleep(250) Try ' 3. Check that the other task is running/hanging. Assert.Equal(TaskStatus.Running, task1.Status) Assert.Contains("Sys", state.GetLineTextFromCaretPosition()) Assert.DoesNotContain("System", state.GetLineTextFromCaretPosition()) ' Need the Finally to avoid hangs if any of Asserts failed, the task will never complete and Task.WhenAll will wait forever. Finally ' 4. Unblock the first task and the main thread. tcs.SetResult(True) End Try End Sub) task1 = Task.Run( Sub() task2.Start() ' 2. Hang here as well: getting items is waiting provider to respond. Dim completionItem = state.GetSelectedItemOpt() End Sub) End Sub AddHandler provider.ProviderCalled, providerCalledHandler ' SendCommitUniqueCompletionListItem is a synchronous operation. ' It guarantees that ProviderCalled will be triggered and after that the completion will hang waiting for a task to be resolved. ' In the new completion, when pressed -, we have to wait for the aggregate operation to complete. ' 1. Hang here. state.SendCommitUniqueCompletionListItem() ' 5. Put insertion of 'a' into the edtior queue. It can be executed in the foreground thread only state.SendTypeChars("a") Assert.NotNull(task1) Assert.NotNull(task2) Await Task.WhenAll(task1, task2) Await state.WaitForAsynchronousOperationsAsync() Await state.AssertNoCompletionSession() ' Here is a difference between the old and the new completions: ' The old completion adds 'a' to 'Sys' and displays 'Sysa'. CommitIfUnique is canceled because it was interrupted by typing 'a'. ' The new completion completes CommitIfUnique and then adds 'a'. Assert.Contains("Systema", state.GetLineTextFromCaretPosition()) End If End Using End Function Private Class TaskControlledCompletionProvider Inherits CompletionProvider Private ReadOnly _task As Task Public Event ProviderCalled() Public Sub New(task As Task) _task = task End Sub Public Overrides Function ProvideCompletionsAsync(context As CompletionContext) As Task RaiseEvent ProviderCalled() Return _task End Function End Class Public Async Function Filters_EmptyList1(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Dim filters = state.GetCompletionItemFilters() Dim dict = New Dictionary(Of CompletionItemFilter, Boolean) For Each f In filters dict(f) = False Next dict(CompletionItemFilter.InterfaceFilter) = True Dim args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.WaitForAsynchronousOperationsAsync() Assert.Null(state.GetSelectedItem()) End Using End Function Public Async Function Filters_EmptyList2(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Dim filters = state.GetCompletionItemFilters() Dim dict = New Dictionary(Of CompletionItemFilter, Boolean) For Each f In filters dict(f) = False Next dict(CompletionItemFilter.InterfaceFilter) = True Dim args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.WaitForAsynchronousOperationsAsync() Assert.Null(state.GetSelectedItem()) state.SendTab() Await state.AssertNoCompletionSession() End Using End Function Public Async Function Filters_EmptyList3(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Dim filters = state.GetCompletionItemFilters() Dim dict = New Dictionary(Of CompletionItemFilter, Boolean) For Each f In filters dict(f) = False Next dict(CompletionItemFilter.InterfaceFilter) = True Dim args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.WaitForAsynchronousOperationsAsync() Assert.Null(state.GetSelectedItem()) state.SendReturn() Await state.AssertNoCompletionSession() End Using End Function Public Async Function Filters_EmptyList4(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.WaitForAsynchronousOperationsAsync() Dim filters = state.GetCompletionItemFilters() Dim dict = New Dictionary(Of CompletionItemFilter, Boolean) For Each f In filters dict(f) = False Next dict(CompletionItemFilter.InterfaceFilter) = True Dim args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.WaitForAsynchronousOperationsAsync() Assert.Null(state.GetSelectedItem()) state.SendTypeChars(".") Await state.AssertNoCompletionSession() End Using End Function Public Async Function CompletionAfterDotBeforeAwaitTask(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.AssertCompletionSession() End Using End Function Public Async Function BackspaceTriggerSubstringMatching(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; class Program { static void Main(string[] args) { if (Environment$$ } } ) Dim key = New OptionKey(CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp) state.Workspace.Options = state.Workspace.Options.WithChangedOption(key, True) state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="Environment", isHardSelected:=True) End Using End Function Public Async Function AttributeNamedParameterEqualsItemCommittedOnSpace(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, [A($$)] class AAttribute: Attribute { public string Skip { get; set; } } ) state.SendTypeChars("Skip") Await state.AssertCompletionSession() state.SendTypeChars(" ") Await state.AssertNoCompletionSession() Assert.Equal("[A(Skip )]", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestFilteringAfterSimpleInvokeShowsAllItemsMatchingFilter(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, ) state.SendInvokeCompletionList() Await state.AssertSelectedCompletionItem("Red") state.CompletionItemsContainsAll(displayText:={"Red", "Green", "Blue", "Equals"}) Dim filters = state.GetCompletionItemFilters() Dim dict = New Dictionary(Of CompletionItemFilter, Boolean) For Each f In filters dict(f) = False Next dict(CompletionItemFilter.EnumFilter) = True Dim args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.AssertSelectedCompletionItem("Red") state.CompletionItemsContainsAll(displayText:={"Red", "Green", "Blue"}) Assert.False(state.GetCompletionItems().Any(Function(i) i.DisplayText = "Equals")) For Each f In filters dict(f) = False Next args = New CompletionItemFilterStateChangedEventArgs(dict.ToImmutableDictionary()) state.RaiseFiltersChanged(args) Await state.AssertSelectedCompletionItem("Red") state.CompletionItemsContainsAll(displayText:={"Red", "Green", "Blue", "Equals"}) End Using End Function Public Async Function NameCompletionSorting(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, interface ISyntaxFactsService {} class C { void M() { ISyntaxFactsService $$ } } ) state.SendInvokeCompletionList() Await state.AssertCompletionSession() Dim expectedOrder = { "syntaxFactsService", "syntaxFacts", "factsService", "syntax", "service" } state.AssertItemsInOrder(expectedOrder) End Using End Function Public Sub TestLargeChangeBrokenUpIntoSmallTextChanges(completionImplementation As CompletionImplementation) Dim provider = New MultipleChangeCompletionProvider() Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , {provider}) Dim testDocument = state.Workspace.Documents(0) Dim textBuffer = testDocument.TextBuffer Dim snapshotBeforeCommit = textBuffer.CurrentSnapshot provider.SetInfo(snapshotBeforeCommit.GetText(), testDocument.CursorPosition.Value) ' First send a space to trigger out special completionImplementation provider. state.SendInvokeCompletionList() state.SendTab() ' Verify that we see the entire change Dim finalText = textBuffer.CurrentSnapshot.GetText() Assert.Equal( "using NewUsing; using System; class C { void goo() { return InsertedItem } }", finalText) Dim changes = snapshotBeforeCommit.Version.Changes ' This should have happened as two text changes to the buffer. Assert.Equal(2, changes.Count) Dim actualChanges = changes.ToArray() Dim firstChange = actualChanges(0) Assert.Equal(New Span(0, 0), firstChange.OldSpan) Assert.Equal("using NewUsing;", firstChange.NewText) Dim secondChange = actualChanges(1) Assert.Equal(New Span(testDocument.CursorPosition.Value, 0), secondChange.OldSpan) Assert.Equal("InsertedItem", secondChange.NewText) ' Make sure new edits happen after the text that was inserted. state.SendTypeChars("1") finalText = textBuffer.CurrentSnapshot.GetText() Assert.Equal( "using NewUsing; using System; class C { void goo() { return InsertedItem1 } }", finalText) End Using End Sub Public Sub TestLargeChangeBrokenUpIntoSmallTextChanges2(completionImplementation As CompletionImplementation) Dim provider = New MultipleChangeCompletionProvider() Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, , {provider}) Dim testDocument = state.Workspace.Documents(0) Dim textBuffer = testDocument.TextBuffer Dim snapshotBeforeCommit = textBuffer.CurrentSnapshot provider.SetInfo(snapshotBeforeCommit.GetText(), testDocument.CursorPosition.Value) ' First send a space to trigger out special completionImplementation provider. state.SendInvokeCompletionList() state.SendTab() ' Verify that we see the entire change Dim finalText = textBuffer.CurrentSnapshot.GetText() Assert.Equal( "using NewUsing; using System; class C { void goo() { return InsertedItem } }", finalText) Dim changes = snapshotBeforeCommit.Version.Changes ' This should have happened as two text changes to the buffer. Assert.Equal(2, changes.Count) Dim actualChanges = changes.ToArray() Dim firstChange = actualChanges(0) Assert.Equal(New Span(0, 0), firstChange.OldSpan) Assert.Equal("using NewUsing;", firstChange.NewText) Dim secondChange = actualChanges(1) Assert.Equal(New Span(testDocument.CursorPosition.Value - "Custom".Length, "Custom".Length), secondChange.OldSpan) Assert.Equal("InsertedItem", secondChange.NewText) ' Make sure new edits happen after the text that was inserted. state.SendTypeChars("1") finalText = textBuffer.CurrentSnapshot.GetText() Assert.Equal( "using NewUsing; using System; class C { void goo() { return InsertedItem1 } }", finalText) End Using End Sub Public Async Function TestRegionDirectiveIndentation(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { $$ } , includeFormatCommandHandler:=True) state.SendTypeChars("#") Await state.WaitForAsynchronousOperationsAsync() Assert.Equal("#", state.GetLineFromCurrentCaretPosition().GetText()) Await state.AssertCompletionSessionAfterTypingHash() state.SendTypeChars("reg") Await state.AssertSelectedCompletionItem(displayText:="region") state.SendReturn() Await state.AssertNoCompletionSession() Assert.Equal(" #region", state.GetLineFromCurrentCaretPosition().GetText()) Assert.Equal(state.GetLineFromCurrentCaretPosition().End, state.GetCaretPoint().BufferPosition) state.SendReturn() Assert.Equal("", state.GetLineFromCurrentCaretPosition().GetText()) state.SendTypeChars("#") Await state.WaitForAsynchronousOperationsAsync() Assert.Equal("#", state.GetLineFromCurrentCaretPosition().GetText()) Await state.AssertCompletionSessionAfterTypingHash() state.SendTypeChars("endr") Await state.AssertSelectedCompletionItem(displayText:="endregion") state.SendReturn() Assert.Equal(" #endregion", state.GetLineFromCurrentCaretPosition().GetText()) Assert.Equal(state.GetLineFromCurrentCaretPosition().End, state.GetCaretPoint().BufferPosition) End Using End Function Public Async Function AfterIdentifierInCaseLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { void M() { switch (true) { case identifier $$ } } } ) state.SendTypeChars("w") Await state.AssertSelectedCompletionItem(displayText:="when", isHardSelected:=False) state.SendBackspace() state.SendTypeChars("i") Await state.AssertSelectedCompletionItem(displayText:="identifier", isHardSelected:=False) End Using End Function Public Async Function AfterIdentifierInCaseLabel_ColorColor(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class identifier { } class C { const identifier identifier = null; void M() { switch (true) { case identifier $$ } } } ) state.SendTypeChars("w") Await state.AssertSelectedCompletionItem(displayText:="when", isHardSelected:=False) state.SendBackspace() state.SendTypeChars("i") Await state.AssertSelectedCompletionItem(displayText:="identifier", isHardSelected:=False) End Using End Function Public Async Function AfterIdentifierInCaseLabel_ClassNameOnly(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class identifier { } class C { void M() { switch (true) { case identifier $$ } } } ) state.SendTypeChars("w") Await state.AssertSelectedCompletionItem(displayText:="identifier", isHardSelected:=False) state.SendBackspace() state.SendTypeChars("i") Await state.AssertSelectedCompletionItem(displayText:="identifier", isHardSelected:=False) End Using End Function Public Async Function AfterDoubleIdentifierInCaseLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { void M() { switch (true) { case identifier identifier $$ } } } ) state.SendTypeChars("w") Await state.AssertSelectedCompletionItem(displayText:="when", isHardSelected:=True) End Using End Function Public Async Function TestGenericAsyncTaskDeclaration(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, namespace A.B { class TestClass { } } namespace A { class C { async Task<A$$ Method() { } } } ) state.SendTypeChars(".") Await state.AssertSelectedCompletionItem(displayText:="B", isSoftSelected:=True) End Using End Function Public Async Function TestAfterCasePatternSwitchLabel(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { void M() { object o = 1; switch(o) { case int i: $$ break; } } } ) state.SendTypeChars("this") Await state.AssertSelectedCompletionItem(displayText:="this", isHardSelected:=True) End Using End Function Public Async Function TestBackspaceInMiddleOfSelection(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, public enum foo { aaa } public class Program { public static void Main(string[] args) { foo.a$$a } } ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendInvokeCompletionList() state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="aaa", isHardSelected:=True) End Using End Function Public Async Function TestBackspaceWithMultipleCharactersSelected(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, using System; public class Program { public static void Main(string[] args) { Console.WriteLine$$ } } ) state.Workspace.Options = state.Workspace.Options.WithChangedOption( CompletionOptions.TriggerOnDeletion, LanguageNames.CSharp, True) state.SendInvokeCompletionList() state.SelectAndMoveCaret(-6) state.SendBackspace() Await state.AssertSelectedCompletionItem(displayText:="Write", isHardSelected:=True) End Using End Function Public Async Function TestMRUKeepsTwoRecentlyUsedItems(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { public double Ma(double m) => m; public void Test() { $$ } } ) state.SendTypeChars("M(M(M(M(") Await state.AssertNoCompletionSession() Assert.Equal(" Ma(m:(Ma(m:(", state.GetLineTextFromCaretPosition()) End Using End Function Public Async Function TestNamedParameterDoesNotAddExtraColon(completionImplementation As CompletionImplementation) As Task Using state = TestStateFactory.CreateCSharpTestState(completionImplementation, class C { public double M(double some) => m; public void Test() { $$ } } ) state.SendTypeChars("M(some:M(some:") Await state.AssertNoCompletionSession() Assert.Equal(" M(some:M(some:", state.GetLineTextFromCaretPosition()) End Using End Function Private Class MultipleChangeCompletionProvider Inherits CompletionProvider Private _text As String Private _caretPosition As Integer Public Sub SetInfo(text As String, caretPosition As Integer) _text = text _caretPosition = caretPosition End Sub Public Overrides Function ProvideCompletionsAsync(context As CompletionContext) As Task context.AddItem(CompletionItem.Create( "CustomItem", rules:=CompletionItemRules.Default.WithMatchPriority(1000))) Return Task.CompletedTask End Function Public Overrides Function ShouldTriggerCompletion(text As SourceText, caretPosition As Integer, trigger As CompletionTrigger, options As OptionSet) As Boolean Return True End Function Public Overrides Function GetChangeAsync(document As Document, item As CompletionItem, commitKey As Char?, cancellationToken As CancellationToken) As Task(Of CompletionChange) Dim newText = "using NewUsing; using System; class C { void goo() { return InsertedItem" Dim change = CompletionChange.Create( New TextChange(New TextSpan(0, _caretPosition), newText)) Return Task.FromResult(change) End Function End Class End Class End Namespace