2
// ParameterCouldBeDeclaredWithBaseTypeTests.cs
5
// Simon Lindgren <simon.n.lindgren@gmail.com>
7
// Copyright (c) 2012 Simon Lindgren
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
using NUnit.Framework;
28
using ICSharpCode.NRefactory.CSharp.CodeActions;
29
using ICSharpCode.NRefactory.CSharp.Refactoring;
31
namespace ICSharpCode.NRefactory.CSharp.CodeIssues
34
public class ParameterCanBeDemotedTests : InspectionActionTestBase
37
public void BasicTest()
42
public virtual void Foo() {}
46
public virtual void Bar() {}
55
TestRefactoringContext context;
56
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
57
Assert.AreEqual(1, issues.Count);
58
var issue = issues [0];
59
Assert.AreEqual(1, issue.Actions.Count);
61
CheckFix(context, issues [0], @"
64
public virtual void Foo() {}
68
public virtual void Bar() {}
80
public void IgnoresUnusedParameters()
89
TestRefactoringContext context;
90
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
91
Assert.AreEqual(0, issues.Count);
95
public void IgnoresDirectionalParameters()
105
object.Equals(a1, null);
108
TestRefactoringContext context;
109
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
110
Assert.AreEqual(0, issues.Count);
114
public void IgnoresOverrides()
123
public virtual void Foo() {}
124
public virtual void Bar() {}
133
class TestClass : TestBase
135
public override void F(B b)
140
TestRefactoringContext context;
141
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
142
Assert.AreEqual(0, issues.Count);
146
public void IgnoresOverridables()
155
public virtual void Foo() {}
156
public virtual void Bar() {}
160
public virtual void F(B b)
165
TestRefactoringContext context;
166
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
167
Assert.AreEqual(0, issues.Count);
171
public void HandlesNeededProperties()
180
public virtual void Foo(string s) {}
181
public string Property { get; }
190
TestRefactoringContext context;
191
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
192
Assert.AreEqual(0, issues.Count);
196
public void InterfaceTest()
205
public virtual void Foo() {}
206
public virtual void Bar() {}
215
TestRefactoringContext context;
216
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
217
Assert.AreEqual(1, issues.Count);
218
var issue = issues [0];
219
Assert.AreEqual(1, issue.Actions.Count);
221
CheckFix(context, issues [0], @"
228
public virtual void Foo() {}
229
public virtual void Bar() {}
241
public void RespectsExpectedTypeInIfStatement()
246
void F (bool b, bool c)
252
TestRefactoringContext context;
253
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
254
Assert.AreEqual(0, issues.Count);
258
public void MultipleInterfaceTest()
271
public virtual void Foo() {}
272
public virtual void Bar() {}
283
TestRefactoringContext context;
284
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
285
Assert.AreEqual(1, issues.Count);
286
var issue = issues [0];
287
Assert.AreEqual(1, issue.Actions.Count);
289
CheckFix(context, issues [0], @"
300
public virtual void Foo() {}
301
public virtual void Bar() {}
314
string baseInput = @"
341
public void FindsTopInterface()
343
var input = baseInput + @"
351
TestRefactoringContext context;
352
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
353
Assert.AreEqual(1, issues.Count);
354
var issue = issues [0];
355
Assert.AreEqual(4, issue.Actions.Count);
357
CheckFix(context, issues [0], baseInput + @"
368
public void DoesNotChangeOverload()
370
var input = baseInput + @"
386
TestRefactoringContext context;
387
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
388
Assert.AreEqual(0, issues.Count);
392
public void AssignmentToExplicitlyTypedVariable()
394
var input = baseInput + @"
401
object.Equals(b, b2);
404
TestRefactoringContext context;
405
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
406
Assert.AreEqual(0, issues.Count);
410
public void GenericMethod()
412
var input = baseInput + @"
420
void Generic<T> (T arg) where T : IA
424
TestRefactoringContext context;
425
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
426
Assert.AreEqual(0, issues.Count);
430
public void VariableDeclarationWithTypeInference()
432
var input = baseInput + @"
445
TestRefactoringContext context;
446
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
447
Assert.AreEqual(0, issues.Count);
451
public void RespectsOutgoingCallsTypeRestrictions()
453
var input = baseInput + @"
466
TestRefactoringContext context;
467
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
468
Assert.AreEqual(1, issues.Count);
469
var issue = issues [0];
470
Assert.AreEqual(1, issue.Actions.Count);
472
CheckFix(context, issues [0], baseInput + @"
488
public void AccountsForNonInvocationMethodGroupUsageInMethodCall()
491
delegate void FooDelegate (string s);
496
interface IDerived : IBase
502
public void Bar (IDerived derived)
508
void Baz (FooDelegate fd)
512
TestRefactoringContext context;
513
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
514
Assert.AreEqual(0, issues.Count);
518
public void AccountsForNonInvocationMethodGroupUsageInVariableDeclaration()
521
delegate void FooDelegate (string s);
526
interface IDerived : IBase
532
public void Bar (IDerived derived)
535
FooDelegate d = derived.Foo;
538
TestRefactoringContext context;
539
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
540
Assert.AreEqual(0, issues.Count);
544
public void AccountsForNonInvocationMethodGroupUsageInAssignmentExpression()
547
delegate void FooDelegate (string s);
552
interface IDerived : IBase
558
public void Bar (IDerived derived)
565
TestRefactoringContext context;
566
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
567
Assert.AreEqual(0, issues.Count);
572
public void AccountsForIndexers()
577
void Write(string[] s)
583
TestRefactoringContext context;
584
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
585
Assert.AreEqual(1, issues.Count);
586
var issue = issues[0];
587
// Suggested types: IList<T> and IReadOnlyList<T>
588
Assert.AreEqual(2, issue.Actions.Count);
590
CheckFix(context, issues [0], @"
593
void Write(System.Collections.Generic.IList<string> s)
602
public void AccountsForArrays()
607
void Write(string[] s)
613
void SetValue (out string s)
617
TestRefactoringContext context;
618
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
619
Assert.AreEqual(0, issues.Count);
623
public void LimitsParamsParametersToArrays()
628
void Write(params string[] s)
630
System.Console.WriteLine (s);
633
TestRefactoringContext context;
634
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
635
Assert.AreEqual(0, issues.Count);
639
public void DoesNotSuggestProgramEntryPointChanges()
644
public static void Main (string[] args)
646
if (args.Length > 2) {
650
TestRefactoringContext context;
651
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
652
Assert.AreEqual(0, issues.Count);
656
public void IgnoresImplicitInterfaceImplementations()
663
class TestClass : IHasFoo
665
public void Foo(string s)
670
TestRefactoringContext context;
671
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
672
Assert.AreEqual(0, issues.Count);
676
public void IgnoresEnumParameters()
679
enum ApplicableValues
686
public void Foo(ApplicableValues av)
691
TestRefactoringContext context;
692
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
693
Assert.AreEqual(0, issues.Count);
697
public void CallToOverriddenMember()
702
public virtual void Foo()
706
class Test : TestBase
713
public override void Foo()
717
TestRefactoringContext context;
718
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
719
Assert.AreEqual(1, issues.Count);
720
var issue = issues[0];
721
Assert.AreEqual(1, issue.Actions.Count);
723
CheckFix(context, issue, @"
726
public virtual void Foo()
730
class Test : TestBase
737
public override void Foo()
744
public void CallToShadowingMember()
749
public virtual void Foo()
753
class Test : TestBase
760
public new void Foo()
764
TestRefactoringContext context;
765
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
766
Assert.AreEqual(0, issues.Count);
770
public void CallToShadowingMember2()
775
public virtual void Foo()
779
class TestBase : TestBaseBase
781
protected virtual new void Foo()
785
class Test : TestBase
792
public override void Foo()
796
TestRefactoringContext context;
797
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
798
Assert.AreEqual(1, issues.Count);
799
var issue = issues[0];
800
Assert.AreEqual(1, issue.Actions.Count);
802
CheckFix(context, issue, @"
805
public virtual void Foo()
809
class TestBase : TestBaseBase
811
protected virtual new void Foo()
815
class Test : TestBase
822
public override void Foo()
829
public void CallToShadowingMemberWithBaseInterface()
836
class TestBaseBase : IFoo
838
public virtual void Foo()
842
class TestBase : TestBaseBase
844
protected virtual new void Foo()
848
class Test : TestBase
855
protected override void Foo()
859
TestRefactoringContext context;
860
var issues = GetIssues(new ParameterCanBeDemotedIssue(false), input, out context);
861
Assert.AreEqual(1, issues.Count);
862
var issue = issues[0];
863
Assert.AreEqual(1, issue.Actions.Count);
865
CheckFix(context, issue, @"
870
class TestBaseBase : IFoo
872
public virtual void Foo()
876
class TestBase : TestBaseBase
878
protected virtual new void Foo()
882
class Test : TestBase
889
protected override void Foo()
896
/// Bug 9617 - Incorrect "parameter can be demoted to base class" warning for arrays
899
public void TestBug9617()
901
Test<ParameterCanBeDemotedIssue>(@"class Test
903
object Foo (object[] arr)
911
public void DoNotDemoteStringComparisonToReferenceComparison_WithinLambda()
913
Test<ParameterCanBeDemotedIssue>(@"using System; using System.Linq; using System.Collections.Generic;
916
IEnumerable<User> users;
917
User GetUser (String id)
919
return users.Where(u => u.Name == id).SingleOrDefault();
929
public void TestMicrosoftSuppressMessage()
934
public virtual void Foo() {}
938
public virtual void Bar() {}
942
[System.Diagnostics.CodeAnalysis.SuppressMessage(""Microsoft.Design"", ""CA1011:ConsiderPassingBaseTypesAsParameters"")]
948
TestRefactoringContext context;
949
var issues = GetIssues(new ParameterCanBeDemotedIssue(), input, out context);
950
Assert.AreEqual(0, issues.Count);