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");
166 public void Type_TypeParameters ()
168 codeNamespace.Name = "SomeNS";
170 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
171 codeNamespace.Types.Add (type);
172 type.TypeParameters.Add (new CodeTypeParameter ("T"));
174 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
176 "Namespace SomeNS{0}" +
178 " Public Class SomeClass(Of T){0}" +
180 "End Namespace{0}", NewLine), Generate (), "#1");
182 type.TypeParameters.Add (new CodeTypeParameter ("As"));
183 type.TypeParameters.Add (new CodeTypeParameter ("New"));
185 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
187 "Namespace SomeNS{0}" +
189 " Public Class SomeClass(Of T, As, New){0}" +
191 "End Namespace{0}", NewLine), Generate (), "#2");
193 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
194 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
195 type.TypeParameters.Add (typeParamR);
197 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
199 "Namespace SomeNS{0}" +
201 " Public Class SomeClass(Of T, As, New, R As System.IComparable){0}" +
203 "End Namespace{0}", NewLine), Generate (), "#3");
205 type.TypeParameters.Add (new CodeTypeParameter ("S"));
207 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
209 "Namespace SomeNS{0}" +
211 " Public Class SomeClass(Of T, As, New, R As System.IComparable, S){0}" +
213 "End Namespace{0}", NewLine), Generate (), "#4");
217 public void Type_TypeParameters_Constraints ()
219 codeNamespace.Name = "SomeNS";
221 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
222 codeNamespace.Types.Add (type);
224 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
225 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
226 type.TypeParameters.Add (typeParamT);
228 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
230 "Namespace SomeNS{0}" +
232 " Public Class SomeClass(Of T As System.IComparable){0}" +
234 "End Namespace{0}", NewLine), Generate (), "#1");
236 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
238 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
240 "Namespace SomeNS{0}" +
242 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable}}){0}" +
244 "End Namespace{0}", NewLine), Generate (), "#2");
246 typeParamT.HasConstructorConstraint = true;
248 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
250 "Namespace SomeNS{0}" +
252 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}){0}" +
254 "End Namespace{0}", NewLine), Generate (), "#3");
256 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
257 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
258 type.TypeParameters.Add (typeParamS);
260 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
262 "Namespace SomeNS{0}" +
264 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable){0}" +
266 "End Namespace{0}", NewLine), Generate (), "#4");
268 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
269 typeParamR.HasConstructorConstraint = true;
270 type.TypeParameters.Add (typeParamR);
272 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
274 "Namespace SomeNS{0}" +
276 " Public Class SomeClass(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New){0}" +
278 "End Namespace{0}", NewLine), Generate (), "#5");
282 public void Type_TypeParameters_ConstructorConstraint ()
284 codeNamespace.Name = "SomeNS";
286 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
287 codeNamespace.Types.Add (type);
289 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
290 typeParam.HasConstructorConstraint = true;
291 type.TypeParameters.Add (typeParam);
293 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
295 "Namespace SomeNS{0}" +
297 " Public Class SomeClass(Of T As New){0}" +
299 "End Namespace{0}", NewLine), Generate ());
303 public void Method_TypeParameters ()
305 codeNamespace.Name = "SomeNS";
307 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
308 codeNamespace.Types.Add (type);
310 CodeMemberMethod method = new CodeMemberMethod ();
311 method.Name = "SomeMethod";
312 type.Members.Add (method);
314 method.TypeParameters.Add (new CodeTypeParameter ("T"));
316 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
318 "Namespace SomeNS{0}" +
320 " Public Class SomeClass{0}" +
322 " Private Sub SomeMethod(Of T)(){0}" +
325 "End Namespace{0}", NewLine), Generate (), "#1");
327 method.TypeParameters.Add (new CodeTypeParameter ("As"));
328 method.TypeParameters.Add (new CodeTypeParameter ("New"));
330 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
332 "Namespace SomeNS{0}" +
334 " Public Class SomeClass{0}" +
336 " Private Sub SomeMethod(Of T, As, New)(){0}" +
339 "End Namespace{0}", NewLine), Generate (), "#2");
341 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
342 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
343 method.TypeParameters.Add (typeParamR);
345 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
347 "Namespace SomeNS{0}" +
349 " Public Class SomeClass{0}" +
351 " Private Sub SomeMethod(Of T, As, New, R As System.IComparable)(){0}" +
354 "End Namespace{0}", NewLine), Generate (), "#3");
356 method.TypeParameters.Add (new CodeTypeParameter ("S"));
358 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
360 "Namespace SomeNS{0}" +
362 " Public Class SomeClass{0}" +
364 " Private Sub SomeMethod(Of T, As, New, R As System.IComparable, S)(){0}" +
367 "End Namespace{0}", NewLine), Generate (), "#4");
371 public void Method_TypeParameters_Constraints ()
373 codeNamespace.Name = "SomeNS";
375 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
376 codeNamespace.Types.Add (type);
378 CodeMemberMethod method = new CodeMemberMethod ();
379 method.Name = "SomeMethod";
380 type.Members.Add (method);
382 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
383 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
384 method.TypeParameters.Add (typeParamT);
386 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
388 "Namespace SomeNS{0}" +
390 " Public Class SomeClass{0}" +
392 " Private Sub SomeMethod(Of T As System.IComparable)(){0}" +
395 "End Namespace{0}", NewLine), Generate (), "#1");
397 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
399 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
401 "Namespace SomeNS{0}" +
403 " Public Class SomeClass{0}" +
405 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable}})(){0}" +
408 "End Namespace{0}", NewLine), Generate (), "#2");
410 typeParamT.HasConstructorConstraint = true;
412 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
414 "Namespace SomeNS{0}" +
416 " Public Class SomeClass{0}" +
418 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}})(){0}" +
421 "End Namespace{0}", NewLine), Generate (), "#3");
423 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
424 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
425 method.TypeParameters.Add (typeParamS);
427 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
429 "Namespace SomeNS{0}" +
431 " Public Class SomeClass{0}" +
433 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable)(){0}" +
436 "End Namespace{0}", NewLine), Generate (), "#4");
438 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
439 typeParamR.HasConstructorConstraint = true;
440 method.TypeParameters.Add (typeParamR);
442 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
444 "Namespace SomeNS{0}" +
446 " Public Class SomeClass{0}" +
448 " Private Sub SomeMethod(Of T As {{System.IComparable, System.ICloneable, New}}, S As System.IDisposable, R As New)(){0}" +
451 "End Namespace{0}", NewLine), Generate (), "#5");
455 public void Method_TypeParameters_ConstructorConstraint ()
457 codeNamespace.Name = "SomeNS";
459 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
460 codeNamespace.Types.Add (type);
462 CodeMemberMethod method = new CodeMemberMethod ();
463 method.Name = "SomeMethod";
464 type.Members.Add (method);
466 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
467 typeParam.HasConstructorConstraint = true;
468 method.TypeParameters.Add (typeParam);
470 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
472 "Namespace SomeNS{0}" +
474 " Public Class SomeClass{0}" +
476 " Private Sub SomeMethod(Of T As New)(){0}" +
479 "End Namespace{0}", NewLine), Generate ());