2
// ParameterCompletionTests.cs
5
// Mike KrĆ¼ger <mkrueger@novell.com>
7
// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
using System.Collections.Generic;
31
using NUnit.Framework;
32
using ICSharpCode.NRefactory.Completion;
33
using ICSharpCode.NRefactory.CSharp.Completion;
34
using ICSharpCode.NRefactory.Editor;
35
using ICSharpCode.NRefactory.TypeSystem.Implementation;
36
using ICSharpCode.NRefactory.TypeSystem;
38
using ICSharpCode.NRefactory.CSharp.TypeSystem;
40
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
43
public class ParameterCompletionTests : TestBase
45
internal class TestFactory : IParameterCompletionDataFactory
49
public TestFactory (IProjectContent ctx)
54
class Provider : IParameterDataProvider
56
public IEnumerable<IMethod> Data { get; set; }
57
#region IParameterDataProvider implementation
58
public int StartOffset { get { return 0; } }
60
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
65
public string GetDescription (int overload, int currentParameter)
70
public string GetParameterDescription (int overload, int paramIndex)
75
public string GetParameterName(int overload, int currentParameter)
80
public int GetParameterCount (int overload)
82
var method = Data.ElementAt (overload);
83
return method.Parameters.Count;
86
public bool AllowParameterList (int overload)
99
class IndexerProvider : IParameterDataProvider
101
public IEnumerable<IProperty> Data { get; set; }
103
#region IParameterDataProvider implementation
104
public int StartOffset { get { return 0; } }
106
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
111
public string GetDescription (int overload, int currentParameter)
116
public string GetParameterDescription (int overload, int paramIndex)
121
public string GetParameterName(int overload, int currentParameter)
126
public int GetParameterCount (int overload)
128
var method = Data.ElementAt (overload);
129
return method.Parameters.Count;
132
public bool AllowParameterList (int overload)
139
return Data.Count ();
146
class ArrayProvider : IParameterDataProvider
148
#region IParameterDataProvider implementation
149
public int StartOffset { get { return 0; } }
151
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
156
public string GetDescription (int overload, int currentParameter)
161
public string GetParameterDescription (int overload, int paramIndex)
166
public int GetParameterCount (int overload)
170
public string GetParameterName(int overload, int currentParameter)
175
public bool AllowParameterList (int overload)
188
class TypeParameterDataProvider : IParameterDataProvider
190
public IEnumerable<IType> Data { get; set; }
191
#region IParameterDataProvider implementation
192
public int StartOffset { get { return 0; } }
194
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
199
public string GetDescription (int overload, int currentParameter)
204
public string GetParameterDescription (int overload, int paramIndex)
209
public string GetParameterName(int overload, int currentParameter)
214
public int GetParameterCount (int overload)
216
var data = Data.ElementAt (overload);
217
return data.TypeParameterCount;
220
public bool AllowParameterList (int overload)
227
return Data.Count ();
233
class MethodTypeParameterDataProvider : IParameterDataProvider
235
public IEnumerable<IMethod> Data { get; set; }
236
#region IParameterDataProvider implementation
237
public int StartOffset { get { return 0; } }
239
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
244
public string GetDescription (int overload, int currentParameter)
249
public string GetParameterDescription (int overload, int paramIndex)
254
public string GetParameterName(int overload, int currentParameter)
259
public int GetParameterCount (int overload)
261
var data = Data.ElementAt (overload);
262
return data.TypeArguments.Count;
265
public bool AllowParameterList (int overload)
272
return Data.Count ();
278
#region IParameterCompletionDataFactory implementation
279
public IParameterDataProvider CreateConstructorProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type)
281
Assert.IsTrue(type.Kind != TypeKind.Unknown);
282
return new Provider () {
283
Data = type.GetConstructors (m => m.Accessibility == Accessibility.Public)
287
public IParameterDataProvider CreateConstructorProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type, AstNode skipNode)
289
Assert.IsTrue(type.Kind != TypeKind.Unknown);
290
return new Provider () {
291
Data = type.GetConstructors (m => m.Accessibility == Accessibility.Public)
295
public IParameterDataProvider CreateMethodDataProvider (int startOffset, IEnumerable<IMethod> methods)
297
return new Provider () {
302
public IParameterDataProvider CreateDelegateDataProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type)
304
Assert.IsTrue(type.Kind != TypeKind.Unknown);
305
return new Provider () {
306
Data = new [] { type.GetDelegateInvokeMethod () }
310
public IParameterDataProvider CreateIndexerParameterDataProvider(int startOffset, IType type, IEnumerable<IProperty> accessibleIndexers, AstNode resolvedNode)
312
Assert.IsTrue(type.Kind != TypeKind.Unknown);
313
if (type.Kind == TypeKind.Array)
314
return new ArrayProvider ();
315
return new IndexerProvider () {
316
Data = accessibleIndexers
320
public IParameterDataProvider CreateTypeParameterDataProvider (int startOffset, IEnumerable<IType> types)
322
return new TypeParameterDataProvider () {
327
public IParameterDataProvider CreateTypeParameterDataProvider (int startOffset, IEnumerable<IMethod> methods)
329
return new MethodTypeParameterDataProvider () {
336
internal static IParameterDataProvider CreateProvider(string text)
340
int cursorPosition = text.IndexOf('$');
341
int endPos = text.IndexOf('$', cursorPosition + 1);
343
parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1);
345
parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + text.Substring(endPos + 1);
346
editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1);
347
cursorPosition = endPos - 1;
349
var doc = new ReadOnlyDocument(editorText);
351
IProjectContent pctx = new CSharpProjectContent();
352
pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });
354
var syntaxTree = new CSharpParser().Parse(parsedText, "program.cs");
357
var unresolvedFile = syntaxTree.ToTypeSystem();
358
pctx = pctx.AddOrUpdateFiles(unresolvedFile);
359
var cmp = pctx.CreateCompilation();
360
var loc = doc.GetLocation(cursorPosition);
363
var rctx = new CSharpTypeResolveContext(cmp.MainAssembly);
364
rctx = rctx.WithUsingScope(unresolvedFile.GetUsingScope(loc).Resolve(cmp));
365
var curDef = unresolvedFile.GetInnermostTypeDefinition(loc);
366
if (curDef != null) {
367
rctx = rctx.WithCurrentTypeDefinition(curDef.Resolve(rctx).GetDefinition());
368
var curMember = unresolvedFile.GetMember(loc);
369
if (curMember != null) {
370
rctx = rctx.WithCurrentMember(curMember.CreateResolved(rctx));
373
var mb = new DefaultCompletionContextProvider(doc, unresolvedFile);
374
var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx);
375
return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1));
379
/// Bug 427448 - Code Completion: completion of constructor parameters not working
382
public void TestBug427448 ()
384
IParameterDataProvider provider = CreateProvider (
391
public Test (string b)
397
Test (double d, float m)
406
$Test t = new Test ($
409
Assert.IsNotNull (provider, "provider was not created.");
410
Assert.AreEqual (2, provider.Count);
414
/// Bug 432437 - No completion when invoking delegates
417
public void TestBug432437 ()
419
IParameterDataProvider provider = CreateProvider (
420
@"public delegate void MyDel (int value);
431
Assert.IsNotNull (provider, "provider was not created.");
432
Assert.AreEqual (1, provider.Count);
436
/// Bug 432658 - Incorrect completion when calling an extension method from inside another extension method
439
public void TestBug432658 ()
441
IParameterDataProvider provider = CreateProvider (
442
@"static class Extensions
444
public static void Ext1 (this int start)
447
public static void Ext2 (this int end)
452
Assert.IsNotNull (provider, "provider was not created.");
453
Assert.AreEqual (1, provider.Count, "There should be one overload");
454
Assert.AreEqual (1, provider.GetParameterCount(0), "Parameter 'start' should exist");
458
/// Bug 432727 - No completion if no constructor
461
public void TestBug432727 ()
463
IParameterDataProvider provider = CreateProvider (
471
Assert.IsNotNull (provider, "provider was not created.");
472
Assert.AreEqual (1, provider.Count);
476
/// Bug 434705 - No autocomplete offered if not assigning result of 'new' to a variable
479
public void TestBug434705 ()
481
IParameterDataProvider provider = CreateProvider (
496
Assert.IsNotNull (provider, "provider was not created.");
497
Assert.AreEqual (1, provider.Count);
501
/// Bug 434705 - No autocomplete offered if not assigning result of 'new' to a variable
504
public void TestBug434705B ()
506
IParameterDataProvider provider = CreateProvider (
518
$Test<int> l = new Test<int> ($
521
Assert.IsNotNull (provider, "provider was not created.");
522
Assert.AreEqual (1, provider.Count);
527
/// Bug 434701 - No autocomplete in attributes
530
public void TestBug434701 ()
532
IParameterDataProvider provider = CreateProvider (
534
class TestAttribute : System.Attribute
546
Assert.IsNotNull (provider, "provider was not created.");
547
Assert.AreEqual (1, provider.Count);
551
/// Bug 447985 - Exception display tip is inaccurate for derived (custom) exceptions
554
public void TestBug447985 ()
556
IParameterDataProvider provider = CreateProvider (
559
public class Exception
561
public Exception () {}
565
class MyException : System.Exception
567
public MyException (int test)
575
$throw new MyException($
579
Assert.IsNotNull (provider, "provider was not created.");
580
Assert.AreEqual (1, provider.Count);
581
Assert.AreEqual (1, provider.GetParameterCount(0), "Parameter 'test' should exist");
586
/// Bug 1760 - [New Resolver] Parameter tooltip not shown for indexers
589
public void Test1760 ()
591
var provider = CreateProvider (
595
public static void Main (string[] args)
600
Assert.IsNotNull (provider, "provider was not created.");
601
Assert.AreEqual (1, provider.Count);
605
public void TestSecondIndexerParameter ()
607
var provider = CreateProvider (
611
public int this[int i, int j] { get { return 0; } }
617
Assert.IsNotNull (provider, "provider was not created.");
618
Assert.AreEqual (1, provider.Count);
622
public void TestSecondMethodParameter ()
624
var provider = CreateProvider (
628
public int TestMe (int i, int j) { return 0; }
634
Assert.IsNotNull (provider, "provider was not created.");
635
Assert.AreEqual (1, provider.Count);
639
/// Bug 599 - Regression: No intellisense over Func delegate
641
public void TestBug599 ()
643
var provider = CreateProvider (
649
void A (Func<int, int> f)
654
Assert.IsNotNull (provider, "provider was not created.");
655
Assert.AreEqual (1, provider.Count);
658
/// Bug 3307 - Chained linq methods do not work correctly
660
public void TestBug3307 ()
662
var provider = CreateProvider (
668
public static void Main (string[] args)
673
Assert.IsNotNull (provider, "provider was not created.");
674
Assert.IsTrue (provider.Count > 0);
678
public void TestBug3307FollowUp ()
680
var provider = CodeCompletionBugTests.CreateProvider (
684
public class MainClass
686
static void TestMe (Action<int> act)
690
public static void Main (string[] args)
695
Assert.IsNotNull (provider, "provider was not created.");
696
Assert.IsFalse (provider.AutoSelect, "auto select enabled !");
700
public void TestBug3307FollowUp2 ()
702
var provider = CodeCompletionBugTests.CreateProvider (
706
public class MainClass
708
public static void Main (string[] args)
713
Assert.IsNotNull (provider, "provider was not created.");
714
Assert.IsFalse (provider.AutoSelect, "auto select enabled !");
718
public void TestConstructor ()
720
IParameterDataProvider provider = CreateProvider (
721
@"class Foo { public Foo (int a) {} }
730
Assert.IsNotNull (provider, "provider was not created.");
731
Assert.AreEqual (1, provider.Count);
736
public void TestConstructorCase2 ()
738
IParameterDataProvider provider = CreateProvider (
744
public TestMe (string a)
757
Assert.IsNotNull (provider, "provider was not created.");
758
Assert.AreEqual (2, provider.Count);
762
public void TestTypeParameter ()
764
IParameterDataProvider provider = CreateProvider (
777
Assert.IsNotNull (provider, "provider was not created.");
778
Assert.AreEqual (16, provider.Count);
782
public void TestSecondTypeParameter ()
784
IParameterDataProvider provider = CreateProvider (
797
Assert.IsNotNull (provider, "provider was not created.");
798
Assert.AreEqual (16, provider.Count);
803
public void TestMethodTypeParameter ()
805
IParameterDataProvider provider = CreateProvider (
812
void TestMethod<T, S>()
822
Assert.IsNotNull (provider, "provider was not created.");
823
Assert.AreEqual (1, provider.Count);
828
public void TestSecondMethodTypeParameter ()
830
IParameterDataProvider provider = CreateProvider (
837
void TestMethod<T, S>()
847
Assert.IsNotNull (provider, "provider was not created.");
848
Assert.AreEqual (1, provider.Count);
852
public void TestArrayParameter ()
854
var provider = CreateProvider (
864
Assert.IsNotNull (provider, "provider was not created.");
865
Assert.AreEqual (1, provider.Count);
869
public void TestSecondArrayParameter ()
871
var provider = CreateProvider (
881
Assert.IsNotNull (provider, "provider was not created.");
882
Assert.AreEqual (1, provider.Count);
887
public void TestTypeParameterInBaseType ()
889
IParameterDataProvider provider = CreateProvider (
896
Assert.IsNotNull (provider, "provider was not created.");
897
Assert.AreEqual (16, provider.Count);
902
public void TestBaseConstructorCall ()
904
IParameterDataProvider provider = CreateProvider (
911
public Base (int i, string s)
921
$public A () : base($
924
Assert.IsNotNull (provider, "provider was not created.");
925
Assert.AreEqual (2, provider.Count);
929
public void TestThisConstructorCall ()
931
IParameterDataProvider provider = CreateProvider (
938
public Base (int i, string s)
948
public A (int a, int b) : base(a) {}
950
$public A () : this($
953
Assert.IsNotNull (provider, "provider was not created.");
954
Assert.AreEqual (1, provider.Count);
958
/// Bug 3645 - [New Resolver]Parameter completion shows all static and non-static overloads
961
public void TestBug3645 ()
963
IParameterDataProvider provider = CreateProvider (
966
public static void FooBar (string str)
970
public void FooBar (int i)
975
public static void Main (string[] args)
980
Assert.IsNotNull (provider, "provider was not created.");
981
Assert.AreEqual (1, provider.Count);
985
/// Bug 3991 - constructor argument completion not working for attributes applied to methods or parameters
988
public void TestBug3991()
990
IParameterDataProvider provider = CreateProvider(
1003
Assert.IsNotNull(provider, "provider was not created.");
1004
Assert.Greater(provider.Count, 0);
1008
/// Bug 4087 - code completion handles object and collection initializers (braces) incorrectly in method calls
1011
public void TestBug4087()
1013
IParameterDataProvider provider = CreateProvider(
1019
$Console.WriteLine (new int[]{ 4, 5,$
1023
Assert.IsTrue (provider == null || provider.Count == 0);
1027
/// Bug 4927 - [New Resolver] Autocomplete shows non-static methods when using class name
1030
public void TestBug4927 ()
1032
IParameterDataProvider provider = CreateProvider (
1037
public static void Method(string someParameter, object anotherParameter)
1042
public void Method()
1050
public static void Main()
1056
Assert.IsNotNull (provider, "provider was not created.");
1057
Assert.AreEqual (1, provider.Count);
1062
public void TestLambdaCase()
1064
IParameterDataProvider provider = CreateProvider(
1068
void F (Action i, int foo)
1070
$F (()=> Something(),$
1075
Assert.IsTrue (provider != null && provider.Count == 1);
1079
public void TestJaggedArrayCreation()
1081
IParameterDataProvider provider = CreateProvider(
1085
void F (Action i, int foo)
1092
Assert.IsTrue (provider == null || provider.Count == 0);
1096
public void TestJaggedArrayCreationCase2()
1098
IParameterDataProvider provider = CreateProvider(
1102
void F (Action i, int foo)
1109
Assert.IsTrue (provider == null || provider.Count == 0);
1113
/// Bug 9301 - Inaccessible indexer overload in completion
1116
public void TestBug9301()
1118
IParameterDataProvider provider = CreateProvider(
1123
public virtual int this [int i, string s] {
1132
public new bool this [int i, string s2] {
1141
public static int Main ()
1149
Assert.AreEqual (1, provider.Count);
1153
public void TestBug9301Case2()
1155
IParameterDataProvider provider = CreateProvider(
1160
public virtual int Test (int i, string s) {
1167
public new bool Test (int i, string s2) {
1174
public static int Main ()
1182
Assert.AreEqual (1, provider.Count);
1186
public void TestExtensionMethod()
1188
var provider = CreateProvider(@"static class Ext { public static void Foo(this object o, string str) {} }
1191
public static void Main (string[] args)
1196
Assert.AreEqual (1, provider.Count);
1197
Assert.AreEqual (1, provider.GetParameterCount (0));
1202
public void TestExtensionMethodStaticInvocation()
1204
var provider = CreateProvider(@"static class Ext { public static void Foo(this object o, string str) {} }
1207
public static void Main (string[] args)
1212
Assert.AreEqual (1, provider.Count);
1213
Assert.AreEqual (2, provider.GetParameterCount (0));
1217
public void TypeArgumentsInIncompleteMethodCall ()
1219
var provider = CreateProvider (
1220
@"using System.Collections.Generic;
1222
class NUnitTestClass {
1223
public ICollection<ITest> NestedTestCollection { get; set; }
1224
public NUnitTestMethod FindTestMethodWithShortName(string name)
1226
this.NestedTestCollection$.OfType<$.LastOrDefault(
1229
Assert.AreEqual (1, provider.Count);
b'\\ No newline at end of file'