PartialMethodCompletionProviderTests.cs 12.2 KB
Newer Older
1 2
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

C
Cyrus Najmabadi 已提交
3
using System.Threading.Tasks;
4
using Microsoft.CodeAnalysis.CodeStyle;
5
using Microsoft.CodeAnalysis.Completion;
6
using Microsoft.CodeAnalysis.CSharp.CodeStyle;
M
Matt Warren 已提交
7
using Microsoft.CodeAnalysis.CSharp.Completion.Providers;
8
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
9
using Microsoft.CodeAnalysis.Test.Utilities;
10 11 12 13 14
using Roslyn.Test.Utilities;
using Xunit;

namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Completion.CompletionProviders
{
15
    public class PartialMethodCompletionProviderTests : AbstractCSharpCompletionProviderTests
16
    {
17
        public PartialMethodCompletionProviderTests(CSharpTestWorkspaceFixture workspaceFixture) : base(workspaceFixture)
18 19 20
        {
        }

M
Matt Warren 已提交
21
        internal override CompletionProvider CreateCompletionProvider()
22
        {
23
            return new PartialMethodCompletionProvider();
24 25
        }

26
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
27
        public async Task NoPartialMethods1()
28 29 30 31 32
        {
            var text = @"class c
{
    $$
}";
C
Cyrus Najmabadi 已提交
33
            await VerifyNoItemsExistAsync(text);
34 35
        }

36
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
37
        public async Task NoPartialMethods2()
38 39 40
        {
            var text = @"class c
{
41
    private void goo() { };
42 43 44

    partial void $$
}";
C
Cyrus Najmabadi 已提交
45
            await VerifyNoItemsExistAsync(text);
46 47
        }

48
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
49
        public async Task PartialMethodInPartialClass()
50 51 52
        {
            var text = @"partial class c
{
53
    partial void goo();
54 55 56

    partial void $$
}";
57
            await VerifyItemExistsAsync(text, "goo()");
58 59
        }

60
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
61
        public async Task PartialMethodInPartialGenericClass()
62 63 64
        {
            var text = @"partial class c<T>
{
65
    partial void goo(T bar);
66 67 68

    partial void $$
}";
69
            await VerifyItemExistsAsync(text, "goo(T bar)");
70 71
        }

72
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
73
        public async Task PartialMethodInPartialStruct()
74 75 76
        {
            var text = @"partial struct c
{
77
    partial void goo();
78 79 80

    partial void $$
}";
81
            await VerifyItemExistsAsync(text, "goo()");
82 83
        }

84
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
85
        public async Task CompletionOnPartial1()
86 87 88
        {
            var text = @"partial class c
{
89
    partial void goo();
90 91 92

    partial $$
}";
93
            await VerifyItemExistsAsync(text, "goo()");
94 95
        }

96
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
97
        public async Task CompletionOnPartial2()
98 99 100
        {
            var text = @"partial class c
{
101
    partial void goo();
102 103 104

    void partial $$
}";
105
            await VerifyItemExistsAsync(text, "goo()");
106 107
        }

108
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
109
        public async Task StaticUnsafePartial()
110 111 112
        {
            var text = @"partial class c
{
113
    partial static unsafe void goo();
114 115 116

    void static unsafe partial $$
}";
117
            await VerifyItemExistsAsync(text, "goo()");
118 119
        }

120
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
121
        public async Task PartialCompletionWithPrivate()
122 123 124
        {
            var text = @"partial class c
{
125
    partial static unsafe void goo();
126 127 128

    private partial $$
}";
129
            await VerifyItemExistsAsync(text, "goo()");
130 131
        }

132
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
133
        public async Task NotCompletionDespiteValidModifier()
134 135 136
        {
            var text = @"partial class c
{
137
    partial void goo();
138 139 140

    void partial unsafe $$
}";
C
Cyrus Najmabadi 已提交
141
            await VerifyNoItemsExistAsync(text);
142 143
        }

144
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
145
        public async Task NotIfPublic()
146 147 148
        {
            var text = @"partial class c
{
149
    public partial void goo();
150 151 152

    void partial $$
}";
C
Cyrus Najmabadi 已提交
153
            await VerifyNoItemsExistAsync(text);
154 155
        }

156
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
157
        public async Task NotIfInternal()
158 159 160
        {
            var text = @"partial class c
{
161
    internal partial void goo();
162 163 164

    void partial $$
}";
C
Cyrus Najmabadi 已提交
165
            await VerifyNoItemsExistAsync(text);
166 167
        }

168
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
169
        public async Task NotIfProtected()
170 171 172
        {
            var text = @"partial class c
{
173
    protected partial void goo();
174 175 176

    void partial $$
}";
C
Cyrus Najmabadi 已提交
177
            await VerifyNoItemsExistAsync(text);
178 179
        }

180
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
181
        public async Task NotIfProtectedInternal()
182 183 184
        {
            var text = @"partial class c
{
185
    protected internal partial void goo();
186 187 188

    void partial $$
}";
C
Cyrus Najmabadi 已提交
189
            await VerifyNoItemsExistAsync(text);
190 191
        }

192
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
193
        public async Task NotIfExtern()
194 195 196
        {
            var text = @"partial class c
{
197
    partial void goo();
198 199 200

    extern void partial $$
}";
C
Cyrus Najmabadi 已提交
201
            await VerifyNoItemsExistAsync(text);
202 203
        }

204
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
205
        public async Task NotIfVirtual()
206 207 208
        {
            var text = @"partial class c
{
209
    virtual partial void goo();
210 211 212

    void partial $$
}";
C
Cyrus Najmabadi 已提交
213
            await VerifyNoItemsExistAsync(text);
214 215
        }

216
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
217
        public async Task NotIfNonVoidReturnType()
218 219 220
        {
            var text = @"partial class c
{
221
    partial int goo();
222 223 224

    partial $$
}";
C
Cyrus Najmabadi 已提交
225
            await VerifyNoItemsExistAsync(text);
226 227
        }

228
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
229
        public async Task NotInsideInterface()
230 231 232
        {
            var text = @"partial interface i
{
233
    partial void goo();
234 235 236

    partial $$
}";
C
Cyrus Najmabadi 已提交
237
            await VerifyNoItemsExistAsync(text);
238 239
        }

240
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
241
        public async Task CommitInPartialClass()
242 243 244
        {
            var markupBeforeCommit = @"partial class c
{
245
    partial void goo();
246 247 248 249

    partial $$
}";

R
Ravi Chande 已提交
250
            var expectedCodeAfterCommit = @"partial class c
251
{
252
    partial void goo();
253

254
    partial void goo()
255
    {
R
Ravi Chande 已提交
256
        throw new System.NotImplementedException();$$
257 258 259
    }
}";

260
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "goo()", expectedCodeAfterCommit);
261 262
        }

263
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
264
        public async Task CommitGenericPartialMethod()
265 266 267
        {
            var markupBeforeCommit = @"partial class c<T>
{
268
    partial void goo(T bar);
269 270 271 272

    partial $$
}";

R
Ravi Chande 已提交
273
            var expectedCodeAfterCommit = @"partial class c<T>
274
{
275
    partial void goo(T bar);
276

277
    partial void goo(T bar)
278
    {
R
Ravi Chande 已提交
279
        throw new System.NotImplementedException();$$
280 281 282
    }
}";

283
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "goo(T bar)", expectedCodeAfterCommit);
284 285
        }

286
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
287
        public async Task CommitMethodErasesPrivate()
288 289 290
        {
            var markupBeforeCommit = @"partial class c
{
291
    partial void goo();
292 293 294 295

    private partial $$
}";

R
Ravi Chande 已提交
296
            var expectedCodeAfterCommit = @"partial class c
297
{
298
    partial void goo();
299

300
    partial void goo()
301
    {
R
Ravi Chande 已提交
302
        throw new System.NotImplementedException();$$
303 304 305
    }
}";

306
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "goo()", expectedCodeAfterCommit);
307 308
        }

309
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
310
        public async Task CommitInPartialClassPart()
311 312 313
        {
            var markupBeforeCommit = @"partial class c
{
314
    partial void goo();
315 316 317 318 319 320 321
}

partial class c
{
    partial $$
}";

R
Ravi Chande 已提交
322
            var expectedCodeAfterCommit = @"partial class c
323
{
324
    partial void goo();
325 326 327 328
}

partial class c
{
329
    partial void goo()
330
    {
R
Ravi Chande 已提交
331
        throw new System.NotImplementedException();$$
332 333 334
    }
}";

335
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "goo()", expectedCodeAfterCommit);
336 337
        }

338
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
339
        public async Task CommitInPartialStruct()
340 341 342
        {
            var markupBeforeCommit = @"partial struct c
{
343
    partial void goo();
344 345 346 347

    partial $$
}";

R
Ravi Chande 已提交
348
            var expectedCodeAfterCommit = @"partial struct c
349
{
350
    partial void goo();
351

352
    partial void goo()
353
    {
R
Ravi Chande 已提交
354
        throw new System.NotImplementedException();$$
355 356 357
    }
}";

358
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "goo()", expectedCodeAfterCommit);
359 360
        }

361
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
362
        public async Task NotIfNoPartialKeyword()
363 364 365
        {
            var text = @"partial class C
    {
366
        partial void Goo();
367 368 369 370 371 372 373
    }
 
    partial class C
    {
        void $$
    }
";
C
Cyrus Najmabadi 已提交
374
            await VerifyNoItemsExistAsync(text);
375 376
        }

J
Jared Parsons 已提交
377
        [WorkItem(578757, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/578757")]
378
        [Fact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
379
        public async Task DoNotConsiderFollowingDeclarationPartial()
380 381 382 383 384
        {
            var text = @"class Program
{
    partial $$
 
385
    void Goo()
386 387 388 389 390
    {
        
    }
}
";
C
Cyrus Najmabadi 已提交
391
            await VerifyNoItemsExistAsync(text);
392 393
        }

J
Jared Parsons 已提交
394
        [WorkItem(578078, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/578078")]
395
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
396
        public async Task CommitAsync()
397 398 399 400 401
        {
            var markupBeforeCommit = @"using System;

partial class Bar
{
402
    partial void Goo();
403 404 405 406 407 408 409 410

    async partial $$
}";

            var expectedCodeAfterCommit = @"using System;

partial class Bar
{
411
    partial void Goo();
412

413
    async partial void Goo()
414 415 416 417 418
    {
        throw new NotImplementedException();$$
    }
}";

419
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "Goo()", expectedCodeAfterCommit);
420 421
        }

J
Jared Parsons 已提交
422
        [WorkItem(578078, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/578078")]
423
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
424
        public async Task AmbiguityCommittingWithParen()
425 426 427 428 429
        {
            var markupBeforeCommit = @"using System;

partial class Bar
{
430
    partial void Goo();
431

432
    partial Goo$$
433 434 435 436 437 438
}";

            var expectedCodeAfterCommit = @"using System;

partial class Bar
{
439
    partial void Goo();
440

441
    partial void Goo()
442 443 444 445 446
    {
        throw new NotImplementedException();$$
    }
}";

447
            await VerifyCustomCommitProviderAsync(markupBeforeCommit, "Goo()", expectedCodeAfterCommit, commitChar: '(');
448 449
        }

J
Jared Parsons 已提交
450
        [WorkItem(965677, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/965677")]
451
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
C
Cyrus Najmabadi 已提交
452
        public async Task NoDefaultParameterValues()
453 454 455 456 457 458 459 460 461 462 463 464
        {
            var text = @"namespace PartialClass
{
    partial class PClass
    {
        partial void PMethod(int i = 0);

        partial $$
    }
}
";

R
Ravi Chande 已提交
465
            var expected = @"namespace PartialClass
466 467 468 469 470 471 472
{
    partial class PClass
    {
        partial void PMethod(int i = 0);

        partial void PMethod(int i)
        {
R
Ravi Chande 已提交
473
            throw new System.NotImplementedException();$$
474 475 476 477
        }
    }
}
";
C
Cyrus Najmabadi 已提交
478
            await VerifyCustomCommitProviderAsync(text, "PMethod(int i)", expected);
479
        }
480 481 482 483 484 485

        [WorkItem(26388, "https://github.com/dotnet/roslyn/issues/26388")]
        [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)]
        public async Task ExpressionBodyMethod()
        {
            var workspace = WorkspaceFixture.GetWorkspace();
M
Manish Vasani 已提交
486 487 488
            workspace.TryApplyChanges(workspace.CurrentSolution.WithOptions(workspace.Options.WithChangedOption(
                CSharpCodeStyleOptions.PreferExpressionBodiedMethods,
                new CodeStyleOption<ExpressionBodyPreference>(ExpressionBodyPreference.WhenPossible, NotificationOption.Silent))));
489

M
Manish Vasani 已提交
490
            var text = @"using System;
491 492 493 494 495 496 497 498
partial class Bar
{
    partial void Foo();
    partial $$
}
"
;

M
Manish Vasani 已提交
499
            var expected = @"using System;
500 501 502 503 504 505 506 507
partial class Bar
{
    partial void Foo();
    partial void Foo() => throw new NotImplementedException();$$
}
"
;

M
Manish Vasani 已提交
508
            await VerifyCustomCommitProviderAsync(text, "Foo()", expected);
509
        }
510 511
    }
}