2 // Microsoft.CSharp.* Test Cases
5 // Erik LeBel (eriklebel@yahoo.ca)
11 using System.CodeDom.Compiler;
12 using System.Globalization;
16 using NUnit.Framework;
18 namespace MonoTests.Microsoft.CSharp
21 /// Test ICodeGenerator's GenerateCodeFromNamespace, along with a
22 /// minimal set CodeDom components.
25 public class CodeGeneratorFromNamespaceTest : CodeGeneratorTestBase
27 CodeNamespace codeNamespace;
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 ()
73 codeNamespace.Name = "A";
75 Assert.AreEqual ("namespace A {\n \n}\n", code, "#1");
77 CodeGeneratorOptions options = new CodeGeneratorOptions ();
78 options.BracingStyle = "C";
79 code = Generate (options);
80 Assert.AreEqual ("namespace A\n{\n \n}\n", code, "#2");
84 public void InvalidNamespaceTest ()
86 codeNamespace.Name = "A,B";
87 Assert.AreEqual ("namespace A,B {\n \n}\n", Generate ());
91 public void CommentOnlyNamespaceTest ()
93 CodeCommentStatement comment = new CodeCommentStatement ("a");
94 codeNamespace.Comments.Add (comment);
95 Assert.AreEqual ("// a\n\n", Generate ());
99 public void ImportsTest ()
101 codeNamespace.Imports.Add (new CodeNamespaceImport ("System"));
102 codeNamespace.Imports.Add (new CodeNamespaceImport ("System.Collections"));
104 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
106 "using System.Collections;{0}" +
107 "{0}", NewLine), Generate (), "#1");
109 codeNamespace.Name = "A";
111 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
112 "namespace A {{{0}" +
113 " using System;{0}" +
114 " using System.Collections;{0}" +
116 "}}{0}", NewLine), Generate (), "#2");
118 codeNamespace.Name = null;
119 codeNamespace.Comments.Add (new CodeCommentStatement ("a"));
121 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
124 "using System.Collections;{0}" +
125 "{0}", NewLine), Generate (), "#3");
127 codeNamespace.Name = "A";
129 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
131 "namespace A {{{0}" +
132 " using System;{0}" +
133 " using System.Collections;{0}" +
135 "}}{0}", NewLine), Generate (), "#4");
139 public void TypeTest ()
141 codeNamespace.Types.Add (new CodeTypeDeclaration ("Person"));
142 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
145 "public class Person {{{0}" +
146 "}}{0}", NewLine), Generate (), "#A1");
148 CodeGeneratorOptions options = new CodeGeneratorOptions ();
149 options.BlankLinesBetweenMembers = false;
150 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
152 "public class Person {{{0}" +
153 "}}{0}", NewLine), Generate (options), "#A2");
155 codeNamespace.Name = "A";
156 Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
157 "namespace A {{{0}" +
160 " public class Person {{{0}" +
162 "}}{0}", NewLine), Generate (), "#B1");
164 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
165 "namespace A {{{0}" +
167 " public class Person {{{0}" +
169 "}}{0}", NewLine), Generate (options), "#B2");
174 public void Type_TypeParameters ()
176 codeNamespace.Name = "SomeNS";
178 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
179 codeNamespace.Types.Add (type);
180 type.TypeParameters.Add (new CodeTypeParameter ("T"));
182 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
183 "namespace SomeNS {{{0}" +
186 " public class SomeClass<T>{0}" +
189 "}}{0}", NewLine), Generate (), "#1");
191 type.TypeParameters.Add (new CodeTypeParameter ("as"));
192 type.TypeParameters.Add (new CodeTypeParameter ("is"));
194 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
195 "namespace SomeNS {{{0}" +
198 " public class SomeClass<T, as, is>{0}" +
203 "}}{0}", NewLine), Generate (), "#2");
205 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
206 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
207 type.TypeParameters.Add (typeParamR);
209 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
210 "namespace SomeNS {{{0}" +
213 " public class SomeClass<T, as, is, R>{0}" +
217 " where R : System.IComparable {{{0}" +
219 "}}{0}", NewLine), Generate (), "#3");
221 type.TypeParameters.Add (new CodeTypeParameter ("S"));
223 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
224 "namespace SomeNS {{{0}" +
227 " public class SomeClass<T, as, is, R, S>{0}" +
231 " where R : System.IComparable{0}" +
234 "}}{0}", NewLine), Generate (), "#4");
239 public void Type_TypeParameters_Constraints ()
241 codeNamespace.Name = "SomeNS";
243 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
244 codeNamespace.Types.Add (type);
246 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
247 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
248 type.TypeParameters.Add (typeParamT);
250 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
251 "namespace SomeNS {{{0}" +
254 " public class SomeClass<T>{0}" +
255 " where T : System.IComparable {{{0}" +
257 "}}{0}", NewLine), Generate (), "#1");
259 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
261 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
262 "namespace SomeNS {{{0}" +
265 " public class SomeClass<T>{0}" +
266 " where T : System.IComparable, System.ICloneable {{{0}" +
268 "}}{0}", NewLine), Generate (), "#2");
270 typeParamT.HasConstructorConstraint = true;
272 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
273 "namespace SomeNS {{{0}" +
276 " public class SomeClass<T>{0}" +
277 " where T : System.IComparable, System.ICloneable, new () {{{0}" +
279 "}}{0}", NewLine), Generate (), "#3");
281 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
282 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
283 type.TypeParameters.Add (typeParamS);
285 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
286 "namespace SomeNS {{{0}" +
289 " public class SomeClass<T, S>{0}" +
290 " where T : System.IComparable, System.ICloneable, new (){0}" +
291 " where S : System.IDisposable {{{0}" +
293 "}}{0}", NewLine), Generate (), "#4");
295 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
296 typeParamR.HasConstructorConstraint = true;
297 type.TypeParameters.Add (typeParamR);
299 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
300 "namespace SomeNS {{{0}" +
303 " public class SomeClass<T, S, R>{0}" +
304 " where T : System.IComparable, System.ICloneable, new (){0}" +
305 " where S : System.IDisposable{0}" +
306 " where R : new() {{{0}" +
308 "}}{0}", NewLine), Generate (), "#5");
312 public void Type_TypeParameters_ConstructorConstraint ()
314 codeNamespace.Name = "SomeNS";
316 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
317 codeNamespace.Types.Add (type);
319 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
320 typeParam.HasConstructorConstraint = true;
321 type.TypeParameters.Add (typeParam);
323 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
324 "namespace SomeNS {{{0}" +
327 " public class SomeClass<T>{0}" +
328 " where T : new() {{{0}" +
330 "}}{0}", NewLine), Generate ());
334 public void Method_TypeParameters ()
336 codeNamespace.Name = "SomeNS";
338 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
339 codeNamespace.Types.Add (type);
341 CodeMemberMethod method = new CodeMemberMethod ();
342 method.Name = "SomeMethod";
343 type.Members.Add (method);
345 method.TypeParameters.Add (new CodeTypeParameter ("T"));
347 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
348 "namespace SomeNS {{{0}" +
351 " public class SomeClass {{{0}" +
353 " private void SomeMethod<T>(){0}" +
357 "}}{0}", NewLine), Generate (), "#1");
359 method.TypeParameters.Add (new CodeTypeParameter ("as"));
360 method.TypeParameters.Add (new CodeTypeParameter ("is"));
362 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
363 "namespace SomeNS {{{0}" +
366 " public class SomeClass {{{0}" +
368 " private void SomeMethod<T, as, is>(){0}" +
374 "}}{0}", NewLine), Generate (), "#2");
376 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
377 typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
378 method.TypeParameters.Add (typeParamR);
380 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
381 "namespace SomeNS {{{0}" +
384 " public class SomeClass {{{0}" +
386 " private void SomeMethod<T, as, is, R>(){0}" +
390 " where R : System.IComparable {{{0}" +
393 "}}{0}", NewLine), Generate (), "#3");
395 method.TypeParameters.Add (new CodeTypeParameter ("S"));
397 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
398 "namespace SomeNS {{{0}" +
401 " public class SomeClass {{{0}" +
403 " private void SomeMethod<T, as, is, R, S>(){0}" +
407 " where R : System.IComparable{0}" +
411 "}}{0}", NewLine), Generate (), "#4");
415 public void Method_TypeParameters_Constraints ()
417 codeNamespace.Name = "SomeNS";
419 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
420 codeNamespace.Types.Add (type);
422 CodeMemberMethod method = new CodeMemberMethod ();
423 method.Name = "SomeMethod";
424 type.Members.Add (method);
426 CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
427 typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
428 method.TypeParameters.Add (typeParamT);
430 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
431 "namespace SomeNS {{{0}" +
434 " public class SomeClass {{{0}" +
436 " private void SomeMethod<T>(){0}" +
437 " where T : System.IComparable {{{0}" +
440 "}}{0}", NewLine), Generate (), "#1");
442 typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
444 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
445 "namespace SomeNS {{{0}" +
448 " public class SomeClass {{{0}" +
450 " private void SomeMethod<T>(){0}" +
451 " where T : System.IComparable, System.ICloneable {{{0}" +
454 "}}{0}", NewLine), Generate (), "#2");
456 typeParamT.HasConstructorConstraint = true;
458 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
459 "namespace SomeNS {{{0}" +
462 " public class SomeClass {{{0}" +
464 " private void SomeMethod<T>(){0}" +
465 " where T : System.IComparable, System.ICloneable, new () {{{0}" +
468 "}}{0}", NewLine), Generate (), "#3");
470 CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
471 typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
472 method.TypeParameters.Add (typeParamS);
474 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
475 "namespace SomeNS {{{0}" +
478 " public class SomeClass {{{0}" +
480 " private void SomeMethod<T, S>(){0}" +
481 " where T : System.IComparable, System.ICloneable, new (){0}" +
482 " where S : System.IDisposable {{{0}" +
485 "}}{0}", NewLine), Generate (), "#4");
487 CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
488 typeParamR.HasConstructorConstraint = true;
489 method.TypeParameters.Add (typeParamR);
491 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
492 "namespace SomeNS {{{0}" +
495 " public class SomeClass {{{0}" +
497 " private void SomeMethod<T, S, R>(){0}" +
498 " where T : System.IComparable, System.ICloneable, new (){0}" +
499 " where S : System.IDisposable{0}" +
500 " where R : new() {{{0}" +
503 "}}{0}", NewLine), Generate (), "#5");
506 [Test] // bug #353921
507 public void Method_TypeParameters_ConstructorConstraint ()
509 codeNamespace.Name = "SomeNS";
511 CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
512 codeNamespace.Types.Add (type);
514 CodeMemberMethod method = new CodeMemberMethod ();
515 method.Name = "SomeMethod";
516 type.Members.Add (method);
518 CodeTypeParameter typeParam = new CodeTypeParameter ("T");
519 typeParam.HasConstructorConstraint = true;
520 method.TypeParameters.Add (typeParam);
522 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
523 "namespace SomeNS {{{0}" +
526 " public class SomeClass {{{0}" +
528 " private void SomeMethod<T>(){0}" +
529 " where T : new() {{{0}" +
532 "}}{0}", NewLine), Generate ());