2
// CodeCompletionBugTests.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 NUnit.Framework;
31
using MonoDevelop.CSharpBinding.Gui;
32
using MonoDevelop.Ide.Gui;
33
using MonoDevelop.Projects;
34
using MonoDevelop.Core;
35
using MonoDevelop.Projects.Gui.Completion;
36
using MonoDevelop.Ide.Gui.Content;
37
using MonoDevelop.Projects.Dom.Parser;
39
namespace MonoDevelop.CSharpBinding.Tests
42
public class CodeCompletionBugTests : UnitTests.TestBase
44
static int pcount = 0;
46
public static CompletionDataList CreateProvider (string text)
48
return CreateProvider (text, false);
51
public static CompletionDataList CreateCtrlSpaceProvider (string text)
53
return CreateProvider (text, true);
56
static CompletionDataList CreateProvider (string text, bool isCtrlSpace)
60
int cursorPosition = text.IndexOf ('$');
61
int endPos = text.IndexOf ('$', cursorPosition + 1);
63
parsedText = editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1);
65
parsedText = text.Substring (0, cursorPosition) + new string (' ', endPos - cursorPosition) + text.Substring (endPos + 1);
66
editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring (endPos + 1);
67
cursorPosition = endPos - 1;
70
TestWorkbenchWindow tww = new TestWorkbenchWindow ();
71
TestViewContent sev = new TestViewContent ();
72
DotNetProject project = new DotNetProject ("C#");
73
project.FileName = "/tmp/a" + pcount + ".csproj";
75
string file = "/tmp/test-file-" + (pcount++) + ".cs";
76
project.AddFile (file);
78
ProjectDomService.Load (project);
79
ProjectDom dom = ProjectDomService.GetProjectDom (project);
80
ProjectDomService.Parse (project, file, null, delegate { return parsedText; });
81
ProjectDomService.Parse (project, file, null, delegate { return parsedText; });
83
sev.Project = project;
84
sev.ContentName = file;
85
sev.Text = editorText;
86
sev.CursorPosition = cursorPosition;
87
tww.ViewContent = sev;
88
Document doc = new Document (tww);
89
doc.ParsedDocument = new NRefactoryParser ().Parse (sev.ContentName, parsedText);
90
CSharpTextEditorCompletion textEditorCompletion = new CSharpTextEditorCompletion (doc);
92
int triggerWordLength = 1;
93
CodeCompletionContext ctx = new CodeCompletionContext ();
94
ctx.TriggerOffset = sev.CursorPosition;
96
sev.GetLineColumnFromPosition (sev.CursorPosition, out line, out column);
97
ctx.TriggerLine = line;
98
ctx.TriggerLineOffset = column;
101
return textEditorCompletion.CodeCompletionCommand (ctx) as CompletionDataList;
103
return textEditorCompletion.HandleCodeCompletion (ctx, editorText[cursorPosition - 1] , ref triggerWordLength) as CompletionDataList;
106
public static void CheckObjectMembers (CompletionDataList provider)
108
Assert.IsNotNull (provider.Find ("Equals"), "Method 'System.Object.Equals' not found.");
109
Assert.IsNotNull (provider.Find ("GetHashCode"), "Method 'System.Object.GetHashCode' not found.");
110
Assert.IsNotNull (provider.Find ("GetType"), "Method 'System.Object.GetType' not found.");
111
Assert.IsNotNull (provider.Find ("ToString"), "Method 'System.Object.ToString' not found.");
114
public static void CheckProtectedObjectMembers (CompletionDataList provider)
116
CheckObjectMembers (provider);
117
Assert.IsNotNull (provider.Find ("MemberwiseClone"), "Method 'System.Object.MemberwiseClone' not found.");
120
public static void CheckStaticObjectMembers (CompletionDataList provider)
122
Assert.IsNotNull (provider.Find ("Equals"), "Method 'System.Object.Equals' not found.");
123
Assert.IsNotNull (provider.Find ("ReferenceEquals"), "Method 'System.Object.ReferenceEquals' not found.");
127
public void TestSimpleCodeCompletion ()
129
CompletionDataList provider = CreateProvider (
130
@"class Test { public void TM1 () {} public void TM2 () {} public int TF1; }
139
Assert.IsNotNull (provider);
140
Assert.AreEqual (7, provider.Count);
141
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
142
Assert.IsNotNull (provider.Find ("TM1"));
143
Assert.IsNotNull (provider.Find ("TM2"));
144
Assert.IsNotNull (provider.Find ("TF1"));
147
public void TestSimpleInterfaceCodeCompletion ()
149
CompletionDataList provider = CreateProvider (
150
@"interface ITest { void TM1 (); void TM2 (); int TF1 { get; } }
159
Assert.IsNotNull (provider);
160
Assert.AreEqual (7, provider.Count);
161
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
162
Assert.IsNotNull (provider.Find ("TM1"));
163
Assert.IsNotNull (provider.Find ("TM2"));
164
Assert.IsNotNull (provider.Find ("TF1"));
168
/// Bug 399695 - Code completion not working with an enum in a different namespace
171
public void TestBug399695 ()
173
CompletionDataList provider = CreateProvider (
174
@"namespace Other { enum TheEnum { One, Two } }
177
public Other.TheEnum TheEnum {
181
public void TestMethod () {
186
Assert.IsNotNull (provider);
187
Assert.AreEqual (1, provider.Count);
188
Assert.IsNotNull (provider.Find ("Other.TheEnum"), "Other.TheEnum not found.");
192
/// Bug 318834 - autocompletion kicks in when inputting decimals
195
public void TestBug318834 ()
197
CompletionDataList provider = CreateProvider (
207
Assert.IsNull (provider);
211
/// Bug 321306 - Code completion doesn't recognize child namespaces
214
public void TestBug321306 ()
216
CompletionDataList provider = CreateProvider (
223
public static int hi;
235
Assert.IsNotNull (provider, "provider not found.");
236
Assert.AreEqual (1, provider.Count);
237
Assert.IsNotNull (provider.Find ("c"), "class 'c' not found.");
241
/// Bug 322089 - Code completion for indexer
244
public void TestBug322089 ()
246
CompletionDataList provider = CreateProvider (
255
public void TestMethod ()
257
AClass[] list = new AClass[0];
261
Assert.IsNotNull (provider, "provider not found.");
262
Assert.AreEqual (6, provider.Count);
263
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
264
Assert.IsNotNull (provider.Find ("AField"), "field 'AField' not found.");
265
Assert.IsNotNull (provider.Find ("BField"), "field 'BField' not found.");
269
/// Bug 323283 - Code completion for indexers offered by generic types (generics)
272
public void TestBug323283 ()
274
CompletionDataList provider = CreateProvider (
283
public T this[int i] {
292
public void TestMethod ()
294
MyClass<AClass> list = new MyClass<AClass> ();
298
Assert.IsNotNull (provider, "provider not found.");
299
Assert.AreEqual (6, provider.Count);
300
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
301
Assert.IsNotNull (provider.Find ("AField"), "field 'AField' not found.");
302
Assert.IsNotNull (provider.Find ("BField"), "field 'BField' not found.");
306
/// Bug 323317 - Code completion not working just after a constructor
309
public void TestBug323317 ()
311
CompletionDataList provider = CreateProvider (
320
public void TestMethod ()
325
Assert.IsNotNull (provider, "provider not found.");
326
Assert.AreEqual (6, provider.Count);
327
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
328
Assert.IsNotNull (provider.Find ("AField"), "field 'AField' not found.");
329
Assert.IsNotNull (provider.Find ("BField"), "field 'BField' not found.");
333
/// Bug 325509 - Inaccessible methods displayed in autocomplete
336
public void TestBug325509 ()
338
CompletionDataList provider = CreateProvider (
350
public void TestMethod ()
356
Assert.IsNotNull (provider, "provider not found.");
357
Assert.AreEqual (6, provider.Count);
358
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
359
Assert.IsNotNull (provider.Find ("A"), "field 'A' not found.");
360
Assert.IsNotNull (provider.Find ("B"), "field 'B' not found.");
364
/// Bug 338392 - MD tries to use types when declaring namespace
367
public void TestBug338392 ()
369
CompletionDataList provider = CreateProvider (
379
Assert.IsNotNull (provider, "provider not found.");
380
Assert.AreEqual (0, provider.Count);
384
/// Bug 427284 - Code Completion: class list shows the full name of classes
387
public void TestBug427284 ()
389
CompletionDataList provider = CreateProvider (
390
@"namespace TestNamespace
404
Assert.IsNotNull (provider, "provider not found.");
405
Assert.AreEqual (1, provider.Count);
406
Assert.IsNotNull (provider.Find ("Test"), "class 'Test' not found.");
410
/// Bug 427294 - Code Completion: completion on values returned by methods doesn't work
413
public void TestBug427294 ()
415
CompletionDataList provider = CreateProvider (
418
public TestClass GetTestClass ()
425
public void TestMethod ()
431
Assert.IsNotNull (provider, "provider not found.");
432
Assert.AreEqual (5, provider.Count);
433
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
434
Assert.IsNotNull (provider.Find ("GetTestClass"), "method 'GetTestClass' not found.");
438
/// Bug 405000 - Namespace alias qualifier operator (::) does not trigger code completion
441
public void TestBug405000 ()
443
CompletionDataList provider = CreateProvider (
454
public static void Main ()
460
Assert.IsNotNull (provider, "provider not found.");
461
Assert.AreEqual (1, provider.Count);
462
Assert.IsNotNull (provider.Find ("Test"), "class 'Test' not found.");
466
/// Bug 427649 - Code Completion: protected methods shown in code completion
469
public void TestBug427649 ()
471
CompletionDataList provider = CreateProvider (
474
protected void ProtecedMember ()
481
public static void Main ()
488
Assert.IsNotNull (provider, "provider not found.");
489
Assert.AreEqual (4, provider.Count);
490
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
494
/// Bug 427734 - Code Completion issues with enums
497
public void TestBug427734A ()
499
CompletionDataList provider = CreateProvider (
502
public enum SomeEnum { a,b }
509
Assert.IsNotNull (provider, "provider not found.");
510
Assert.AreEqual (3, provider.Count);
511
CodeCompletionBugTests.CheckStaticObjectMembers (provider); // 2 from System.Object
512
Assert.IsNotNull (provider.Find ("SomeEnum"), "enum 'SomeEnum' not found.");
516
/// Bug 427734 - Code Completion issues with enums
519
public void TestBug427734B ()
521
CompletionDataList provider = CreateProvider (
524
public enum SomeEnum { a,b }
531
Assert.IsNotNull (provider, "provider not found.");
532
Assert.AreEqual (2, provider.Count);
533
Assert.IsNotNull (provider.Find ("a"), "enum member 'a' not found.");
534
Assert.IsNotNull (provider.Find ("b"), "enum member 'b' not found.");
538
/// Bug 431764 - Completion doesn't work in properties
541
public void TestBug431764 ()
543
CompletionDataList provider = CreateCtrlSpaceProvider (
548
set { $this.number = $ }
551
Assert.IsNotNull (provider, "provider not found.");
552
Assert.IsNotNull (provider.Find ("value"), "Should contain 'value'");
556
/// Bug 431797 - Code completion showing invalid options
559
public void TestBug431797A ()
561
CompletionDataList provider = CreateCtrlSpaceProvider (
564
private List<string> strings;
568
Assert.IsNotNull (provider, "provider not found.");
569
Assert.IsNull (provider.Find ("strings"), "should not contain 'strings'");
573
/// Bug 431797 - Code completion showing invalid options
576
public void TestBug431797B ()
578
CompletionDataList provider = CreateProvider (
581
public delegate string [] AutoCompleteHandler (string text, int pos);
582
public void Method ()
584
Test t = new Test ();
588
Assert.IsNotNull (provider, "provider not found.");
589
Assert.IsNull (provider.Find ("AutoCompleteHandler"), "should not contain 'AutoCompleteHandler' delegate");
593
/// Bug 432681 - Incorrect completion in nested classes
596
public void TestBug432681 ()
598
CompletionDataList provider = CreateProvider (
606
public void Method ()
611
Assert.IsNotNull (provider, "provider not found.");
612
Assert.AreEqual ("C.D", provider.DefaultCompletionString, "Completion string is incorrect");
616
public void TestGenericObjectCreation ()
618
CompletionDataList provider = CreateProvider (
624
public void Method ()
629
Assert.IsNotNull (provider, "provider not found.");
630
Assert.IsTrue (provider.Find ("List<int>") != null, "List<int> not found");
634
/// Bug 431803 - Autocomplete not giving any options
637
public void TestBug431803 ()
639
CompletionDataList provider = CreateProvider (
642
public string[] GetStrings ()
647
Assert.IsNotNull (provider, "provider not found.");
648
Assert.AreEqual (1, provider.Count);
649
Assert.IsNotNull (provider.Find ("string[]"), "type string not found.");
653
/// Bug 434770 - No autocomplete on array types
656
public void TestBug434770 ()
658
CompletionDataList provider = CreateProvider (
672
public void AMethod ()
674
byte[] buffer = new byte[1024];
678
Assert.IsNotNull (provider, "provider not found.");
679
Assert.IsNotNull (provider.Find ("Length"), "property 'Length' not found.");
680
Assert.IsNotNull (provider.Find ("MyField"), "field 'MyField' not found.");
684
/// Bug 439601 - Intellisense Broken For Partial Classes
687
public void TestBug439601 ()
689
CompletionDataList provider = CreateProvider (
691
namespace MyNamespace
693
partial class FormMain
707
namespace MyNamespace
709
public partial class FormMain
722
Assert.IsNotNull (provider, "provider not found.");
723
Assert.IsNotNull (provider.Find ("Foo"), "method 'Foo' not found.");
724
Assert.IsNotNull (provider.Find ("Blah"), "method 'Blah' not found.");
725
Assert.IsNotNull (provider.Find ("Bar"), "method 'Bar' not found.");
729
/// Bug 432434 - Code completion doesn't work with subclasses
732
public void TestBug432434 ()
734
CompletionDataList provider = CreateProvider (
740
public void Inner1 ()
744
public void Inner2 ()
751
Inner inner = new Inner ();
756
Assert.IsNotNull (provider, "provider not found.");
757
Assert.IsNotNull (provider.Find ("Inner1"), "Method inner1 not found.");
758
Assert.IsNotNull (provider.Find ("Inner2"), "Method inner2 not found.");
762
/// Bug 432434A - Code completion doesn't work with subclasses
765
public void TestBug432434A ()
767
CompletionDataList provider = CreateProvider (
773
public void Method ()
775
Inner inner = new Inner();
781
Assert.IsNotNull (provider, "provider not found.");
782
Assert.IsNotNull (provider.Find ("Method"), "Method 'Method' not found.");
786
/// Bug 432434B - Code completion doesn't work with subclasses
789
public void TestBug432434B ()
791
CompletionDataList provider = CreateProvider (
797
public class ReallyInner $: $
804
Assert.IsNotNull (provider, "provider not found.");
805
Assert.IsNotNull (provider.Find ("E"), "Class 'E' not found.");
806
Assert.IsNotNull (provider.Find ("Inner"), "Class 'Inner' not found.");
807
Assert.IsNull (provider.Find ("ReallyInner"), "Class 'ReallyInner' found, but shouldn't.");
812
/// Bug 436705 - code completion for constructors does not handle class name collisions properly
815
public void TestBug436705 ()
817
CompletionDataList provider = CreateProvider (
825
public void Method ()
827
$System.Drawing.Point p = new $
830
Assert.IsNotNull (provider, "provider not found.");
831
Assert.AreEqual ("System.Drawing.Point", provider.DefaultCompletionString, "Completion string is incorrect");
835
/// Bug 439963 - Lacking members in code completion
838
public void TestBug439963 ()
840
CompletionDataList provider = CreateProvider (
841
@"public class StaticTest
848
public static StaticTest GetObject ()
855
public void TestMethod ()
857
$StaticTest.GetObject ().$
861
Assert.IsNotNull (provider, "provider not found.");
862
Assert.IsNotNull (provider.Find ("Test1"), "Method 'Test1' not found.");
863
Assert.IsNotNull (provider.Find ("Test2"), "Method 'Test2' not found.");
864
Assert.IsNull (provider.Find ("GetObject"), "Method 'GetObject' found, but shouldn't.");
868
/// Bug 441671 - Finalisers show up in code completion
871
public void TestBug441671 ()
873
CompletionDataList provider = CreateProvider (
876
public TestClass (int i)
879
public void TestMethod ()
896
Assert.IsNotNull (provider, "provider not found.");
897
Assert.AreEqual (5, provider.Count);
898
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
899
Assert.IsNull (provider.Find (".dtor"), "destructor found - but shouldn't.");
900
Assert.IsNotNull (provider.Find ("TestMethod"), "method 'TestMethod' not found.");
904
/// Bug 444110 - Code completion doesn't activate
907
public void TestBug444110 ()
909
CompletionDataList provider = CreateProvider (
911
using System.Collections.Generic;
913
namespace System.Collections.Generic {
915
public class TemplateClass<T>
926
public TemplateClass<int> TemplateClass { get; set; }
931
public static void Main(string[] args)
938
Assert.IsNotNull (provider, "provider not found.");
939
Assert.AreEqual (5, provider.Count);
940
CodeCompletionBugTests.CheckObjectMembers (provider); // 4 from System.Object
941
Assert.IsNotNull (provider.Find ("TestField"), "field 'TestField' not found.");
945
/// Bug 460234 - Invalid options shown when typing 'override'
948
public void TestBug460234 ()
950
CompletionDataList provider = CreateProvider (
955
public virtual int GetHashCode ()
958
protected virtual void Finalize ()
963
public class TestMe : System.Object
967
Assert.IsNotNull (provider, "provider not found.");
968
Assert.AreEqual (1, provider.Count);
969
Assert.IsNull (provider.Find ("Finalize"), "method 'Finalize' found, but shouldn't.");
970
Assert.IsNotNull (provider.Find ("GetHashCode"), "method 'GetHashCode' not found.");
974
/// Bug 457003 - code completion shows variables out of scope
977
public void TestBug457003 ()
979
CompletionDataList provider = CreateProvider (
996
Assert.IsNotNull (provider, "provider not found.");
997
Assert.IsTrue (provider.Count == 0, "variable 'st' found, but shouldn't.");
1001
/// Bug 457237 - code completion doesn't show static methods when setting global variable
1004
public void TestBug457237 ()
1006
CompletionDataList provider = CreateProvider (
1010
public static double Val = 0.5;
1018
Assert.IsNotNull (provider, "provider not found.");
1019
Assert.IsNotNull (provider.Find ("Val"), "field 'Val' not found.");
1023
/// Bug 459682 - Static methods/properties don't show up in subclasses
1026
public void TestBug459682 ()
1028
CompletionDataList provider = CreateProvider (
1029
@"public class BaseC
1031
public static int TESTER;
1033
public class Child : BaseC
1041
Assert.IsNotNull (provider, "provider not found.");
1042
Assert.IsNotNull (provider.Find ("TESTER"), "field 'TESTER' not found.");
1046
/// Bug 466692 - Missing completion for return/break keywords after yield
1049
public void TestBug466692 ()
1051
CompletionDataList provider = CreateProvider (
1060
Assert.IsNotNull (provider, "provider not found.");
1061
Assert.AreEqual (2, provider.Count);
1062
Assert.IsNotNull (provider.Find ("break"), "keyword 'break' not found");
1063
Assert.IsNotNull (provider.Find ("return"), "keyword 'return' not found");
1067
/// Bug 467507 - No completion of base members inside explicit events
1070
public void TestBug467507 ()
1072
CompletionDataList provider = CreateCtrlSpaceProvider (
1078
public void TestMe ()
1082
public event EventHandler TestEvent {
1092
Assert.IsNotNull (provider, "provider not found.");
1094
Assert.IsNotNull (provider.Find ("TestMe"), "method 'TestMe' not found");
1095
Assert.IsNotNull (provider.Find ("value"), "keyword 'value' not found");