/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/EditorFeatures/VisualBasicTest/Completion/CompletionProviders/AwaitCompletionProviderTests.vb
600 строк
16 KB
Cyrus Najmabadi
Apply test attributes consistently
12 сен 2022, 08:59
12 сен 2022, 08:59
45dee7d
Код
Авторство
О чём код?
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports Microsoft.CodeAnalysis.VisualBasic.Completion.Providers Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.CompletionProviders <Trait(Traits.Feature, Traits.Features.Completion)> Public Class AwaitCompletionProviderTests Inherits AbstractVisualBasicCompletionProviderTests Friend Overrides Function GetCompletionProviderType() As Type Return GetType(AwaitCompletionProvider) End Function Protected Async Function VerifyAwaitKeyword(markup As String, Optional dotAwait As Boolean = False, Optional dotAwaitf As Boolean = False) As Task Dim expectedDescription = If(dotAwait, GetDescription("Await", FeaturesResources.Await_the_preceding_expression), GetDescription("Await", FeaturesResources.Asynchronously_waits_for_the_task_to_finish)) Await VerifyItemExistsAsync(markup, "Await", expectedDescriptionOrNull:=expectedDescription) If dotAwaitf Then expectedDescription = String.Format(FeaturesResources.Await_the_preceding_expression_and_add_ConfigureAwait_0, "False") Await VerifyItemExistsAsync(markup, "Awaitf", expectedDescriptionOrNull:=expectedDescription) Else Await VerifyItemIsAbsentAsync(markup, "Awaitf") End If End Function Private Shared Function GetDescription(ByVal keyword As String, ByVal tooltip As String) As String Return $"{String.Format(FeaturesResources._0_Keyword, keyword)}{vbCrLf}{tooltip}" End Function <Fact> Public Async Function InSynchronousMethodTest() As Task Await VerifyAwaitKeyword(" Class C Sub Goo() Dim z = $$ End Sub End Class ") End Function <Fact> Public Async Function InMethodStatementTest() As Task Await VerifyAwaitKeyword(" Class C Async Sub Goo() $$ End Sub End Class ") End Function <Fact> Public Async Function InMethodExpressionTest() As Task Await VerifyAwaitKeyword(" Class C Async Sub Goo() Dim z = $$ End Sub End Class ") End Function <Fact> Public Async Function NotInCatchTest() As Task Await VerifyNoItemsExistAsync(" Class C Async Sub Goo() Try Catch Dim z = $$ End Try End Sub End Class ") End Function <Fact> Public Async Function NotInCatchExceptionFilterTest() As Task Await VerifyNoItemsExistAsync(" Class C Async Sub Goo() Try Catch When Err = $$ End Try End Sub End Class ") End Function <Fact> Public Async Function InCatchNestedDelegateTest() As Task Await VerifyAwaitKeyword(" Class C Async Sub Goo() Try Catch Dim z = Function() $$ End Try End Sub End Class ") End Function <Fact> Public Async Function NotInFinallyTest() As Task Await VerifyNoItemsExistAsync(" Class C Async Sub Goo() Try Finally Dim z = $$ End Try End Sub End Class ") End Function <Fact> Public Async Function NotInSyncLockTest() As Task Await VerifyNoItemsExistAsync(" Class C Async Sub Goo() SyncLock True Dim z = $$ End SyncLock End Sub End Class ") End Function <Fact> Public Async Function DotAwaitInAsyncSub() As Task Await VerifyAwaitKeyword(" Imports System.Threading.Tasks Class C Async Sub Goo() Task.CompletedTask.$$ End Sub End Class ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitSuggestAfterDotOnTaskOfT() As Task Await VerifyAwaitKeyword(" Imports System.Threading.Tasks Class C Private Async Function F(ByVal someTask As Task(Of Integer)) As Task someTask.$$ End Function End Class ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitSuggestAfterDotOnValueTask() As Task Dim valueTaskAssembly = GetType(ValueTask).Assembly.Location Await VerifyAwaitKeyword($" <Workspace> <Project Language=""Visual Basic"" AssemblyName=""Assembly1"" CommonReferences=""true""> <MetadataReference>{valueTaskAssembly}</MetadataReference> <Document FilePath=""Test2.cs""> Imports System.Threading.Tasks Class C Private Async Function F(ByVal someTask As ValueTask) As Task someTask.$$ End Function End Class </Document> </Project> </Workspace> ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitSuggestAfterDotOnCustomAwaitable() As Task Await VerifyAwaitKeyword(" Imports System Imports System.Runtime.CompilerServices Imports System.Threading.Tasks Public Class DummyAwaiter Implements INotifyCompletion Public ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property Public Sub OnCompleted(ByVal continuation As Action) Return continuation() End Sub Public Sub GetResult() End Sub End Class Public Class CustomAwaitable Public Function GetAwaiter() As DummyAwaiter Return New DummyAwaiter() End Function End Class Module Program Private Async Function Main() As Task Dim awaitable = New CustomAwaitable() awaitable.$$ End Function End Module ", dotAwait:=True) End Function <Fact> Public Async Function DotAwaitSuggestAfterDotBeforeType() As Task Await VerifyAwaitKeyword(" Imports System Imports System.Threading.Tasks Module Program Private Async Function Main(ByVal someTask As Task) As Task someTask.$$ Dim i As Int32 = 0 End Function End Module ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitSuggestAfterDotBeforeAnotherAwait() As Task Await VerifyAwaitKeyword(" Imports System Imports System.Threading.Tasks Module Program Private Async Function Main(ByVal someTask As Task) As Task someTask.$$ Await Test() End Function Private Async Function Test() As Task End Function End Module ", dotAwait:=True, dotAwaitf:=True) End Function <Theory> <InlineData("StaticField.$$")> <InlineData("StaticProperty.$$")> <InlineData("StaticMethod().$$")> <InlineData("local.$$")> <InlineData("parameter.$$")> <InlineData("c.Field.$$")> <InlineData("c.Property.$$")> <InlineData("c.Method().$$")> <InlineData("c.Self.Field.$$")> <InlineData("c.Self.Property.$$")> <InlineData("c.Self.Method().$$")> <InlineData("c.Func()().$$")> <InlineData("c(0).$$")> <InlineData("Dim t = (CType(c, Task)).$$")> <InlineData("Dim t = (TryCast(c, Task)).$$")> <InlineData("Dim t = (parameter).$$")> <InlineData("Dim t = ((parameter)).$$")> <InlineData("Dim t = if(true, parameter, parameter).$$")> <InlineData("Dim t = if(null, Task.CompletedTask).$$")> Public Async Function DotAwaitSuggestAfterDifferentExpressions(ByVal expression As String) As Task Dim t = If(True, expression, expression).Length Await VerifyAwaitKeyword($" Imports System Imports System.Threading.Tasks Class C Public ReadOnly Property Self As C Get Return Me End Get End Property Public Field As Task = Task.CompletedTask Public Function Method() As Task Return Task.CompletedTask End Function Public ReadOnly Property [Property] As Task Get Return Task.CompletedTask End Get End Property Default Public ReadOnly Property Item(ByVal i As Integer) As Task Get Return Task.CompletedTask End Get End Property Public Function Func() As Func(Of Task) Return Function() Task.CompletedTask End Function End Class Module Program Shared StaticField As Task = Task.CompletedTask Private Shared ReadOnly Property StaticProperty As Task Get Return Task.CompletedTask End Get End Property Private Function StaticMethod() As Task Return Task.CompletedTask End Function Private Async Function Main(ByVal parameter As Task) As Task Dim local As Task = Task.CompletedTask Dim c = New C() {expression} End Function End Module ", dotAwait:=True, dotAwaitf:=True) End Function <Theory> <InlineData("Await Task.Run(Async Function() Task.CompletedTask.$$")> <InlineData("Await Task.Run(Async Function() someTask.$$)")> <InlineData(" Await Task.Run(Async Function() someTask.$$ End Function)")> <InlineData(" Await Task.Run(Async Function() someTask.$$")> <InlineData("Task.Run(Async Function() Await someTask).$$")> <InlineData("Await Task.Run(Function() someTask.$$")> Public Async Function DotAwaitSuggestInLambdas(lambda As String) As Task Await VerifyAwaitKeyword($" Imports System.Threading.Tasks Module Program Private Async Function Main() As Task Dim someTask = Task.CompletedTask {lambda} End Function End Module ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitNotAfterDotOnTaskIfAlreadyAwaited() As Task Await VerifyNoItemsExistAsync(" Imports System.Threading.Tasks Class C Private Async Function F(ByVal someTask As Task) As Task Await someTask.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitNotAfterTaskType() As Task Await VerifyNoItemsExistAsync(" Imports System.Threading.Tasks Class C Private Async Function F() As Task Task.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitNotInLock() As Task Await VerifyNoItemsExistAsync(" Imports System.Threading.Tasks Class C Private Async Function F(ByVal someTask As Task) As Task SyncLock Me someTask.$$ End SyncLock End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryNotInSelect() As Task Await VerifyNoItemsExistAsync(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim z = From t In {Task.CompletedTask} Select t.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryInFirstFromClause() As Task Await VerifyAwaitKeyword(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim arrayTask1 = Task.FromResult(new Integer() {}) Dim qry = From i In arrayTask1.$$ End Function End Class ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitQueryNotInSecondFromClause_1() As Task Await VerifyNoItemsExistAsync(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1 From i2 In arrayTask2.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryNotInSecondFromClause_2() As Task Await VerifyNoItemsExistAsync(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1, i2 In arrayTask2.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryNotInSecondFromClause_3() As Task Await VerifyNoItemsExistAsync(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1 From i2 In array1, i2 In arrayTask2.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryNotInSecondFromClause_4() As Task Await VerifyNoItemsExistAsync(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1, i2 In array1 From i3 In arrayTask2.$$ End Function End Class ") End Function <Fact> Public Async Function DotAwaitQueryInJoinClause() As Task Await VerifyAwaitKeyword(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1 Join i2 In arrayTask2.$$ On i1 Equals i2 End Function End Class ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitQueryInGroupJoinClause() As Task Await VerifyAwaitKeyword(" Imports System.Linq Imports System.Threading.Tasks Class C Private Async Function F() As Task Dim array1 = new Integer() {} Dim arrayTask2 = Task.FromResult(new Integer() {}) Dim qry = From i1 In array1 Group Join i2 In arrayTask2.$$ On i1 Equals i2 Into g = Group End Function End Class ", dotAwait:=True, dotAwaitf:=True) End Function <Fact> Public Async Function DotAwaitNotAfterConditionalAccessOfTaskMembers() As Task Await VerifyNoItemsExistAsync(" Imports System.Threading.Tasks Class C Private Async Function F(ByVal someTask As Task) As Task someTask?.$$ End Function End Class ") End Function <Theory> <InlineData("c?.SomeTask.$$")> <InlineData("c.M()?.SomeTask.$$")> <InlineData("c.Pro?.SomeTask.$$")> <InlineData("c?.M().SomeTask.$$")> <InlineData("c?.Pro.SomeTask.$$")> <InlineData("c?.M()?.SomeTask.$$")> <InlineData("c?.Pro?.SomeTask.$$")> <InlineData("c.M()?.Pro.SomeTask.$$")> <InlineData("c.Pro?.M().SomeTask.$$")> <InlineData("c.M()?.M().M()?.M().SomeTask.$$")> <InlineData("new C().M()?.Pro.M()?.M().SomeTask.$$")> Public Async Function DotAwaitNotAfterDotInConditionalAccessChain(ByVal conditionalAccess As String) As Task Await VerifyNoItemsExistAsync($" Imports System.Threading.Tasks Public Class C Public ReadOnly Property SomeTask As Task Get Return Task.CompletedTask End Get End Property Public ReadOnly Property Pro As C Get Return Me End Get End Property Public Function M() As C Return Me End Function End Class Module Program Async Function Main() As Task Dim c = New C() If True Then {conditionalAccess} End If End Function End Module ") End Function End Class End Namespace