CSharpErrorListCommon.cs 6.4 KB
Newer Older
J
Jonathon Marolf 已提交
1 2 3
// 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.
4 5 6 7 8 9 10 11 12 13 14

using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.IntegrationTest.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities.Common;
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
using Xunit;

namespace Roslyn.VisualStudio.IntegrationTests.CSharp
{
    public class CSharpErrorListCommon : AbstractEditorTest
    {
15 16
        public CSharpErrorListCommon(VisualStudioInstanceFactory instanceFactory, string templateName)
            : base(instanceFactory, nameof(CSharpErrorListCommon), templateName)
17 18 19 20 21 22 23
        {
        }

        protected override string LanguageName => LanguageNames.CSharp;

        public virtual void ErrorList()
        {
24
            VisualStudio.Editor.SetText(@"
25 26 27 28 29 30 31 32 33 34 35 36
class C
{
    void M(P p)
    {
        System.Console.WriteLin();
    }

    static void Main(string[] args)
    {
    }
}
");
37
            VisualStudio.ErrorList.ShowErrorList();
38 39 40 41
            var expectedContents = new[] {
                new ErrorListItem(
                    severity: "Error",
                    description: "The type or namespace name 'P' could not be found (are you missing a using directive or an assembly reference?)",
M
Manish Vasani 已提交
42
                    project: "TestProj",
43 44 45 46 47 48
                    fileName: "Class1.cs",
                    line: 4,
                    column: 12),
                new ErrorListItem(
                    severity: "Error",
                    description: "'Console' does not contain a definition for 'WriteLin'",
M
Manish Vasani 已提交
49
                    project: "TestProj",
50 51 52 53
                    fileName: "Class1.cs",
                    line: 6,
                    column: 24)
            };
54
            var actualContents = VisualStudio.ErrorList.GetErrorListContents();
55
            Assert.Equal(expectedContents, actualContents);
56 57
            var target = VisualStudio.ErrorList.NavigateToErrorListItem(0);
            Assert.Equal(expectedContents[0], target);
58
            VisualStudio.Editor.Verify.CaretPosition(25);
M
Manish Vasani 已提交
59
            VisualStudio.SolutionExplorer.BuildSolution();
60 61
            VisualStudio.ErrorList.ShowErrorList();
            actualContents = VisualStudio.ErrorList.GetErrorListContents();
62 63 64 65 66
            Assert.Equal(expectedContents, actualContents);
        }

        public virtual void ErrorLevelWarning()
        {
67
            VisualStudio.Editor.SetText(@"
68 69 70 71 72 73 74 75
class C
{
    static void Main(string[] args)
    {
        int unused = 0;
    }
}
");
76
            VisualStudio.ErrorList.ShowErrorList();
77 78 79 80
            var expectedContents = new[] {
                new ErrorListItem(
                    severity: "Warning",
                    description: "The variable 'unused' is assigned but its value is never used",
M
Manish Vasani 已提交
81
                    project: "TestProj",
82 83 84 85
                    fileName: "Class1.cs",
                    line: 6,
                    column: 13)
            };
86
            var actualContents = VisualStudio.ErrorList.GetErrorListContents();
87 88 89 90 91
            Assert.Equal(expectedContents, actualContents);
        }

        public virtual void ErrorsDuringMethodBodyEditing()
        {
92
            VisualStudio.Editor.SetText(@"
93 94 95 96
class Program2
{
    static void Main(string[] args)
    {
97 98
        int aa = 7;
        int a = aa;
99 100 101
    }
}
");
102
            VisualStudio.ErrorList.ShowErrorList();
103
            var expectedContents = new ErrorListItem[] { };
104
            var actualContents = VisualStudio.ErrorList.GetErrorListContents();
105 106
            Assert.Equal(expectedContents, actualContents);

107 108 109 110
            VisualStudio.Editor.Activate();
            VisualStudio.Editor.PlaceCaret("a = aa", charsOffset: -1);
            VisualStudio.Editor.SendKeys("a");
            VisualStudio.ErrorList.ShowErrorList();
111 112 113
            expectedContents = new[] {
                new ErrorListItem(
                    severity: "Error",
114
                    description: "A local variable or function named 'aa' is already defined in this scope",
M
Manish Vasani 已提交
115
                    project: "TestProj",
116
                    fileName: "Class1.cs",
117 118
                    line: 7,
                    column: 13)
119
            };
120
            actualContents = VisualStudio.ErrorList.GetErrorListContents();
121 122
            Assert.Equal(expectedContents, actualContents);

123 124 125 126
            VisualStudio.Editor.Activate();
            VisualStudio.Editor.PlaceCaret("aa = aa", charsOffset: -1);
            VisualStudio.Editor.SendKeys(VirtualKey.Delete);
            VisualStudio.ErrorList.ShowErrorList();
127
            expectedContents = new ErrorListItem[] { };
128
            actualContents = VisualStudio.ErrorList.GetErrorListContents();
129 130
            Assert.Equal(expectedContents, actualContents);
        }
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

        public virtual void ErrorsAfterClosingFile()
        {
            VisualStudio.Editor.SetText(@"
class Program2
{
    static void Main(string[] args)
    {
        int aa = 7;
        int a = aa;
    }
}
");
            VisualStudio.ErrorList.ShowErrorList();
            var expectedContents = new ErrorListItem[] { };
            var actualContents = VisualStudio.ErrorList.GetErrorListContents();
            Assert.Equal(expectedContents, actualContents);

            VisualStudio.Editor.Activate();
            VisualStudio.Editor.PlaceCaret("a = aa", charsOffset: -1);
            VisualStudio.Editor.SendKeys("a");
            VisualStudio.ErrorList.ShowErrorList();
            expectedContents = new[] {
                new ErrorListItem(
                    severity: "Error",
                    description: "A local variable or function named 'aa' is already defined in this scope",
M
Manish Vasani 已提交
157
                    project: "TestProj",
158 159 160 161 162 163 164
                    fileName: "Class1.cs",
                    line: 7,
                    column: 13)
            };
            actualContents = VisualStudio.ErrorList.GetErrorListContents();
            Assert.Equal(expectedContents, actualContents);

M
Manish Vasani 已提交
165
            // Close the current document and verify diagnostics for closed document are not removed from error list.
166 167 168 169 170
            VisualStudio.SolutionExplorer.SaveAll();
            VisualStudio.Editor.SendExplicitFocus();
            VisualStudio.Editor.SendKeys(new KeyPress(VirtualKey.F4, ShiftState.Ctrl));
            VisualStudio.ErrorList.ShowErrorList();
            actualContents = VisualStudio.ErrorList.GetErrorListContents();
M
Manish Vasani 已提交
171
            Assert.Equal(expectedContents, actualContents);
172
        }
173 174
    }
}