diff --git a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj index 9c646cc69dda9eedb7241552b527fc7db432065f..c5c5244145ec81054c276d325bc08a79673ae6d5 100644 --- a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj +++ b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj @@ -158,7 +158,8 @@ - + + diff --git a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFile.cs b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFile.cs new file mode 100644 index 0000000000000000000000000000000000000000..e6ce4f18e686db46c4bdb3a9c189463dc276e428 --- /dev/null +++ b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFile.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Roslyn.Test.Utilities; +using Xunit; + +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeActions.MoveType +{ + public partial class MoveTypeTests : CSharpMoveTypeTestsBase + { + [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] + public async Task SingleClassInFile_RenameFile() + { + var code = +@"[||]class Class1 { }"; + + var expectedDocumentName = "Class1.cs"; + + await TestRenameFileToMatchTypeAsync(code, expectedDocumentName); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] + public async Task TypeNameMatchesFileName_RenameFile() + { + // testworkspace creates files like test1.cs, test2.cs and so on.. + // so type name matches filename here and rename file action should not be offered. + var code = +@"[||]class test1 { }"; + + await TestRenameFileToMatchTypeAsync(code, expectedCodeAction: false); + } + + [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] + public async Task MoreThanOneTypeInFile_RenameFile() + { + var code = +@"[||]class Class1 { } +class Class2 { }"; + + await TestRenameFileToMatchTypeAsync(code, expectedCodeAction: false); + } + } +} diff --git a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.cs b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameType.cs similarity index 74% rename from src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.cs rename to src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameType.cs index f69ff0661429633dff6a9155d399637efcf45855..69852e922ed6f21cc9f8f704bf3ac724b98b5c01 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.cs +++ b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.RenameType.cs @@ -9,41 +9,35 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeActions.MoveType public partial class MoveTypeTests : CSharpMoveTypeTestsBase { [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] - public async Task SingleClassInFile() + public async Task SingleClassInFile_RenameType() { var code = @"[||]class Class1 { }"; - var expectedDocumentName = "Class1.cs"; - - await TestRenameFileToMatchTypeAsync(code, expectedDocumentName); - var codeWithTypeRenamedToMatchFileName = -@"class test1 { }"; +@"class [|test1|] { }"; await TestRenameTypeToMatchFileAsync(code, codeWithTypeRenamedToMatchFileName); } [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] - public async Task TypeNameMatchesFileName() + public async Task TypeNameMatchesFileName_RenameType() { // testworkspace creates files like test1.cs, test2.cs and so on.. // so type name matches filename here and rename file action should not be offered. var code = @"[||]class test1 { }"; - await TestRenameFileToMatchTypeAsync(code, expectedCodeAction: false); await TestRenameTypeToMatchFileAsync(code, expectedCodeAction: false); } [WpfFact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)] - public async Task MoreThanOneTypeInFile() + public async Task MoreThanOneTypeInFile_RenameType() { var code = @"[||]class Class1 { } class Class2 { }"; - await TestRenameFileToMatchTypeAsync(code, expectedCodeAction: false); await TestRenameTypeToMatchFileAsync(code, expectedCodeAction: false); } } diff --git a/src/EditorFeatures/Test/MoveType/AbstractMoveTypeTest.cs b/src/EditorFeatures/Test/MoveType/AbstractMoveTypeTest.cs index d5f706d629b4ff18314c634b7cf2b9672af5752f..a62a71c5478184eda3637d18e1906daa74840ba8 100644 --- a/src/EditorFeatures/Test/MoveType/AbstractMoveTypeTest.cs +++ b/src/EditorFeatures/Test/MoveType/AbstractMoveTypeTest.cs @@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis.CodeRefactorings.MoveType; using Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions; +using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.UnitTests; using Roslyn.Test.Utilities; using Xunit; @@ -16,15 +17,8 @@ namespace Microsoft.CodeAnalysis.Editor.UnitTests.MoveType { public abstract class AbstractMoveTypeTest : AbstractCodeActionTest { - private const string SpanMarker = "[||]"; - private const string RenameFileCodeActionTitle = "Rename File"; - private const string RenameTypeCodeActionTitle = "Rename Type"; - - private string StripSpanMarkers(string text) - { - var index = text.IndexOf(SpanMarker); - return text.Remove(index, SpanMarker.Length); - } + private string RenameFileCodeActionTitle = FeaturesResources.RenameFileTo_0; + private string RenameTypeCodeActionTitle = FeaturesResources.RenameTypeTo_0; protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace) { @@ -46,8 +40,14 @@ protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspa var documentId = workspace.Documents[0].Id; var documentName = workspace.Documents[0].Name; + string expectedText; + TextSpan span; + MarkupTestFile.GetSpan(expectedCode, out expectedText, out span); + + var codeActionTitle = string.Format(RenameTypeCodeActionTitle, expectedText.Substring(span.Start, span.Length)); + var oldSolutionAndNewSolution = await TestOperationAsync( - workspace, expectedCode, RenameTypeCodeActionTitle, compareTokens); + workspace, expectedText, codeActionTitle, compareTokens); // the original source document does not exist in the new solution. var newSolution = oldSolutionAndNewSolution.Item2; @@ -82,11 +82,16 @@ protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspa Assert.True(expectedDocumentName != null, $"{nameof(expectedDocumentName)} should be present if {nameof(expectedCodeAction)} is true."); var oldDocumentId = workspace.Documents[0].Id; - var expectedText = StripSpanMarkers(originalCode); + + string expectedText; + IList spans; + MarkupTestFile.GetSpans(originalCode, out expectedText, out spans); + + var codeActionTitle = string.Format(RenameFileCodeActionTitle, expectedDocumentName); // a new document with the same text as old document is added. var oldSolutionAndNewSolution = await TestOperationAsync( - workspace, expectedText, RenameFileCodeActionTitle, compareTokens); + workspace, expectedText, codeActionTitle, compareTokens); // the original source document does not exist in the new solution. var newSolution = oldSolutionAndNewSolution.Item2; diff --git a/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj b/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj index 98ead478d4a7eb24f4fb20bbd83766cfe591eb6f..e8db42558e6c1c996a24a81eeff9604bb8c11595 100644 --- a/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj +++ b/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj @@ -138,7 +138,8 @@ - + + diff --git a/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFile.vb b/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFile.vb new file mode 100644 index 0000000000000000000000000000000000000000..661dfbd6b6145ec5e98c1af1b2de9491e6015d82 --- /dev/null +++ b/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFile.vb @@ -0,0 +1,44 @@ +' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.MoveType + Partial Public Class MoveTypeTests + + + Public Async Function SingleClassInFileWithNoContainerNamespace_RenameFile() As Task + Dim code = + +[||]Class Class1 +End Class + + Dim expectedDocumentName = "Class1.vb" + Await TestRenameFileToMatchTypeAsync(code, expectedDocumentName) + End Function + + + Public Async Function TypeNameMatchesFileName_RenameFile() As Task + ' testworkspace creates files Like test1.cs, test2.cs And so on.. + ' so type name matches filename here And rename file action should Not be offered. + Dim code = + +[||]Class test1 +End Class + + + Await TestRenameFileToMatchTypeAsync(code, expectedCodeAction:=False) + End Function + + + Public Async Function MoreThanOneTypeInFile_RenameFile() As Task + Dim code = + +[||]Class Class1 +End Class + +Class Class2 +End Class + + + Await TestRenameFileToMatchTypeAsync(code, expectedCodeAction:=False) + End Function + End Class +End Namespace diff --git a/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.vb b/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameType.vb similarity index 75% rename from src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.vb rename to src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameType.vb index f9115ba484a841b0616fe7e048b720c58e5a4bfd..cd48a6f12e307f5c234416dbe308e04e4800c856 100644 --- a/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameFileOrType.vb +++ b/src/EditorFeatures/VisualBasicTest/CodeActions/MoveType/MoveTypeTests.RenameType.vb @@ -4,19 +4,16 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.M Partial Public Class MoveTypeTests - Public Async Function SingleClassInFileWithNoContainerNamespace() As Task + Public Async Function SingleClassInFileWithNoContainerNamespace_RenameType() As Task Dim code = [||]Class Class1 End Class - Dim expectedDocumentName = "Class1.vb" - - Await TestRenameFileToMatchTypeAsync(code, expectedDocumentName) Dim codeAfterRenamingType = -Class test1 +Class [|test1|] End Class @@ -24,7 +21,7 @@ End Class End Function - Public Async Function TypeNameMatchesFileName() As Task + Public Async Function TypeNameMatchesFileName_RenameType() As Task ' testworkspace creates files Like test1.cs, test2.cs And so on.. ' so type name matches filename here And rename file action should Not be offered. Dim code = @@ -33,12 +30,11 @@ End Class End Class - Await TestRenameFileToMatchTypeAsync(code, expectedCodeAction:=False) Await TestRenameTypeToMatchFileAsync(code, expectedCodeAction:=False) End Function - Public Async Function MoreThanOneTypeInFile() As Task + Public Async Function MoreThanOneTypeInFile_RenameType() As Task Dim code = [||]Class Class1 @@ -48,7 +44,6 @@ Class Class2 End Class - Await TestRenameFileToMatchTypeAsync(code, expectedCodeAction:=False) Await TestRenameTypeToMatchFileAsync(code, expectedCodeAction:=False) End Function End Class