2 // Microsoft.CSharp.* Test Cases
5 // Erik LeBel (eriklebel@yahoo.ca)
10 using System.Globalization;
13 using System.CodeDom.Compiler;
15 using NUnit.Framework;
17 namespace MonoTests.Microsoft.CSharp
21 /// Test ICodeGenerator's GenerateCodeFromType, along with a
22 /// minimal set CodeDom components.
26 public class CodeGeneratorFromTypeTest: CodeGeneratorTestBase
28 CodeTypeDeclaration type = null;
34 type = new CodeTypeDeclaration ();
37 protected override void Generate ()
39 generator.GenerateCodeFromType (type, writer, options);
44 public void DefaultTypeTest ()
47 Assertion.AssertEquals ("public class {\n}\n", Code);
51 [ExpectedException (typeof (NullReferenceException))]
52 public void NullTypeTest ()
59 public void SimpleTypeTest ()
63 Assertion.AssertEquals (string.Format (CultureInfo.InvariantCulture,
64 "public class Test1 {{{0}}}{0}", writer.NewLine), Code);
68 public void AttributesAndTypeTest ()
72 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
74 type.CustomAttributes.Add (attrDec);
76 attrDec = new CodeAttributeDeclaration ();
78 type.CustomAttributes.Add (attrDec);
81 Assertion.AssertEquals (string.Format (CultureInfo.InvariantCulture,
84 + "public class Test1 {{{0}"
85 + "}}{0}", writer.NewLine), Code);
89 public void EventMembersTypeTest1 ()
93 CodeMemberEvent evt = new CodeMemberEvent ();
95 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
97 evt.CustomAttributes.Add (attrDec);
99 attrDec = new CodeAttributeDeclaration ();
101 evt.CustomAttributes.Add (attrDec);
103 type.Members.Add (evt);
106 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
107 "public class Test1 {{{0}"
111 + " private event void ;{0}"
112 + "}}{0}", writer.NewLine), Code);
116 public void EventMembersTypeTest2 ()
120 CodeMemberEvent evt = new CodeMemberEvent ();
121 evt.Name = "OnClick";
122 evt.Attributes = MemberAttributes.Public;
123 evt.Type = new CodeTypeReference (typeof (int));
124 type.Members.Add (evt);
127 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
128 "public class Test1 {{{0}"
130 + " public event int OnClick;{0}"
131 + "}}{0}", writer.NewLine), Code);
135 public void FieldMembersTypeTest1 ()
139 CodeMemberField fld = new CodeMemberField ();
141 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
143 fld.CustomAttributes.Add (attrDec);
145 attrDec = new CodeAttributeDeclaration ();
147 fld.CustomAttributes.Add (attrDec);
149 type.Members.Add (fld);
152 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
153 "public class Test1 {{{0}"
157 + " private void ;{0}"
158 + "}}{0}", writer.NewLine), Code);
162 public void FieldMembersTypeTest2 ()
166 CodeMemberField fld = new CodeMemberField ();
168 fld.Attributes = MemberAttributes.Public;
169 fld.Type = new CodeTypeReference (typeof (int));
170 type.Members.Add (fld);
173 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
174 "public class Test1 {{{0}"
176 + " public int Name;{0}"
177 + "}}{0}", writer.NewLine), Code);
181 public void PropertyMembersTypeTest1 ()
185 CodeMemberProperty property = new CodeMemberProperty ();
187 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
189 property.CustomAttributes.Add (attrDec);
191 attrDec = new CodeAttributeDeclaration ();
193 property.CustomAttributes.Add (attrDec);
195 type.Members.Add (property);
198 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
199 "public class Test1 {{{0}"
203 + " private void {{{0}"
205 + "}}{0}", writer.NewLine), Code);
209 public void PropertyMembersTypeTest2 ()
213 CodeMemberProperty property = new CodeMemberProperty ();
214 property.Name = "Name";
215 property.Attributes = MemberAttributes.Public;
216 property.Type = new CodeTypeReference (typeof (int));
217 type.Members.Add (property);
220 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
221 "public class Test1 {{{0}"
223 + " public virtual int Name {{{0}"
225 + "}}{0}", writer.NewLine), Code);
229 public void PropertyMembersTypeGetOnly ()
233 CodeMemberProperty property = new CodeMemberProperty ();
234 property.Name = "Name";
235 property.Attributes = MemberAttributes.Family;
236 property.HasGet = true;
237 property.Type = new CodeTypeReference (typeof (int));
238 type.Members.Add (property);
241 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
242 "public class Test1 {{{0}"
244 + " protected virtual int Name {{{0}"
248 + "}}{0}", writer.NewLine), Code);
252 public void PropertyMembersTypeSetOnly ()
256 CodeMemberProperty property = new CodeMemberProperty ();
257 property.Name = "Name";
258 property.Attributes = MemberAttributes.FamilyOrAssembly;
259 property.HasSet = true;
260 property.Type = new CodeTypeReference (typeof (int));
261 type.Members.Add (property);
264 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
265 "public class Test1 {{{0}"
267 + " protected internal int Name {{{0}"
271 + "}}{0}", writer.NewLine), Code);
275 public void PropertyMembersTypeGetSet ()
279 CodeMemberProperty property = new CodeMemberProperty ();
280 property.Name = "Name";
281 property.Attributes = MemberAttributes.Assembly;
282 property.HasGet = true;
283 property.HasSet = true;
284 property.Type = new CodeTypeReference (typeof (int));
285 type.Members.Add (property);
288 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
289 "public class Test1 {{{0}"
292 + " internal virtual int Name {{{0}"
294 + " internal int Name {{{0}"
301 + "}}{0}", writer.NewLine), Code);
305 public void PropertyMembersTypeFamilyAndAssembly ()
309 CodeMemberProperty property = new CodeMemberProperty ();
310 property.Name = "Name";
311 property.Attributes = MemberAttributes.FamilyAndAssembly;
312 property.Type = new CodeTypeReference (typeof (int));
314 type.Members.Add (property);
317 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
318 "public class Test1 {{{0}"
321 + " internal int Name {{{0}"
323 + " /*FamANDAssem*/ internal int Name {{{0}"
326 + "}}{0}", writer.NewLine), Code);
330 public void MethodMembersTypeTest1 ()
334 CodeMemberMethod method = new CodeMemberMethod ();
336 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
338 method.CustomAttributes.Add (attrDec);
340 attrDec = new CodeAttributeDeclaration ();
342 method.CustomAttributes.Add (attrDec);
344 type.Members.Add (method);
347 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
348 "public class Test1 {{{0}"
352 + " private void () {{{0}"
354 + "}}{0}", writer.NewLine), Code);
358 public void MethodMembersTypeTest2 ()
362 CodeMemberMethod method = new CodeMemberMethod ();
363 method.Name = "Something";
364 method.Attributes = MemberAttributes.Public;
365 method.ReturnType = new CodeTypeReference (typeof (int));
367 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
368 typeof (object), "value1");
369 method.Parameters.Add (param);
371 param = new CodeParameterDeclarationExpression (
372 typeof (object), "value2");
373 param.Direction = FieldDirection.In;
374 method.Parameters.Add (param);
376 param = new CodeParameterDeclarationExpression (typeof (int), "index");
377 param.Direction = FieldDirection.Out;
378 method.Parameters.Add (param);
380 param = new CodeParameterDeclarationExpression (typeof (int), "count");
381 param.Direction = FieldDirection.Ref;
382 method.Parameters.Add (param);
384 type.Members.Add (method);
387 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
388 "public class Test1 {{{0}"
390 + " public virtual int Something(object value1, object value2, out int index, ref int count) {{{0}"
392 + "}}{0}", writer.NewLine), Code);
396 public void MethodMembersTypeTest3 ()
400 CodeMemberMethod method = new CodeMemberMethod ();
401 method.Name = "Something";
402 method.Attributes = MemberAttributes.Public;
403 method.ReturnType = new CodeTypeReference (typeof (int));
406 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
407 typeof (object), "value");
408 method.Parameters.Add (param);
410 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
412 param.CustomAttributes.Add (attrDec);
414 attrDec = new CodeAttributeDeclaration ();
416 param.CustomAttributes.Add (attrDec);
419 param = new CodeParameterDeclarationExpression (typeof (int), "index");
420 param.Direction = FieldDirection.Out;
421 method.Parameters.Add (param);
423 attrDec = new CodeAttributeDeclaration ();
425 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
426 new CodePrimitiveExpression (false)));
427 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
428 new CodePrimitiveExpression (true)));
429 param.CustomAttributes.Add (attrDec);
431 attrDec = new CodeAttributeDeclaration ();
433 param.CustomAttributes.Add (attrDec);
435 type.Members.Add (method);
438 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
439 "public class Test1 {{{0}"
441 + " public virtual int Something([A()] [B()] object value, [C(A1=false, A2=true)] [D()] out int index) {{{0}"
443 + "}}{0}", writer.NewLine), Code);
447 public void ConstructorAttributesTest ()
451 CodeConstructor ctor = new CodeConstructor ();
453 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
455 ctor.CustomAttributes.Add (attrDec);
457 attrDec = new CodeAttributeDeclaration ();
459 ctor.CustomAttributes.Add (attrDec);
461 type.Members.Add (ctor);
464 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
465 "public class Test1 {{{0}"
469 + " private Test1() {{{0}"
471 + "}}{0}", writer.NewLine), Code);
475 public void ConstructorParametersTest ()
479 CodeConstructor ctor = new CodeConstructor ();
480 ctor.Name = "Whatever";
481 ctor.Attributes = MemberAttributes.Public;
483 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
484 typeof (object), "value1");
485 ctor.Parameters.Add (param);
487 param = new CodeParameterDeclarationExpression (
488 typeof (object), "value2");
489 param.Direction = FieldDirection.In;
490 ctor.Parameters.Add (param);
492 param = new CodeParameterDeclarationExpression (typeof (int), "index");
493 param.Direction = FieldDirection.Out;
494 ctor.Parameters.Add (param);
496 param = new CodeParameterDeclarationExpression (typeof (int), "count");
497 param.Direction = FieldDirection.Ref;
498 ctor.Parameters.Add (param);
500 type.Members.Add (ctor);
503 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
504 "public class Test1 {{{0}"
506 + " public Test1(object value1, object value2, out int index, ref int count) {{{0}"
508 + "}}{0}", writer.NewLine), Code);
512 public void ConstructorParameterAttributesTest ()
516 CodeConstructor ctor = new CodeConstructor ();
517 ctor.Name = "Something";
518 ctor.Attributes = MemberAttributes.Public;
521 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
522 typeof (object), "value");
523 ctor.Parameters.Add (param);
525 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
527 param.CustomAttributes.Add (attrDec);
529 attrDec = new CodeAttributeDeclaration ();
531 param.CustomAttributes.Add (attrDec);
534 param = new CodeParameterDeclarationExpression (typeof (int), "index");
535 param.Direction = FieldDirection.Out;
536 ctor.Parameters.Add (param);
538 attrDec = new CodeAttributeDeclaration ();
540 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
541 new CodePrimitiveExpression (false)));
542 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
543 new CodePrimitiveExpression (true)));
544 param.CustomAttributes.Add (attrDec);
546 attrDec = new CodeAttributeDeclaration ();
548 param.CustomAttributes.Add (attrDec);
550 type.Members.Add (ctor);
553 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
554 "public class Test1 {{{0}"
556 + " public Test1([A()] [B()] object value, [C(A1=false, A2=true)] [D()] out int index) {{{0}"
558 + "}}{0}", writer.NewLine), Code);
562 public void BaseConstructorSingleArg ()
566 CodeConstructor ctor = new CodeConstructor ();
567 ctor.Name = "Something";
568 ctor.Attributes = MemberAttributes.Public;
571 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
572 typeof (object), "value1");
573 ctor.Parameters.Add (param);
576 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
577 param.Direction = FieldDirection.Out;
578 ctor.Parameters.Add (param);
581 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
583 type.Members.Add (ctor);
586 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
587 "public class Test1 {{{0}"
589 + " public Test1(object value1, out int value2) : {0}"
590 + " base(value1) {{{0}"
592 + "}}{0}", writer.NewLine), Code);
596 public void BaseConstructorMultipleArgs ()
600 CodeConstructor ctor = new CodeConstructor ();
601 ctor.Name = "Something";
602 ctor.Attributes = MemberAttributes.Public;
605 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
606 typeof (object), "value1");
607 ctor.Parameters.Add (param);
610 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
611 param.Direction = FieldDirection.Out;
612 ctor.Parameters.Add (param);
615 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
616 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
618 type.Members.Add (ctor);
621 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
622 "public class Test1 {{{0}"
624 + " public Test1(object value1, out int value2) : {0}"
625 + " base(value1, value2) {{{0}"
627 + "}}{0}", writer.NewLine), Code);
631 public void ChainedConstructorSingleArg ()
635 CodeConstructor ctor = new CodeConstructor ();
636 ctor.Name = "Something";
637 ctor.Attributes = MemberAttributes.Public;
640 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
641 typeof (object), "value1");
642 ctor.Parameters.Add (param);
645 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
646 param.Direction = FieldDirection.Out;
647 ctor.Parameters.Add (param);
650 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
652 type.Members.Add (ctor);
655 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
656 "public class Test1 {{{0}"
658 + " public Test1(object value1, out int value2) : {0}"
659 + " this(value1) {{{0}"
661 + "}}{0}", writer.NewLine), Code);
665 public void ChainedConstructorMultipleArgs ()
669 CodeConstructor ctor = new CodeConstructor ();
670 ctor.Name = "Something";
671 ctor.Attributes = MemberAttributes.Public;
674 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
675 typeof (object), "value1");
676 ctor.Parameters.Add (param);
679 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
680 param.Direction = FieldDirection.Out;
681 ctor.Parameters.Add (param);
684 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
685 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
687 type.Members.Add (ctor);
690 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
691 "public class Test1 {{{0}"
693 + " public Test1(object value1, out int value2) : {0}"
694 + " this(value1, value2) {{{0}"
696 + "}}{0}", writer.NewLine), Code);
700 public void BaseAndChainedConstructorArg ()
704 CodeConstructor ctor = new CodeConstructor ();
705 ctor.Name = "Something";
706 ctor.Attributes = MemberAttributes.Public;
709 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
710 typeof (object), "value1");
711 ctor.Parameters.Add (param);
714 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
715 param.Direction = FieldDirection.Out;
716 ctor.Parameters.Add (param);
719 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
722 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
723 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
725 type.Members.Add (ctor);
728 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
729 "public class Test1 {{{0}"
731 + " public Test1(object value1, out int value2) : {0}"
732 + " base(value1) : {0}"
733 + " this(value1, value2) {{{0}"
735 + "}}{0}", writer.NewLine), Code);
740 public void ReferencedTest ()
742 codeUnit.ReferencedAssemblies.Add ("System.dll");
744 Assertion.AssertEquals ("", Code);