-
Notifications
You must be signed in to change notification settings - Fork 4k
/
CSharpGoToDefinition.cs
107 lines (96 loc) · 4.36 KB
/
CSharpGoToDefinition.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// 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;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities.Common;
using Roslyn.Test.Utilities;
using Xunit;
using ProjectUtils = Microsoft.VisualStudio.IntegrationTest.Utilities.Common.ProjectUtils;
namespace Roslyn.VisualStudio.IntegrationTests.CSharp
{
[Collection(nameof(SharedIntegrationHostFixture))]
public class CSharpGoToDefinition : AbstractEditorTest
{
protected override string LanguageName => LanguageNames.CSharp;
public CSharpGoToDefinition(VisualStudioInstanceFactory instanceFactory)
: base(instanceFactory, nameof(CSharpGoToDefinition))
{
}
[WpfFact, Trait(Traits.Feature, Traits.Features.GoToDefinition)]
public void GoToClassDeclaration()
{
var project = new ProjectUtils.Project(ProjectName);
VisualStudio.SolutionExplorer.AddFile(project, "FileDef.cs");
VisualStudio.SolutionExplorer.OpenFile(project, "FileDef.cs");
VisualStudio.Editor.SetText(
@"class SomeClass
{
}");
VisualStudio.SolutionExplorer.AddFile(project, "FileConsumer.cs");
VisualStudio.SolutionExplorer.OpenFile(project, "FileConsumer.cs");
VisualStudio.Editor.SetText(
@"class SomeOtherClass
{
SomeClass sc;
}");
VisualStudio.Editor.PlaceCaret("SomeClass");
VisualStudio.Editor.GoToDefinition();
VisualStudio.Editor.Verify.TextContains(@"class SomeClass$$", assertCaretPosition: true);
Assert.False(VisualStudio.Shell.IsActiveTabProvisional());
}
[WpfFact, Trait(Traits.Feature, Traits.Features.GoToDefinition)]
public void GoToDefinitionOpensProvisionalTabIfDocumentNotAlreadyOpen()
{
var project = new ProjectUtils.Project(ProjectName);
VisualStudio.SolutionExplorer.AddFile(project, "FileDef.cs");
VisualStudio.SolutionExplorer.OpenFile(project, "FileDef.cs");
VisualStudio.Editor.SetText(
@"class SomeClass
{
}
");
VisualStudio.SolutionExplorer.CloseCodeFile(project, "FileDef.cs", saveFile: true);
VisualStudio.SolutionExplorer.AddFile(project, "FileConsumer.cs");
VisualStudio.SolutionExplorer.OpenFile(project, "FileConsumer.cs");
VisualStudio.Editor.SetText(
@"class SomeOtherClass
{
SomeClass sc;
}");
VisualStudio.Editor.PlaceCaret("SomeClass");
VisualStudio.Editor.GoToDefinition();
VisualStudio.Editor.Verify.TextContains(@"class SomeClass$$", assertCaretPosition: true);
Assert.True(VisualStudio.Shell.IsActiveTabProvisional());
}
[WpfFact, Trait(Traits.Feature, Traits.Features.GoToDefinition)]
public void GoToDefinitionWithMultipleResults()
{
SetUpEditor(
@"partial class /*Marker*/ $$PartialClass { }
partial class PartialClass { int i = 0; }");
VisualStudio.Editor.GoToDefinition();
const string programReferencesCaption = "'PartialClass' declarations";
var results = VisualStudio.FindReferencesWindow.GetContents(programReferencesCaption);
var activeWindowCaption = VisualStudio.Shell.GetActiveWindowCaption();
Assert.Equal(expected: programReferencesCaption, actual: activeWindowCaption);
Assert.Collection(
results,
new Action<Reference>[]
{
reference =>
{
Assert.Equal(expected: "partial class /*Marker*/ PartialClass { }", actual: reference.Code);
Assert.Equal(expected: 0, actual: reference.Line);
Assert.Equal(expected: 25, actual: reference.Column);
},
reference =>
{
Assert.Equal(expected: "partial class PartialClass { int i = 0; }", actual: reference.Code);
Assert.Equal(expected: 2, actual: reference.Line);
Assert.Equal(expected: 14, actual: reference.Column);
}
});
}
}
}