Skip to content

Commit 883d2ff

Browse files
Cosifnesharwell
andauthored
Add Integration tests for Inheritance margin (#62047)
* Add first Integration Test for Inheritance Margin * Add second test to test multiple items on same line * Add the third test to navigate to metadata * Add a test to navigate across projects * Polishing * Add comment * Simplify workspace kind verification * Simplify inheritance margin test interaction * Convert input handling to InputSimulatorPlus * Use mouse for true input testing * Use VirtualKeyCode.RETURN * Await the navigation operation of inheritance margin Co-authored-by: Sam Harwell <[email protected]>
1 parent 22faa26 commit 883d2ff

24 files changed

+668
-376
lines changed

eng/Versions.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
<FakeSignVersion>0.9.2</FakeSignVersion>
6060
<HumanizerCoreVersion>2.14.1</HumanizerCoreVersion>
6161
<ICSharpCodeDecompilerVersion>7.1.0.6543</ICSharpCodeDecompilerVersion>
62+
<InputSimulatorPlusVersion>1.0.7</InputSimulatorPlusVersion>
6263
<MicrosoftBuildLocatorVersion>1.4.1</MicrosoftBuildLocatorVersion>
6364
<!--
6465
SourceBuild will requires that all dependencies also be source buildable. We are referencing a

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpArgumentProvider.cs

Lines changed: 62 additions & 66 deletions
Large diffs are not rendered by default.

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpCodeActions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
using Microsoft.CodeAnalysis.Test.Utilities;
1414
using Microsoft.CodeAnalysis.Text;
1515
using Microsoft.VisualStudio.Extensibility.Testing;
16-
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
1716
using Roslyn.Test.Utilities;
1817
using Roslyn.VisualStudio.IntegrationTests;
18+
using WindowsInput.Native;
1919
using Xunit;
2020

2121
namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp
@@ -492,7 +492,7 @@ static void Main(string[] args)
492492
493493
public class P2 { }", HangMitigatingCancellationToken);
494494

495-
await TestServices.Input.SendAsync(VirtualKey.Backspace, VirtualKey.Backspace, "Stream");
495+
await TestServices.Input.SendAsync(VirtualKeyCode.BACK, VirtualKeyCode.BACK, "Stream");
496496
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(
497497
new[]
498498
{
@@ -557,7 +557,7 @@ static void Main(string[] args)
557557
}
558558
}
559559
}", HangMitigatingCancellationToken);
560-
await TestServices.Input.SendAsync(VirtualKey.Backspace, VirtualKey.Backspace,
560+
await TestServices.Input.SendAsync(VirtualKeyCode.BACK, VirtualKeyCode.BACK,
561561
"Foober");
562562
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(
563563
new[]

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpErrorListCommon.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
using System.Threading.Tasks;
77
using Microsoft.CodeAnalysis;
88
using Microsoft.CodeAnalysis.Shared.TestHooks;
9-
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
109
using Roslyn.Test.Utilities;
1110
using Roslyn.VisualStudio.IntegrationTests;
11+
using WindowsInput.Native;
1212
using Xunit;
1313

1414
namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp
@@ -123,7 +123,7 @@ static void Main(string[] args)
123123

124124
await TestServices.Editor.ActivateAsync(HangMitigatingCancellationToken);
125125
await TestServices.Editor.PlaceCaretAsync("aa = aa", charsOffset: -1, HangMitigatingCancellationToken);
126-
await TestServices.Input.SendAsync(VirtualKey.Delete);
126+
await TestServices.Input.SendAsync(VirtualKeyCode.DELETE);
127127
await TestServices.ErrorList.ShowErrorListAsync(HangMitigatingCancellationToken);
128128
expectedContents = new string[] { };
129129
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.Workspace, FeatureAttribute.SolutionCrawler, FeatureAttribute.DiagnosticService, FeatureAttribute.ErrorSquiggles, FeatureAttribute.ErrorList }, HangMitigatingCancellationToken);
@@ -174,7 +174,7 @@ static void Main(string[] args)
174174
// Assert the window title is Class1.cs, which also means the file has no unsaved changes
175175
Assert.Equal("Class1.cs", await TestServices.Shell.GetActiveWindowCaptionAsync(HangMitigatingCancellationToken));
176176

177-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F4, ShiftState.Ctrl));
177+
await TestServices.Input.SendAsync((VirtualKeyCode.F4, VirtualKeyCode.CONTROL));
178178
await TestServices.ErrorList.ShowErrorListAsync(HangMitigatingCancellationToken);
179179
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.Workspace, FeatureAttribute.SolutionCrawler, FeatureAttribute.DiagnosticService, FeatureAttribute.ErrorSquiggles, FeatureAttribute.ErrorList }, HangMitigatingCancellationToken);
180180
actualContents = await TestServices.ErrorList.GetErrorsAsync(HangMitigatingCancellationToken);

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpFindReferences.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
using Microsoft.CodeAnalysis.Shared.TestHooks;
1111
using Microsoft.CodeAnalysis.Storage;
1212
using Microsoft.CodeAnalysis.Test.Utilities;
13-
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
1413
using Microsoft.VisualStudio.LanguageServices;
1514
using Microsoft.VisualStudio.Shell.TableControl;
1615
using Microsoft.VisualStudio.Shell.TableManager;
1716
using Roslyn.VisualStudio.IntegrationTests;
17+
using WindowsInput.Native;
1818
using Xunit;
1919

2020
namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp
@@ -50,7 +50,7 @@ void M()
5050
}
5151
", HangMitigatingCancellationToken);
5252

53-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F12, ShiftState.Shift));
53+
await TestServices.Input.SendAsync((VirtualKeyCode.F12, VirtualKeyCode.SHIFT));
5454

5555
var results = await TestServices.FindReferencesWindow.GetContentsAsync(HangMitigatingCancellationToken);
5656

@@ -96,7 +96,7 @@ static void Main()
9696
}
9797
", HangMitigatingCancellationToken);
9898

99-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F12, ShiftState.Shift));
99+
await TestServices.Input.SendAsync((VirtualKeyCode.F12, VirtualKeyCode.SHIFT));
100100

101101
var results = await TestServices.FindReferencesWindow.GetContentsAsync(HangMitigatingCancellationToken);
102102

@@ -134,7 +134,7 @@ static void Main()
134134
}
135135
", HangMitigatingCancellationToken);
136136

137-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F12, ShiftState.Shift));
137+
await TestServices.Input.SendAsync((VirtualKeyCode.F12, VirtualKeyCode.SHIFT));
138138

139139
var results = await TestServices.FindReferencesWindow.GetContentsAsync(HangMitigatingCancellationToken);
140140

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.Threading.Tasks;
6+
using Microsoft.CodeAnalysis;
7+
using Microsoft.CodeAnalysis.Shared.TestHooks;
8+
using Microsoft.VisualStudio.Extensibility.Testing;
9+
using Microsoft.VisualStudio.IntegrationTest.Utilities;
10+
using Microsoft.VisualStudio.LanguageServices.Implementation;
11+
using Roslyn.Utilities;
12+
using Roslyn.VisualStudio.IntegrationTests;
13+
using WindowsInput.Native;
14+
using Xunit;
15+
16+
namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp
17+
{
18+
public class CSharpInheritanceMarginTests : AbstractEditorTest
19+
{
20+
protected override string LanguageName => LanguageNames.CSharp;
21+
22+
public CSharpInheritanceMarginTests()
23+
: base(nameof(CSharpInheritanceMarginTests))
24+
{
25+
}
26+
27+
[IdeFact]
28+
public async Task TestNavigateInSource()
29+
{
30+
var project = ProjectName;
31+
await TestServices.InheritanceMargin.EnableOptionsAsync(LanguageName, cancellationToken: HangMitigatingCancellationToken);
32+
await TestServices.SolutionExplorer.AddFileAsync(project, "Test.cs", cancellationToken: HangMitigatingCancellationToken);
33+
await TestServices.SolutionExplorer.OpenFileAsync(project, "Test.cs", HangMitigatingCancellationToken);
34+
35+
await TestServices.InheritanceMargin.SetTextAndEnsureGlyphsAppearAsync(
36+
@"
37+
interface IBar
38+
{
39+
}
40+
41+
class Implementation : IBar
42+
{
43+
}", expectedGlyphsNumberInMargin: 2, HangMitigatingCancellationToken);
44+
45+
await TestServices.InheritanceMargin.ClickTheGlyphOnLine(2, HangMitigatingCancellationToken);
46+
47+
// Move focus to menu item of 'IBar', the destination is targeting 'class Implementation'
48+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB);
49+
// Navigate to the destination
50+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN);
51+
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.InheritanceMargin }, HangMitigatingCancellationToken);
52+
await TestServices.EditorVerifier.TextContainsAsync(@"class Implementation$$", assertCaretPosition: true);
53+
}
54+
55+
[IdeFact]
56+
public async Task TestMultipleItemsOnSameLine()
57+
{
58+
var project = ProjectName;
59+
await TestServices.InheritanceMargin.EnableOptionsAsync(LanguageName, cancellationToken: HangMitigatingCancellationToken);
60+
await TestServices.SolutionExplorer.AddFileAsync(project, "Test.cs", cancellationToken: HangMitigatingCancellationToken);
61+
await TestServices.SolutionExplorer.OpenFileAsync(project, "Test.cs", HangMitigatingCancellationToken);
62+
63+
await TestServices.InheritanceMargin.SetTextAndEnsureGlyphsAppearAsync(
64+
@"
65+
using System;
66+
interface IBar
67+
{
68+
event EventHandler e1, e2;
69+
}
70+
71+
class Implementation : IBar
72+
{
73+
public event EventHandler e1, e2;
74+
}", expectedGlyphsNumberInMargin: 4, HangMitigatingCancellationToken);
75+
76+
await TestServices.InheritanceMargin.ClickTheGlyphOnLine(5, HangMitigatingCancellationToken);
77+
78+
// The context menu contains two members, e1 and e2.
79+
// Move focus to menu item of 'event e1'
80+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB);
81+
// Expand the submenu
82+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN);
83+
// Navigate to the implemention
84+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN);
85+
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.InheritanceMargin }, HangMitigatingCancellationToken);
86+
await TestServices.EditorVerifier.TextContainsAsync(@"public event EventHandler e1$$, e2;", assertCaretPosition: true);
87+
}
88+
89+
[IdeFact]
90+
public async Task TestNavigateToMetadata()
91+
{
92+
var project = ProjectName;
93+
await TestServices.InheritanceMargin.EnableOptionsAsync(LanguageName, cancellationToken: HangMitigatingCancellationToken);
94+
await TestServices.SolutionExplorer.AddFileAsync(project, "Test.cs", cancellationToken: HangMitigatingCancellationToken);
95+
await TestServices.SolutionExplorer.OpenFileAsync(project, "Test.cs", HangMitigatingCancellationToken);
96+
97+
await TestServices.InheritanceMargin.SetTextAndEnsureGlyphsAppearAsync(
98+
@"
99+
using System.Collections;
100+
101+
class Implementation : IEnumerable
102+
{
103+
public IEnumerator GetEnumerator()
104+
{
105+
throw new NotImplementedException();
106+
}
107+
}", expectedGlyphsNumberInMargin: 2, HangMitigatingCancellationToken);
108+
109+
await TestServices.InheritanceMargin.ClickTheGlyphOnLine(4, HangMitigatingCancellationToken);
110+
111+
// Move focus to menu item of 'class Implementation'
112+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB);
113+
// Navigate to 'IEnumerable'
114+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN);
115+
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.InheritanceMargin }, HangMitigatingCancellationToken);
116+
await TestServices.EditorVerifier.TextContainsAsync(@"public interface IEnumerable$$", assertCaretPosition: true);
117+
118+
var document = await TestServices.Editor.GetActiveDocumentAsync(HangMitigatingCancellationToken);
119+
RoslynDebug.AssertNotNull(document);
120+
Assert.Equal(WorkspaceKind.MetadataAsSource, document.Project.Solution.Workspace.Kind);
121+
}
122+
123+
[IdeFact]
124+
public async Task TestNavigateToDifferentProjects()
125+
{
126+
await TestServices.InheritanceMargin.EnableOptionsAsync(LanguageNames.CSharp, cancellationToken: HangMitigatingCancellationToken);
127+
await TestServices.InheritanceMargin.EnableOptionsAsync(LanguageNames.VisualBasic, cancellationToken: HangMitigatingCancellationToken);
128+
129+
var csharpProjectName = ProjectName;
130+
var vbProjectName = "TestVBProject";
131+
await TestServices.SolutionExplorer.AddProjectAsync(
132+
vbProjectName, WellKnownProjectTemplates.VisualBasicNetStandardClassLibrary, LanguageNames.VisualBasic, cancellationToken: HangMitigatingCancellationToken);
133+
await TestServices.SolutionExplorer.AddFileAsync(vbProjectName, "Test.vb", @"
134+
Namespace MyNs
135+
Public Interface IBar
136+
End Interface
137+
End Namespace");
138+
139+
await TestServices.SolutionExplorer.AddFileAsync(csharpProjectName, "Test.cs", cancellationToken: HangMitigatingCancellationToken);
140+
await TestServices.SolutionExplorer.AddProjectReferenceAsync(csharpProjectName, vbProjectName, cancellationToken: HangMitigatingCancellationToken);
141+
await TestServices.SolutionExplorer.OpenFileAsync(csharpProjectName, "Test.cs", HangMitigatingCancellationToken);
142+
143+
await TestServices.InheritanceMargin.SetTextAndEnsureGlyphsAppearAsync(
144+
@"
145+
using TestVBProject.MyNs;
146+
147+
class Implementation : IBar
148+
{
149+
}", expectedGlyphsNumberInMargin: 1, HangMitigatingCancellationToken);
150+
151+
await TestServices.InheritanceMargin.ClickTheGlyphOnLine(4, HangMitigatingCancellationToken);
152+
153+
// Move focus to menu item of 'class Implementation'
154+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB);
155+
// Navigate to 'IBar'
156+
await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN);
157+
await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.InheritanceMargin }, HangMitigatingCancellationToken);
158+
await TestServices.EditorVerifier.TextContainsAsync(@"Public Interface IBar$$", assertCaretPosition: true);
159+
160+
var document = await TestServices.Editor.GetActiveDocumentAsync(HangMitigatingCancellationToken);
161+
RoslynDebug.AssertNotNull(document);
162+
Assert.NotEqual(WorkspaceKind.MetadataAsSource, document.Project.Solution.Workspace.Kind);
163+
}
164+
}
165+
}

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpNavigateTo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
using Microsoft.CodeAnalysis.Test.Utilities;
88
using Microsoft.VisualStudio;
99
using Microsoft.VisualStudio.IntegrationTest.Utilities;
10-
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
1110
using Roslyn.VisualStudio.IntegrationTests;
11+
using WindowsInput.Native;
1212
using Xunit;
1313

1414
namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp
@@ -39,7 +39,7 @@ await TestServices.SolutionExplorer.AddFileAsync(project, "test2.cs", open: true
3939
", cancellationToken: HangMitigatingCancellationToken);
4040

4141
await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd12CmdID.NavigateTo, HangMitigatingCancellationToken);
42-
await TestServices.Input.SendToNavigateToAsync("FirstMethod", VirtualKey.Enter);
42+
await TestServices.Input.SendToNavigateToAsync("FirstMethod", VirtualKeyCode.RETURN);
4343
await TestServices.Workarounds.WaitForNavigationAsync(HangMitigatingCancellationToken);
4444
Assert.Equal($"test1.cs", await TestServices.Shell.GetActiveWindowCaptionAsync(HangMitigatingCancellationToken));
4545
Assert.Equal("FirstMethod", await TestServices.Editor.GetSelectedTextAsync(HangMitigatingCancellationToken));
@@ -50,7 +50,7 @@ await TestServices.SolutionExplorer.AddFileAsync(project, "test2.cs", open: true
5050
await TestServices.SolutionExplorer.AddFileAsync(vbProject, "vbfile.vb", open: true, cancellationToken: HangMitigatingCancellationToken);
5151

5252
await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd12CmdID.NavigateTo, HangMitigatingCancellationToken);
53-
await TestServices.Input.SendToNavigateToAsync("FirstClass", VirtualKey.Enter);
53+
await TestServices.Input.SendToNavigateToAsync("FirstClass", VirtualKeyCode.RETURN);
5454
await TestServices.Workarounds.WaitForNavigationAsync(HangMitigatingCancellationToken);
5555
Assert.Equal($"test1.cs", await TestServices.Shell.GetActiveWindowCaptionAsync(HangMitigatingCancellationToken));
5656
Assert.Equal("FirstClass", await TestServices.Editor.GetSelectedTextAsync(HangMitigatingCancellationToken));

src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpSourceGenerators.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@
1313
using Microsoft.CodeAnalysis.TestSourceGenerator;
1414
using Microsoft.VisualStudio;
1515
using Microsoft.VisualStudio.IntegrationTest.Utilities;
16-
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
1716
using Microsoft.VisualStudio.LanguageServices;
18-
using Microsoft.VisualStudio.LanguageServices.Implementation;
19-
using Microsoft.VisualStudio.LanguageServices.Telemetry;
2017
using Microsoft.VisualStudio.Shell.TableControl;
2118
using Roslyn.VisualStudio.IntegrationTests;
2219
using Roslyn.VisualStudio.IntegrationTests.InProcess;
20+
using WindowsInput.Native;
2321
using Xunit;
2422
using Xunit.Abstractions;
2523

@@ -93,7 +91,7 @@ public static void Main()
9391
Assert.Equal($"{HelloWorldGenerator.GeneratedEnglishClassName}.cs {ServicesVSResources.generated_suffix}", await TestServices.Shell.GetActiveWindowCaptionAsync(HangMitigatingCancellationToken));
9492
}
9593

96-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F12, ShiftState.Shift));
94+
await TestServices.Input.SendAsync((VirtualKeyCode.F12, VirtualKeyCode.SHIFT));
9795

9896
var results = (await TestServices.FindReferencesWindow.GetContentsAsync(HangMitigatingCancellationToken)).OrderBy(r => r.GetLine()).ToArray();
9997

@@ -135,7 +133,7 @@ public static void Main()
135133
}", HangMitigatingCancellationToken);
136134

137135
await TestServices.Editor.PlaceCaretAsync(HelloWorldGenerator.GeneratedEnglishClassName, charsOffset: 0, HangMitigatingCancellationToken);
138-
await TestServices.Input.SendAsync(new KeyPress(VirtualKey.F12, ShiftState.Shift));
136+
await TestServices.Input.SendAsync((VirtualKeyCode.F12, VirtualKeyCode.SHIFT));
139137

140138
var results = await TestServices.FindReferencesWindow.GetContentsAsync(HangMitigatingCancellationToken);
141139
var referenceInGeneratedFile = results.Single(r => r.GetText()?.Contains("<summary>") ?? false);
@@ -151,7 +149,7 @@ public async Task InvokeNavigateToForGeneratedFile()
151149
{
152150
await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd12CmdID.NavigateTo, HangMitigatingCancellationToken);
153151

154-
await TestServices.Input.SendToNavigateToAsync(HelloWorldGenerator.GeneratedEnglishClassName, VirtualKey.Enter);
152+
await TestServices.Input.SendToNavigateToAsync(HelloWorldGenerator.GeneratedEnglishClassName, VirtualKeyCode.RETURN);
155153
await TestServices.Workarounds.WaitForNavigationAsync(HangMitigatingCancellationToken);
156154

157155
Assert.Equal($"{HelloWorldGenerator.GeneratedEnglishClassName}.cs [generated]", await TestServices.Shell.GetActiveWindowCaptionAsync(HangMitigatingCancellationToken));

0 commit comments

Comments
 (0)