2 // Microsoft.VisualBasic.* Test Cases
5 // Gert Driesen (drieseng@users.sourceforge.net)
11 using System.CodeDom.Compiler;
12 using System.Globalization;
16 using NUnit.Framework;
18 namespace MonoTests.Microsoft.VisualBasic
21 /// Test ICodeGenerator's GenerateCodeFromNamespace, along with a
22 /// minimal set CodeDom components.
25 public class CodeGeneratorFromNamespaceTest : CodeGeneratorTestBase
27 CodeNamespace codeNamespace = null;
33 codeNamespace = new CodeNamespace ();
36 protected override string Generate (CodeGeneratorOptions options)
38 StringWriter writer = new StringWriter ();
39 writer.NewLine = NewLine;
41 generator.GenerateCodeFromNamespace (codeNamespace, writer, options);
43 return writer.ToString ();
47 [ExpectedException (typeof (NullReferenceException))]
48 public void NullNamespaceTest ()
55 public void NullNamespaceNameTest ()
57 codeNamespace.Name = null;
58 Assert.AreEqual ("\n", Generate ());
63 public void DefaultNamespaceTest ()
65 Assert.AreEqual ("\n", Generate ());
69 public void SimpleNamespaceTest ()
71 codeNamespace.Name = "A";
72 Assert.AreEqual ("\nNamespace A\nEnd Namespace\n", Generate ());
76 public void InvalidNamespaceTest ()
78 codeNamespace.Name = "A,B";
79 Assert.AreEqual ("\nNamespace A,B\nEnd Namespace\n", Generate ());
83 public void CommentOnlyNamespaceTest ()
85 CodeCommentStatement comment = new CodeCommentStatement ("a");
86 codeNamespace.Comments.Add (comment);
87 Assert.AreEqual ("\n'a\n", Generate ());
91 public void ImportsTest ()
93 codeNamespace.Imports.Add (new CodeNamespaceImport ("System"));
94 codeNamespace.Imports.Add (new CodeNamespaceImport ("System.Collections"));
96 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
98 "Imports System.Collections{0}" +
99 "{0}", NewLine), Generate (), "#1");
101 codeNamespace.Name = "A";
103 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
104 "Imports System{0}" +
105 "Imports System.Collections{0}" +
108 "End Namespace{0}", NewLine), Generate (), "#2");
110 codeNamespace.Name = null;
111 codeNamespace.Comments.Add (new CodeCommentStatement ("a"));
113 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
114 "Imports System{0}" +
115 "Imports System.Collections{0}" +
117 "'a{0}", NewLine), Generate (), "#3");
119 codeNamespace.Name = "A";
121 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
122 "Imports System{0}" +
123 "Imports System.Collections{0}" +
127 "End Namespace{0}", NewLine), Generate (), "#4");
131 public void TypeTest ()
133 codeNamespace.Types.Add (new CodeTypeDeclaration ("Person"));
134 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
137 "Public Class Person{0}" +
138 "End Class{0}", NewLine), Generate (), "#A1");
140 CodeGeneratorOptions options = new CodeGeneratorOptions ();
141 options.BlankLinesBetweenMembers = false;
142 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
144 "Public Class Person{0}" +
145 "End Class{0}", NewLine), Generate (options), "#A2");
147 codeNamespace.Name = "A";
148 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
152 " Public Class Person{0}" +
154 "End Namespace{0}", NewLine), Generate (), "#B1");
156 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
159 " Public Class Person{0}" +
161 "End Namespace{0}", NewLine), Generate (options), "#B2");
165 public void Type_TypeParameters ()
167 codeNamespace.Name = "SomeNS";
169 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
170 codeNamespace.Types.Add (type);
171 type.TypeParameters.Add (new CodeTypeParameter ("T"));
173 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
175 "Namespace SomeNS{0}" +
177 " Public Class SomeClass(Of T){0}" +
179 "End Namespace{0}", NewLine), Generate (), "#1");
181 type.TypeParameters.Add (new CodeTypeParameter ("As"));
182 type.TypeParameters.Add (new CodeTypeParameter ("New"));
184 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
186 "Namespace SomeNS{0}" +
188 " Public Class SomeClass(Of T, As, New){0}" +
190 "End Namespace{0}", NewLine), Generate (), "#2");
192 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
193 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
194 type.TypeParameters.Add (typeParamR);
196 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
198 "Namespace SomeNS{0}" +
200 " Public Class SomeClass(Of T, As, New, R As System.IComparable){0}" +
202 "End Namespace{0}", NewLine), Generate (), "#3");
204 type.TypeParameters.Add (new CodeTypeParameter ("S"));
206 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
208 "Namespace SomeNS{0}" +
210 " Public Class SomeClass(Of T, As, New, R As System.IComparable, S){0}" +
212 "End Namespace{0}", NewLine), Generate (), "#4");
216 public void Type_TypeParameters_Constraints ()
218 codeNamespace.Name = "SomeNS";
220 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
221 codeNamespace.Types.Add (type);
223 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
224 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
225 type.TypeParameters.Add (typeParamT);
227 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
229 "Namespace SomeNS{0}" +
231 " Public Class SomeClass(Of T As System.IComparable){0}" +
233 "End Namespace{0}", NewLine), Generate (), "#1");
235 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
237 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
239 "Namespace SomeNS{0}" +
241 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable}}){0}" +
243 "End Namespace{0}", NewLine), Generate (), "#2");
245 typeParamT.HasConstructorConstraint = true;
247 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
249 "Namespace SomeNS{0}" +
251 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}){0}" +
253 "End Namespace{0}", NewLine), Generate (), "#3");
255 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
256 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
257 type.TypeParameters.Add (typeParamS);
259 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
261 "Namespace SomeNS{0}" +
263 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable){0}" +
265 "End Namespace{0}", NewLine), Generate (), "#4");
267 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
268 typeParamR.HasConstructorConstraint = true;
269 type.TypeParameters.Add (typeParamR);
271 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
273 "Namespace SomeNS{0}" +
275 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New){0}" +
277 "End Namespace{0}", NewLine), Generate (), "#5");
281 public void Type_TypeParameters_ConstructorConstraint ()
283 codeNamespace.Name = "SomeNS";
285 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
286 codeNamespace.Types.Add (type);
288 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
289 typeParam.HasConstructorConstraint = true;
290 type.TypeParameters.Add (typeParam);
292 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
294 "Namespace SomeNS{0}" +
296 " Public Class SomeClass(Of T As New){0}" +
298 "End Namespace{0}", NewLine), Generate ());
302 public void Method_TypeParameters ()
304 codeNamespace.Name = "SomeNS";
306 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
307 codeNamespace.Types.Add (type);
309 CodeMemberMethod method = new CodeMemberMethod ();
310 method.Name = "SomeMethod";
311 type.Members.Add (method);
313 method.TypeParameters.Add (new CodeTypeParameter ("T"));
315 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
317 "Namespace SomeNS{0}" +
319 " Public Class SomeClass{0}" +
321 " Private Sub SomeMethod(Of T)(){0}" +
324 "End Namespace{0}", NewLine), Generate (), "#1");
326 method.TypeParameters.Add (new CodeTypeParameter ("As"));
327 method.TypeParameters.Add (new CodeTypeParameter ("New"));
329 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
331 "Namespace SomeNS{0}" +
333 " Public Class SomeClass{0}" +
335 " Private Sub SomeMethod(Of T, As, New)(){0}" +
338 "End Namespace{0}", NewLine), Generate (), "#2");
340 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
341 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
342 method.TypeParameters.Add (typeParamR);
344 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
346 "Namespace SomeNS{0}" +
348 " Public Class SomeClass{0}" +
350 " Private Sub SomeMethod(Of T, As, New, R As System.IComparable)(){0}" +
353 "End Namespace{0}", NewLine), Generate (), "#3");
355 method.TypeParameters.Add (new CodeTypeParameter ("S"));
357 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
359 "Namespace SomeNS{0}" +
361 " Public Class SomeClass{0}" +
363 " Private Sub SomeMethod(Of T, As, New, R As System.IComparable, S)(){0}" +
366 "End Namespace{0}", NewLine), Generate (), "#4");
370 public void Method_TypeParameters_Constraints ()
372 codeNamespace.Name = "SomeNS";
374 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
375 codeNamespace.Types.Add (type);
377 CodeMemberMethod method = new CodeMemberMethod ();
378 method.Name = "SomeMethod";
379 type.Members.Add (method);
381 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
382 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
383 method.TypeParameters.Add (typeParamT);
385 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
387 "Namespace SomeNS{0}" +
389 " Public Class SomeClass{0}" +
391 " Private Sub SomeMethod(Of T As System.IComparable)(){0}" +
394 "End Namespace{0}", NewLine), Generate (), "#1");
396 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
398 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
400 "Namespace SomeNS{0}" +
402 " Public Class SomeClass{0}" +
404 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable}})(){0}" +
407 "End Namespace{0}", NewLine), Generate (), "#2");
409 typeParamT.HasConstructorConstraint = true;
411 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
413 "Namespace SomeNS{0}" +
415 " Public Class SomeClass{0}" +
417 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}})(){0}" +
420 "End Namespace{0}", NewLine), Generate (), "#3");
422 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
423 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
424 method.TypeParameters.Add (typeParamS);
426 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
428 "Namespace SomeNS{0}" +
430 " Public Class SomeClass{0}" +
432 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable)(){0}" +
435 "End Namespace{0}", NewLine), Generate (), "#4");
437 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
438 typeParamR.HasConstructorConstraint = true;
439 method.TypeParameters.Add (typeParamR);
441 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
443 "Namespace SomeNS{0}" +
445 " Public Class SomeClass{0}" +
447 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New)(){0}" +
450 "End Namespace{0}", NewLine), Generate (), "#5");
454 public void Method_TypeParameters_ConstructorConstraint ()
456 codeNamespace.Name = "SomeNS";
458 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
459 codeNamespace.Types.Add (type);
461 CodeMemberMethod method = new CodeMemberMethod ();
462 method.Name = "SomeMethod";
463 type.Members.Add (method);
465 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
466 typeParam.HasConstructorConstraint = true;
467 method.TypeParameters.Add (typeParam);
469 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
471 "Namespace SomeNS{0}" +
473 " Public Class SomeClass{0}" +
475 " Private Sub SomeMethod(Of T As New)(){0}" +
478 "End Namespace{0}", NewLine), Generate ());