Merge pull request #2231 from ludovic-henry/coop-sync-friendliness
[mono.git] / mcs / class / System / Test / Microsoft.CSharp / CodeGeneratorFromNamespaceTest.cs
1 //
2 // Microsoft.CSharp.* Test Cases
3 //
4 // Authors:
5 //      Erik LeBel (eriklebel@yahoo.ca)
6 //
7 // (c) 2003 Erik LeBel
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.CSharp
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;
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                         string code = null;
72
73                         codeNamespace.Name = "A";
74                         code = Generate ();
75                         Assert.AreEqual ("namespace A {\n    \n}\n", code, "#1");
76
77                         CodeGeneratorOptions options = new CodeGeneratorOptions ();
78                         options.BracingStyle = "C";
79                         code = Generate (options);
80                         Assert.AreEqual ("namespace A\n{\n    \n}\n", code, "#2");
81                 }
82
83                 [Test]
84                 public void InvalidNamespaceTest ()
85                 {
86                         codeNamespace.Name = "A,B";
87                         Assert.AreEqual ("namespace A,B {\n    \n}\n", Generate ());
88                 }
89
90                 [Test]
91                 public void CommentOnlyNamespaceTest ()
92                 {
93                         CodeCommentStatement comment = new CodeCommentStatement ("a");
94                         codeNamespace.Comments.Add (comment);
95                         Assert.AreEqual ("// a\n\n", Generate ());
96                 }
97
98                 [Test]
99                 public void ImportsTest ()
100                 {
101                         codeNamespace.Imports.Add (new CodeNamespaceImport ("System"));
102                         codeNamespace.Imports.Add (new CodeNamespaceImport ("System.Collections"));
103
104                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
105                                 "using System;{0}" +
106                                 "using System.Collections;{0}" +
107                                 "{0}", NewLine), Generate (), "#1");
108
109                         codeNamespace.Name = "A";
110
111                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
112                                 "namespace A {{{0}" +
113                                 "    using System;{0}" +
114                                 "    using System.Collections;{0}" +
115                                 "    {0}" +
116                                 "}}{0}", NewLine), Generate (), "#2");
117
118                         codeNamespace.Name = null;
119                         codeNamespace.Comments.Add (new CodeCommentStatement ("a"));
120
121                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
122                                 "// a{0}" +
123                                 "using System;{0}" +
124                                 "using System.Collections;{0}" +
125                                 "{0}", NewLine), Generate (), "#3");
126
127                         codeNamespace.Name = "A";
128
129                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
130                                 "// a{0}" +
131                                 "namespace A {{{0}" +
132                                 "    using System;{0}" +
133                                 "    using System.Collections;{0}" +
134                                 "    {0}" +
135                                 "}}{0}", NewLine), Generate (), "#4");
136                 }
137
138                 [Test]
139                 public void TypeTest ()
140                 {
141                         codeNamespace.Types.Add (new CodeTypeDeclaration ("Person"));
142                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
143                                 "{0}" +
144                                 "{0}" +
145                                 "public class Person {{{0}" +
146                                 "}}{0}", NewLine), Generate (), "#A1");
147
148                         CodeGeneratorOptions options = new CodeGeneratorOptions ();
149                         options.BlankLinesBetweenMembers = false;
150                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
151                                 "{0}" +
152                                 "public class Person {{{0}" +
153                                 "}}{0}", NewLine), Generate (options), "#A2");
154
155                         codeNamespace.Name = "A";
156                         Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
157                                 "namespace A {{{0}" +
158                                 "    {0}" +
159                                 "    {0}" +
160                                 "    public class Person {{{0}" +
161                                 "    }}{0}" +
162                                 "}}{0}", NewLine), Generate (), "#B1");
163
164                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
165                                 "namespace A {{{0}" +
166                                 "    {0}" +
167                                 "    public class Person {{{0}" +
168                                 "    }}{0}" +
169                                 "}}{0}", NewLine), Generate (options), "#B2");
170                 }
171
172                 [Test]
173                 public void Type_TypeParameters ()
174                 {
175                         codeNamespace.Name = "SomeNS";
176
177                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
178                         codeNamespace.Types.Add (type);
179                         type.TypeParameters.Add (new CodeTypeParameter ("T"));
180
181                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
182                                 "namespace SomeNS {{{0}" +
183                                 "    {0}" +
184                                 "    {0}" +
185                                 "    public class SomeClass<T>{0}" +
186                                 "     {{{0}" +
187                                 "    }}{0}" +
188                                 "}}{0}", NewLine), Generate (), "#1");
189
190                         type.TypeParameters.Add (new CodeTypeParameter ("as"));
191                         type.TypeParameters.Add (new CodeTypeParameter ("is"));
192
193                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
194                                 "namespace SomeNS {{{0}" +
195                                 "    {0}" +
196                                 "    {0}" +
197                                 "    public class SomeClass<T, as, is>{0}" +
198                                 "    {0}" +
199                                 "    {0}" +
200                                 "     {{{0}" +
201                                 "    }}{0}" +
202                                 "}}{0}", NewLine), Generate (), "#2");
203
204                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
205                         typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
206                         type.TypeParameters.Add (typeParamR);
207
208                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
209                                 "namespace SomeNS {{{0}" +
210                                 "    {0}" +
211                                 "    {0}" +
212                                 "    public class SomeClass<T, as, is, R>{0}" +
213                                 "    {0}" +
214                                 "    {0}" +
215                                 "    {0}" +
216                                 "        where R : System.IComparable {{{0}" +
217                                 "    }}{0}" +
218                                 "}}{0}", NewLine), Generate (), "#3");
219
220                         type.TypeParameters.Add (new CodeTypeParameter ("S"));
221
222                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
223                                 "namespace SomeNS {{{0}" +
224                                 "    {0}" +
225                                 "    {0}" +
226                                 "    public class SomeClass<T, as, is, R, S>{0}" +
227                                 "    {0}" +
228                                 "    {0}" +
229                                 "    {0}" +
230                                 "        where R : System.IComparable{0}" +
231                                 "     {{{0}" +
232                                 "    }}{0}" +
233                                 "}}{0}", NewLine), Generate (), "#4");
234                 }
235
236
237                 [Test]
238                 public void Type_TypeParameters_Constraints ()
239                 {
240                         codeNamespace.Name = "SomeNS";
241
242                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
243                         codeNamespace.Types.Add (type);
244
245                         CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
246                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
247                         type.TypeParameters.Add (typeParamT);
248
249                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
250                                 "namespace SomeNS {{{0}" +
251                                 "    {0}" +
252                                 "    {0}" +
253                                 "    public class SomeClass<T>{0}" +
254                                 "        where T : System.IComparable {{{0}" +
255                                 "    }}{0}" +
256                                 "}}{0}", NewLine), Generate (), "#1");
257
258                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
259
260                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
261                                 "namespace SomeNS {{{0}" +
262                                 "    {0}" +
263                                 "    {0}" +
264                                 "    public class SomeClass<T>{0}" +
265                                 "        where T : System.IComparable, System.ICloneable {{{0}" +
266                                 "    }}{0}" +
267                                 "}}{0}", NewLine), Generate (), "#2");
268
269                         typeParamT.HasConstructorConstraint = true;
270
271                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
272                                 "namespace SomeNS {{{0}" +
273                                 "    {0}" +
274                                 "    {0}" +
275                                 "    public class SomeClass<T>{0}" +
276                                 "        where T : System.IComparable, System.ICloneable, new () {{{0}" +
277                                 "    }}{0}" +
278                                 "}}{0}", NewLine), Generate (), "#3");
279
280                         CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
281                         typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
282                         type.TypeParameters.Add (typeParamS);
283
284                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
285                                 "namespace SomeNS {{{0}" +
286                                 "    {0}" +
287                                 "    {0}" +
288                                 "    public class SomeClass<T, S>{0}" +
289                                 "        where T : System.IComparable, System.ICloneable, new (){0}" +
290                                 "        where S : System.IDisposable {{{0}" +
291                                 "    }}{0}" +
292                                 "}}{0}", NewLine), Generate (), "#4");
293
294                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
295                         typeParamR.HasConstructorConstraint = true;
296                         type.TypeParameters.Add (typeParamR);
297
298                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
299                                 "namespace SomeNS {{{0}" +
300                                 "    {0}" +
301                                 "    {0}" +
302                                 "    public class SomeClass<T, S, R>{0}" +
303                                 "        where T : System.IComparable, System.ICloneable, new (){0}" +
304                                 "        where S : System.IDisposable{0}" +
305                                 "        where R : new() {{{0}" +
306                                 "    }}{0}" +
307                                 "}}{0}", NewLine), Generate (), "#5");
308                 }
309
310                 [Test]
311                 public void Type_TypeParameters_ConstructorConstraint ()
312                 {
313                         codeNamespace.Name = "SomeNS";
314
315                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
316                         codeNamespace.Types.Add (type);
317
318                         CodeTypeParameter typeParam = new CodeTypeParameter ("T");
319                         typeParam.HasConstructorConstraint = true;
320                         type.TypeParameters.Add (typeParam);
321
322                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
323                                 "namespace SomeNS {{{0}" +
324                                 "    {0}" +
325                                 "    {0}" +
326                                 "    public class SomeClass<T>{0}" +
327                                 "        where T : new() {{{0}" +
328                                 "    }}{0}" +
329                                 "}}{0}", NewLine), Generate ());
330                 }
331
332                 [Test]
333                 public void Method_TypeParameters ()
334                 {
335                         codeNamespace.Name = "SomeNS";
336
337                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
338                         codeNamespace.Types.Add (type);
339
340                         CodeMemberMethod method = new CodeMemberMethod ();
341                         method.Name = "SomeMethod";
342                         type.Members.Add (method);
343
344                         method.TypeParameters.Add (new CodeTypeParameter ("T"));
345
346                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
347                                 "namespace SomeNS {{{0}" +
348                                 "    {0}" +
349                                 "    {0}" +
350                                 "    public class SomeClass {{{0}" +
351                                 "        {0}" +
352                                 "        private void SomeMethod<T>(){0}" +
353                                 "         {{{0}" +
354                                 "        }}{0}" +
355                                 "    }}{0}" +
356                                 "}}{0}", NewLine), Generate (), "#1");
357
358                         method.TypeParameters.Add (new CodeTypeParameter ("as"));
359                         method.TypeParameters.Add (new CodeTypeParameter ("is"));
360
361                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
362                                 "namespace SomeNS {{{0}" +
363                                 "    {0}" +
364                                 "    {0}" +
365                                 "    public class SomeClass {{{0}" +
366                                 "        {0}" +
367                                 "        private void SomeMethod<T, as, is>(){0}" +
368                                 "        {0}" +
369                                 "        {0}" +
370                                 "         {{{0}" +
371                                 "        }}{0}" +
372                                 "    }}{0}" +
373                                 "}}{0}", NewLine), Generate (), "#2");
374
375                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
376                         typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
377                         method.TypeParameters.Add (typeParamR);
378
379                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
380                                 "namespace SomeNS {{{0}" +
381                                 "    {0}" +
382                                 "    {0}" +
383                                 "    public class SomeClass {{{0}" +
384                                 "        {0}" +
385                                 "        private void SomeMethod<T, as, is, R>(){0}" +
386                                 "        {0}" +
387                                 "        {0}" +
388                                 "        {0}" +
389                                 "            where R : System.IComparable {{{0}" +
390                                 "        }}{0}" +
391                                 "    }}{0}" +
392                                 "}}{0}", NewLine), Generate (), "#3");
393
394                         method.TypeParameters.Add (new CodeTypeParameter ("S"));
395
396                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
397                                 "namespace SomeNS {{{0}" +
398                                 "    {0}" +
399                                 "    {0}" +
400                                 "    public class SomeClass {{{0}" +
401                                 "        {0}" +
402                                 "        private void SomeMethod<T, as, is, R, S>(){0}" +
403                                 "        {0}" +
404                                 "        {0}" +
405                                 "        {0}" +
406                                 "            where R : System.IComparable{0}" +
407                                 "         {{{0}" +
408                                 "        }}{0}" +
409                                 "    }}{0}" +
410                                 "}}{0}", NewLine), Generate (), "#4");
411                 }
412
413                 [Test]
414                 public void Method_TypeParameters_Constraints ()
415                 {
416                         codeNamespace.Name = "SomeNS";
417
418                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
419                         codeNamespace.Types.Add (type);
420
421                         CodeMemberMethod method = new CodeMemberMethod ();
422                         method.Name = "SomeMethod";
423                         type.Members.Add (method);
424
425                         CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
426                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
427                         method.TypeParameters.Add (typeParamT);
428
429                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
430                                 "namespace SomeNS {{{0}" +
431                                 "    {0}" +
432                                 "    {0}" +
433                                 "    public class SomeClass {{{0}" +
434                                 "        {0}" +
435                                 "        private void SomeMethod<T>(){0}" +
436                                 "            where T : System.IComparable {{{0}" +
437                                 "        }}{0}" +
438                                 "    }}{0}" +
439                                 "}}{0}", NewLine), Generate (), "#1");
440
441                         typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
442
443                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
444                                 "namespace SomeNS {{{0}" +
445                                 "    {0}" +
446                                 "    {0}" +
447                                 "    public class SomeClass {{{0}" +
448                                 "        {0}" +
449                                 "        private void SomeMethod<T>(){0}" +
450                                 "            where T : System.IComparable, System.ICloneable {{{0}" +
451                                 "        }}{0}" +
452                                 "    }}{0}" +
453                                 "}}{0}", NewLine), Generate (), "#2");
454
455                         typeParamT.HasConstructorConstraint = true;
456
457                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
458                                 "namespace SomeNS {{{0}" +
459                                 "    {0}" +
460                                 "    {0}" +
461                                 "    public class SomeClass {{{0}" +
462                                 "        {0}" +
463                                 "        private void SomeMethod<T>(){0}" +
464                                 "            where T : System.IComparable, System.ICloneable, new () {{{0}" +
465                                 "        }}{0}" +
466                                 "    }}{0}" +
467                                 "}}{0}", NewLine), Generate (), "#3");
468
469                         CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
470                         typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
471                         method.TypeParameters.Add (typeParamS);
472
473                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
474                                 "namespace SomeNS {{{0}" +
475                                 "    {0}" +
476                                 "    {0}" +
477                                 "    public class SomeClass {{{0}" +
478                                 "        {0}" +
479                                 "        private void SomeMethod<T, S>(){0}" +
480                                 "            where T : System.IComparable, System.ICloneable, new (){0}" +
481                                 "            where S : System.IDisposable {{{0}" +
482                                 "        }}{0}" +
483                                 "    }}{0}" +
484                                 "}}{0}", NewLine), Generate (), "#4");
485
486                         CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
487                         typeParamR.HasConstructorConstraint = true;
488                         method.TypeParameters.Add (typeParamR);
489
490                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
491                                 "namespace SomeNS {{{0}" +
492                                 "    {0}" +
493                                 "    {0}" +
494                                 "    public class SomeClass {{{0}" +
495                                 "        {0}" +
496                                 "        private void SomeMethod<T, S, R>(){0}" +
497                                 "            where T : System.IComparable, System.ICloneable, new (){0}" +
498                                 "            where S : System.IDisposable{0}" +
499                                 "            where R : new() {{{0}" +
500                                 "        }}{0}" +
501                                 "    }}{0}" +
502                                 "}}{0}", NewLine), Generate (), "#5");
503                 }
504
505                 [Test] // bug #353921
506                 public void Method_TypeParameters_ConstructorConstraint ()
507                 {
508                         codeNamespace.Name = "SomeNS";
509
510                         CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
511                         codeNamespace.Types.Add (type);
512
513                         CodeMemberMethod method = new CodeMemberMethod ();
514                         method.Name = "SomeMethod";
515                         type.Members.Add (method);
516
517                         CodeTypeParameter typeParam = new CodeTypeParameter ("T");
518                         typeParam.HasConstructorConstraint = true;
519                         method.TypeParameters.Add (typeParam);
520
521                         Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
522                                 "namespace SomeNS {{{0}" +
523                                 "    {0}" +
524                                 "    {0}" +
525                                 "    public class SomeClass {{{0}" +
526                                 "        {0}" +
527                                 "        private void SomeMethod<T>(){0}" +
528                                 "            where T : new() {{{0}" +
529                                 "        }}{0}" +
530                                 "    }}{0}" +
531                                 "}}{0}", NewLine), Generate ());
532                 }
533         }
534 }