[bcl] Remove more NET_2_0 checks from class libs
[mono.git] / mcs / class / System / Test / Microsoft.VisualBasic / CodeGeneratorFromNamespaceTest.cs
1 //
2 // Microsoft.VisualBasic.* Test Cases
3 //
4 // Authors:
5 // Gert Driesen (drieseng@users.sourceforge.net)
6 //
7 // (c) 2006 Novell
8 //
9 using System;
10 using System.CodeDom;
11 using System.CodeDom.Compiler;
12 using System.Globalization;
13 using System.IO;
14 using System.Text;
15
16 using NUnit.Framework;
17
18 namespace MonoTests.Microsoft.VisualBasic
19 {
20         /// <summary>
21         /// Test ICodeGenerator's GenerateCodeFromNamespace, along with a 
22         /// minimal set CodeDom components.
23         /// </summary>
24         [TestFixture]
25         public class CodeGeneratorFromNamespaceTest : CodeGeneratorTestBase
26         {
27                 CodeNamespace codeNamespace = null;
28
29                 [SetUp]
30                 public void Init ()
31                 {
32                         InitBase ();
33                         codeNamespace = new CodeNamespace ();
34                 }
35                 
36                 protected override string Generate (CodeGeneratorOptions options)
37                 {
38                         StringWriter writer = new StringWriter ();
39                         writer.NewLine = NewLine;
40
41                         generator.GenerateCodeFromNamespace (codeNamespace, writer, options);
42                         writer.Close ();
43                         return writer.ToString ();
44                 }
45                 
46                 [Test]
47                 [ExpectedException (typeof (NullReferenceException))]
48                 public void NullNamespaceTest ()
49                 {
50                         codeNamespace = null;
51                         Generate ();
52                 }
53
54                 [Test]
55                 public void NullNamespaceNameTest ()
56                 {
57                         codeNamespace.Name = null;
58                         Assert.AreEqual ("\n", Generate ());
59                 }
60
61                 
62                 [Test]
63                 public void DefaultNamespaceTest ()
64                 {
65                         Assert.AreEqual ("\n", Generate ());
66                 }
67
68                 [Test]
69                 public void SimpleNamespaceTest ()
70                 {
71                         codeNamespace.Name = "A";
72                         Assert.AreEqual ("\nNamespace A\nEnd Namespace\n", Generate ());
73                 }
74
75                 [Test]
76                 public void InvalidNamespaceTest ()
77                 {
78                         codeNamespace.Name = "A,B";
79                         Assert.AreEqual ("\nNamespace A,B\nEnd Namespace\n", Generate ());
80                 }
81
82                 [Test]
83                 public void CommentOnlyNamespaceTest ()
84                 {
85                         CodeCommentStatement comment = new CodeCommentStatement ("a");
86                         codeNamespace.Comments.Add (comment);
87                         Assert.AreEqual ("\n'a\n", Generate ());
88                 }
89
90                 [Test]
91                 public void ImportsTest ()
92                 {
93                         codeNamespace.Imports.Add (new CodeNamespaceImport ("System"));
94                         codeNamespace.Imports.Add (new CodeNamespaceImport ("System.Collections"));
95
96                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
97                                 "Imports System{0}" +
98                                 "Imports System.Collections{0}" +
99                                 "{0}", NewLine), Generate (), "#1");
100
101                         codeNamespace.Name = "A";
102
103                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
104                                 "Imports System{0}" +
105                                 "Imports System.Collections{0}" +
106                                 "{0}" +
107                                 "Namespace A{0}" +
108                                 "End Namespace{0}", NewLine), Generate (), "#2");
109
110                         codeNamespace.Name = null;
111                         codeNamespace.Comments.Add (new CodeCommentStatement ("a"));
112
113                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
114                                 "Imports System{0}" +
115                                 "Imports System.Collections{0}" +
116                                 "{0}" +
117                                 "'a{0}", NewLine), Generate (), "#3");
118
119                         codeNamespace.Name = "A";
120
121                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
122                                 "Imports System{0}" +
123                                 "Imports System.Collections{0}" +
124                                 "{0}" +
125                                 "'a{0}" +
126                                 "Namespace A{0}" +
127                                 "End Namespace{0}", NewLine), Generate (), "#4");
128                 }
129
130                 [Test]
131                 public void TypeTest ()
132                 {
133                         codeNamespace.Types.Add (new CodeTypeDeclaration ("Person"));
134                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
135                                 "{0}" +
136                                 "{0}" +
137                                 "Public Class Person{0}" +
138                                 "End Class{0}", NewLine), Generate (), "#A1");
139
140                         CodeGeneratorOptions options = new CodeGeneratorOptions ();
141                         options.BlankLinesBetweenMembers = false;
142                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
143                                 "{0}" +
144                                 "Public Class Person{0}" +
145                                 "End Class{0}", NewLine), Generate (options), "#A2");
146
147                         codeNamespace.Name = "A";
148                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
149                                 "{0}" +
150                                 "Namespace A{0}" +
151                                 "    {0}" +
152                                 "    Public Class Person{0}" +
153                                 "    End Class{0}" +
154                                 "End Namespace{0}", NewLine), Generate (), "#B1");
155
156                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
157                                 "{0}" +
158                                 "Namespace A{0}" +
159                                 "    Public Class Person{0}" +
160                                 "    End Class{0}" +
161                                 "End Namespace{0}", NewLine), Generate (options), "#B2");
162                 }
163
164                 [Test]
165                 public void Type_TypeParameters ()
166                 {
167                         codeNamespace.Name = "SomeNS";
168
169                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
170                         codeNamespace.Types.Add (type);
171                         type.TypeParameters.Add (new CodeTypeParameter ("T"));
172
173                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
174                                 "{0}" +
175                                 "Namespace SomeNS{0}" +
176                                 "    {0}" +
177                                 "    Public Class SomeClass(Of T){0}" +
178                                 "    End Class{0}" +
179                                 "End Namespace{0}", NewLine), Generate (), "#1");
180
181                         type.TypeParameters.Add (new CodeTypeParameter ("As"));
182                         type.TypeParameters.Add (new CodeTypeParameter ("New"));
183
184                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
185                                 "{0}" +
186                                 "Namespace SomeNS{0}" +
187                                 "    {0}" +
188                                 "    Public Class SomeClass(Of T, As, New){0}" +
189                                 "    End Class{0}" +
190                                 "End Namespace{0}", NewLine), Generate (), "#2");
191
192                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
193                         typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
194                         type.TypeParameters.Add (typeParamR);
195
196                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
197                                 "{0}" +
198                                 "Namespace SomeNS{0}" +
199                                 "    {0}" +
200                                 "    Public Class SomeClass(Of T, As, New, R As System.IComparable){0}" +
201                                 "    End Class{0}" +
202                                 "End Namespace{0}", NewLine), Generate (), "#3");
203
204                         type.TypeParameters.Add (new CodeTypeParameter ("S"));
205
206                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
207                                 "{0}" +
208                                 "Namespace SomeNS{0}" +
209                                 "    {0}" +
210                                 "    Public Class SomeClass(Of T, As, New, R As System.IComparable, S){0}" +
211                                 "    End Class{0}" +
212                                 "End Namespace{0}", NewLine), Generate (), "#4");
213                 }
214
215                 [Test]
216                 public void Type_TypeParameters_Constraints ()
217                 {
218                         codeNamespace.Name = "SomeNS";
219
220                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
221                         codeNamespace.Types.Add (type);
222
223                         CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
224                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
225                         type.TypeParameters.Add (typeParamT);
226
227                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
228                                 "{0}" +
229                                 "Namespace SomeNS{0}" +
230                                 "    {0}" +
231                                 "    Public Class SomeClass(Of T As System.IComparable){0}" +
232                                 "    End Class{0}" +
233                                 "End Namespace{0}", NewLine), Generate (), "#1");
234
235                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
236
237                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
238                                 "{0}" +
239                                 "Namespace SomeNS{0}" +
240                                 "    {0}" +
241                                 "    Public Class SomeClass(Of T As  {{System.IComparable, System.ICloneable}}){0}" +
242                                 "    End Class{0}" +
243                                 "End Namespace{0}", NewLine), Generate (), "#2");
244
245                         typeParamT.HasConstructorConstraint = true;
246
247                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
248                                 "{0}" +
249                                 "Namespace SomeNS{0}" +
250                                 "    {0}" +
251                                 "    Public Class SomeClass(Of T As  {{System.IComparable, System.ICloneable, New}}){0}" +
252                                 "    End Class{0}" +
253                                 "End Namespace{0}", NewLine), Generate (), "#3");
254
255                         CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
256                         typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
257                         type.TypeParameters.Add (typeParamS);
258
259                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
260                                 "{0}" +
261                                 "Namespace SomeNS{0}" +
262                                 "    {0}" +
263                                 "    Public Class SomeClass(Of T As  {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable){0}" +
264                                 "    End Class{0}" +
265                                 "End Namespace{0}", NewLine), Generate (), "#4");
266
267                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
268                         typeParamR.HasConstructorConstraint = true;
269                         type.TypeParameters.Add (typeParamR);
270
271                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
272                                 "{0}" +
273                                 "Namespace SomeNS{0}" +
274                                 "    {0}" +
275                                 "    Public Class SomeClass(Of T As  {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New){0}" +
276                                 "    End Class{0}" +
277                                 "End Namespace{0}", NewLine), Generate (), "#5");
278                 }
279
280                 [Test]
281                 public void Type_TypeParameters_ConstructorConstraint ()
282                 {
283                         codeNamespace.Name = "SomeNS";
284
285                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
286                         codeNamespace.Types.Add (type);
287
288                         CodeTypeParameter typeParam = new CodeTypeParameter ("T");
289                         typeParam.HasConstructorConstraint = true;
290                         type.TypeParameters.Add (typeParam);
291
292                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
293                                 "{0}" +
294                                 "Namespace SomeNS{0}" +
295                                 "    {0}" +
296                                 "    Public Class SomeClass(Of T As New){0}" +
297                                 "    End Class{0}" +
298                                 "End Namespace{0}", NewLine), Generate ());
299                 }
300
301                 [Test]
302                 public void Method_TypeParameters ()
303                 {
304                         codeNamespace.Name = "SomeNS";
305
306                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
307                         codeNamespace.Types.Add (type);
308
309                         CodeMemberMethod method = new CodeMemberMethod ();
310                         method.Name = "SomeMethod";
311                         type.Members.Add (method);
312
313                         method.TypeParameters.Add (new CodeTypeParameter ("T"));
314
315                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
316                                 "{0}" +
317                                 "Namespace SomeNS{0}" +
318                                 "    {0}" +
319                                 "    Public Class SomeClass{0}" +
320                                 "        {0}" +
321                                 "        Private Sub SomeMethod(Of T)(){0}" +
322                                 "        End Sub{0}" +
323                                 "    End Class{0}" +
324                                 "End Namespace{0}", NewLine), Generate (), "#1");
325
326                         method.TypeParameters.Add (new CodeTypeParameter ("As"));
327                         method.TypeParameters.Add (new CodeTypeParameter ("New"));
328
329                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
330                                 "{0}" +
331                                 "Namespace SomeNS{0}" +
332                                 "    {0}" +
333                                 "    Public Class SomeClass{0}" +
334                                 "        {0}" +
335                                 "        Private Sub SomeMethod(Of T, As, New)(){0}" +
336                                 "        End Sub{0}" +
337                                 "    End Class{0}" +
338                                 "End Namespace{0}", NewLine), Generate (), "#2");
339
340                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
341                         typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
342                         method.TypeParameters.Add (typeParamR);
343
344                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
345                                 "{0}" +
346                                 "Namespace SomeNS{0}" +
347                                 "    {0}" +
348                                 "    Public Class SomeClass{0}" +
349                                 "        {0}" +
350                                 "        Private Sub SomeMethod(Of T, As, New, R As System.IComparable)(){0}" +
351                                 "        End Sub{0}" +
352                                 "    End Class{0}" +
353                                 "End Namespace{0}", NewLine), Generate (), "#3");
354
355                         method.TypeParameters.Add (new CodeTypeParameter ("S"));
356
357                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
358                                 "{0}" +
359                                 "Namespace SomeNS{0}" +
360                                 "    {0}" +
361                                 "    Public Class SomeClass{0}" +
362                                 "        {0}" +
363                                 "        Private Sub SomeMethod(Of T, As, New, R As System.IComparable, S)(){0}" +
364                                 "        End Sub{0}" +
365                                 "    End Class{0}" +
366                                 "End Namespace{0}", NewLine), Generate (), "#4");
367                 }
368
369                 [Test]
370                 public void Method_TypeParameters_Constraints ()
371                 {
372                         codeNamespace.Name = "SomeNS";
373
374                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
375                         codeNamespace.Types.Add (type);
376
377                         CodeMemberMethod method = new CodeMemberMethod ();
378                         method.Name = "SomeMethod";
379                         type.Members.Add (method);
380
381                         CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
382                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
383                         method.TypeParameters.Add (typeParamT);
384
385                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
386                                 "{0}" +
387                                 "Namespace SomeNS{0}" +
388                                 "    {0}" +
389                                 "    Public Class SomeClass{0}" +
390                                 "        {0}" +
391                                 "        Private Sub SomeMethod(Of T As System.IComparable)(){0}" +
392                                 "        End Sub{0}" +
393                                 "    End Class{0}" +
394                                 "End Namespace{0}", NewLine), Generate (), "#1");
395
396                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
397
398                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
399                                 "{0}" +
400                                 "Namespace SomeNS{0}" +
401                                 "    {0}" +
402                                 "    Public Class SomeClass{0}" +
403                                 "        {0}" +
404                                 "        Private Sub SomeMethod(Of T As  {{System.IComparable, System.ICloneable}})(){0}" +
405                                 "        End Sub{0}" +
406                                 "    End Class{0}" +
407                                 "End Namespace{0}", NewLine), Generate (), "#2");
408
409                         typeParamT.HasConstructorConstraint = true;
410
411                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
412                                 "{0}" +
413                                 "Namespace SomeNS{0}" +
414                                 "    {0}" +
415                                 "    Public Class SomeClass{0}" +
416                                 "        {0}" +
417                                 "        Private Sub SomeMethod(Of T As  {{System.IComparable, System.ICloneable, New}})(){0}" +
418                                 "        End Sub{0}" +
419                                 "    End Class{0}" +
420                                 "End Namespace{0}", NewLine), Generate (), "#3");
421
422                         CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
423                         typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
424                         method.TypeParameters.Add (typeParamS);
425
426                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
427                                 "{0}" +
428                                 "Namespace SomeNS{0}" +
429                                 "    {0}" +
430                                 "    Public Class SomeClass{0}" +
431                                 "        {0}" +
432                                 "        Private Sub SomeMethod(Of T As  {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable)(){0}" +
433                                 "        End Sub{0}" +
434                                 "    End Class{0}" +
435                                 "End Namespace{0}", NewLine), Generate (), "#4");
436
437                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
438                         typeParamR.HasConstructorConstraint = true;
439                         method.TypeParameters.Add (typeParamR);
440
441                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
442                                 "{0}" +
443                                 "Namespace SomeNS{0}" +
444                                 "    {0}" +
445                                 "    Public Class SomeClass{0}" +
446                                 "        {0}" +
447                                 "        Private Sub SomeMethod(Of T As  {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New)(){0}" +
448                                 "        End Sub{0}" +
449                                 "    End Class{0}" +
450                                 "End Namespace{0}", NewLine), Generate (), "#5");
451                 }
452
453                 [Test]
454                 public void Method_TypeParameters_ConstructorConstraint ()
455                 {
456                         codeNamespace.Name = "SomeNS";
457
458                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
459                         codeNamespace.Types.Add (type);
460
461                         CodeMemberMethod method = new CodeMemberMethod ();
462                         method.Name = "SomeMethod";
463                         type.Members.Add (method);
464
465                         CodeTypeParameter typeParam = new CodeTypeParameter ("T");
466                         typeParam.HasConstructorConstraint = true;
467                         method.TypeParameters.Add (typeParam);
468
469                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
470                                 "{0}" +
471                                 "Namespace SomeNS{0}" +
472                                 "    {0}" +
473                                 "    Public Class SomeClass{0}" +
474                                 "        {0}" +
475                                 "        Private Sub SomeMethod(Of T As New)(){0}" +
476                                 "        End Sub{0}" +
477                                 "    End Class{0}" +
478                                 "End Namespace{0}", NewLine), Generate ());
479                 }
480         }
481 }