' 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 Microsoft.CodeAnalysis.Editor.Host Imports Microsoft.CodeAnalysis.Editor.UnitTests.DocumentationComments Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces Imports Microsoft.CodeAnalysis.Editor.VisualBasic.DocumentationComments Imports Microsoft.VisualStudio.Text.Operations Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.DocumentationComments Public Class DocumentationCommentTests Inherits AbstractDocumentationCommentTests Public Sub TypingCharacter_Class() Const code = " ''$$ Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_Method() Const code = " Class C ''$$ Function M(Of T)(foo As Integer, i() As Integer) As Integer Return 0 End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' ''' ''' ''' Function M(Of T)(foo As Integer, i() As Integer) As Integer Return 0 End Function End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NoReturnType() Const code = " Class C ''$$ Function F() End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' Function F() End Function End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotWhenDocCommentExists1() Const code = " ''$$ ''' Class C End Class " Const expected = " '''$$ ''' Class C End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotWhenDocCommentExists2() Const code = " Class C ''$$ ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " Const expected = " Class C '''$$ ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotAfterClassName() Const code = " Class C''$$ End Class " Const expected = " Class C'''$$ End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotInsideClass() Const code = " Class C ''$$ End Class " Const expected = " Class C '''$$ End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotAfterConstructorName() Const code = " Class C Sub New() ''$$ End Class " Const expected = " Class C Sub New() '''$$ End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotInsideConstructor() Const code = " Class C Sub New() ''$$ End Sub End Class " Const expected = " Class C Sub New() '''$$ End Sub End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NotInsideMethodBody() Const code = " Class C Sub Foo() ''$$ End Sub End Class " Const expected = " Class C Sub Foo() '''$$ End Sub End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub TypingCharacter_NoReturnsOnWriteOnlyProperty() Const code = " Class C ''$$ WriteOnly Property Prop As Integer Set(ByVal value As Integer End Set End Property End Class " Const expected = " Class C ''' ''' $$ ''' WriteOnly Property Prop As Integer Set(ByVal value As Integer End Set End Property End Class " VerifyTypingCharacter(code, expected) End Sub Public Sub PressingEnter_Class1() Const code = " '''$$ Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Class2() Const code = " '''$$Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Class3() Const code = " '''$$ Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Module() Const code = " '''$$Module M Dim x As Integer End Module " Const expected = " ''' ''' $$ ''' Module M Dim x As Integer End Module " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Method1() Const code = " Class C '''$$ Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' ''' ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Method2() Const code = " Class C '''$$Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' ''' ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes1() Const code = " '''$$ ''' Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes2() Const code = " ''' ''' $$ ''' Class C End Class " Const expected = " ''' ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes3() Const code = " ''' $$ Class C End Class " Const expected = " ''' ''' $$ Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes4() Const code = " '''$$ ''' Class C End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes5() Const code = " ''' ''' $$ ''' Class C End Class " Const expected = " ''' ''' ''' $$ ''' Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes6() Const code = " ''' $$ Class C End Class " Const expected = " ''' ''' $$ Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes7() Const code = " Class C '''$$ ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " Const expected = " Class C ''' ''' $$ ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InsertApostrophes8() Const code = " ''' $$ Class C End Class " Const expected = " ''' ''' $$ Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_DontInsertApostrophes1() Const code = " ''' ''' $$ Class C End Class " Const expected = " ''' ''' $$ Class C End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_NotInsideConstructor() Const code = " Class C Sub New() '''$$ End Sub End Class " Const expected = " Class C Sub New() ''' $$ End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_NotInsideMethodBody() Const code = " Class C Sub Foo() '''$$ End Sub End Class " Const expected = " Class C Sub Foo() ''' $$ End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_NotBeforeDocComment() Const code = " Class c1 $$''' ''' ''' ''' Public Sub Foo() Dim x = 1 End Sub End Class " Const expected = " Class c1 $$''' ''' ''' ''' Public Sub Foo() Dim x = 1 End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_InTextBeforeSpace() Const code = " Class C ''' ''' hello$$ world ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' hello ''' $$world ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Indentation1() Const code = " Class C ''' ''' hello world$$ ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' hello world ''' $$ ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Indentation2() Const code = " Class C ''' ''' hello $$world ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' hello ''' $$world ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Indentation3() Const code = " Class C ''' ''' hello$$ world ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' hello ''' $$world ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Indentation4() Const code = " Class C ''' ''' $$hello world ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' ''' $$hello world ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected) End Sub Public Sub PressingEnter_Indentation5_UseTabs() Const code = " Class C ''' ''' hello world$$ ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' hello world ''' $$ ''' Sub M() End Sub End Class " VerifyPressingEnter(code, expected, useTabs:=True) End Sub Public Sub Command_Class() Const code = " Class C $$ End Class " Const expected = " ''' ''' $$ ''' Class C End Class " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_Class_NotIfCommentExists() Const code = " ''' Class C $$ End Class " Const expected = " ''' Class C $$ End Class " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_Method1() Const code = " Class C Function F()$$ End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' Function F() End Function End Class " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_Method2() Const code = " Class C Function M(Of T)(foo As Integer) As Integer $$Return 0 End Function End Class " Const expected = " Class C ''' ''' $$ ''' ''' ''' ''' Function M(Of T)(foo As Integer) As Integer Return 0 End Function End Class " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_Method_NotIfCommentExists() Const code = " Class C ''' Function M(Of T)(foo As Integer) As Integer $$Return 0 End Function End Class " Const expected = " Class C ''' Function M(Of T)(foo As Integer) As Integer $$Return 0 End Function End Class " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_FirstModuleOnLine() Const code = " $$Module M : End Module : Module N : End Module " Const expected = " ''' ''' $$ ''' Module M : End Module : Module N : End Module " VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_NotOnSecondModuleOnLine() Const code = "Module M : End Module : $$Module N : End Module" Const expected = "Module M : End Module : $$Module N : End Module" VerifyInsertCommentCommand(code, expected) End Sub Public Sub Command_FirstPropertyOnLine() Const code = " Module M Property $$i As Integer : Property j As Integer End Module " Const expected = " Module M ''' ''' $$ ''' ''' Property i As Integer : Property j As Integer End Module " VerifyInsertCommentCommand(code, expected) End Sub Public Sub TestOpenLineAbove1() Const code = " Class C ''' ''' stuff$$ ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' $$ ''' stuff ''' Sub M() End Sub End Class " VerifyOpenLineAbove(code, expected) End Sub Public Sub TestOpenLineAbove2() Const code = " Class C ''' ''' $$stuff ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' $$ ''' stuff ''' Sub M() End Sub End Class " VerifyOpenLineAbove(code, expected) End Sub Public Sub TestOpenLineAbove3() Const code = " Class C ''' $$ ''' stuff ''' Sub M() End Sub End Class " ' Note that the caret position specified below does Not look correct because ' it Is in virtual space in this case. Const expected = " Class C $$ ''' ''' stuff ''' Sub M() End Sub End Class " VerifyOpenLineAbove(code, expected) End Sub Public Sub TestOpenLineAbove4_Tabs() Const code = " Class C ''' ''' $$stuff ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' $$ ''' stuff ''' Sub M() End Sub End Class " VerifyOpenLineAbove(code, expected, useTabs:=True) End Sub Public Sub TestOpenLineBelow1() Const code = " Class C ''' ''' stuff$$ ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' stuff ''' $$ ''' Sub M() End Sub End Class " VerifyOpenLineBelow(code, expected) End Sub Public Sub TestOpenLineBelow2() Const code = " Class C ''' ''' $$stuff ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' stuff ''' $$ ''' Sub M() End Sub End Class " VerifyOpenLineBelow(code, expected) End Sub Public Sub TestOpenLineBelow3() Const code = " ''' ''' stuff ''' $$" Const expected = " ''' ''' stuff ''' ''' $$" VerifyOpenLineBelow(code, expected) End Sub Public Sub TestOpenLineBelow4_Tabs() Const code = " Class C ''' ''' $$stuff ''' Sub M() End Sub End Class " Const expected = " Class C ''' ''' stuff ''' $$ ''' Sub M() End Sub End Class " VerifyOpenLineBelow(code, expected, useTabs:=True) End Sub Friend Overrides Function CreateCommandHandler( waitIndicator As IWaitIndicator, undoHistoryRegistry As ITextUndoHistoryRegistry, editorOperationsFactoryService As IEditorOperationsFactoryService, completionService As IAsyncCompletionService) As ICommandHandler Return New DocumentationCommentCommandHandler(waitIndicator, undoHistoryRegistry, editorOperationsFactoryService, completionService) End Function Protected Overrides Function CreateTestWorkspace(code As String) As TestWorkspace Return VisualBasicWorkspaceFactory.CreateWorkspaceFromLines(code) End Function Protected Overrides ReadOnly Property DocumentationCommentCharacter As Char Get Return "'"c End Get End Property End Class End Namespace