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 Assert.AreEqual ("public class {\n}\n", Code);
51 [ExpectedException (typeof (NullReferenceException))]
52 public void NullTypeTest ()
59 public void SimpleTypeTest ()
63 Assert.AreEqual (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 Assert.AreEqual (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 | MemberAttributes.Override
123 | MemberAttributes.Static | MemberAttributes.Abstract |
124 MemberAttributes.New;
125 evt.Type = new CodeTypeReference (typeof (int));
126 // C# does not support Implementation Types, so this should be ignored
127 evt.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
128 type.Members.Add (evt);
131 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
132 "public class Test1 {{{0}"
134 + " public event int OnClick;{0}"
135 + "}}{0}", writer.NewLine), Code);
139 public void EventImplementationTypes ()
143 CodeMemberEvent evt = new CodeMemberEvent ();
145 evt.Attributes = MemberAttributes.FamilyAndAssembly;
146 evt.Type = new CodeTypeReference (typeof (int));
147 evt.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
148 evt.ImplementationTypes.Add (new CodeTypeReference ("IWhatever"));
149 type.Members.Add (evt);
152 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
153 "public class Test1 {{{0}"
156 + " internal event int Click;{0}"
158 + " /*FamANDAssem*/ internal event int Click;{0}"
160 + "}}{0}", writer.NewLine), Code);
164 /// Ensure no access modifiers are output if PrivateImplementationType
168 public void EventPrivateImplementationType ()
172 CodeMemberEvent evt = new CodeMemberEvent ();
174 evt.Attributes = MemberAttributes.Family | MemberAttributes.Overloaded;
175 evt.Type = new CodeTypeReference (typeof (int));
176 evt.PrivateImplementationType = new CodeTypeReference (typeof (int));
177 type.Members.Add (evt);
180 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
181 "public class Test1 {{{0}"
183 + " event int System.Int32.Click;{0}"
184 + "}}{0}", writer.NewLine), Code);
188 public void EventImplementationTypeOrder ()
192 CodeMemberEvent evt = new CodeMemberEvent ();
194 evt.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
195 evt.Type = new CodeTypeReference (typeof (int));
196 evt.PrivateImplementationType = new CodeTypeReference (typeof (int));
197 evt.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
198 type.Members.Add (evt);
201 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
202 "public class Test1 {{{0}"
204 + " event int System.Int32.Click;{0}"
205 + "}}{0}", writer.NewLine), Code);
209 public void FieldMembersTypeTest1 ()
213 CodeMemberField fld = new CodeMemberField ();
215 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
217 fld.CustomAttributes.Add (attrDec);
219 attrDec = new CodeAttributeDeclaration ();
221 fld.CustomAttributes.Add (attrDec);
223 type.Members.Add (fld);
226 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
227 "public class Test1 {{{0}"
231 + " private void ;{0}"
232 + "}}{0}", writer.NewLine), Code);
236 public void FieldMembersTypeTest2 ()
240 CodeMemberField fld = new CodeMemberField ();
242 fld.Attributes = MemberAttributes.Public;
243 fld.Type = new CodeTypeReference (typeof (int));
244 type.Members.Add (fld);
247 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
248 "public class Test1 {{{0}"
250 + " public int Name;{0}"
251 + "}}{0}", writer.NewLine), Code);
255 public void PropertyMembersTypeTest1 ()
259 CodeMemberProperty property = new CodeMemberProperty ();
261 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
263 property.CustomAttributes.Add (attrDec);
265 attrDec = new CodeAttributeDeclaration ();
267 property.CustomAttributes.Add (attrDec);
269 type.Members.Add (property);
272 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
273 "public class Test1 {{{0}"
277 + " private void {{{0}"
279 + "}}{0}", writer.NewLine), Code);
283 public void PropertyMembersTypeTest2 ()
287 CodeMemberProperty property = new CodeMemberProperty ();
288 property.Name = "Name";
289 property.Attributes = MemberAttributes.Public;
290 property.Type = new CodeTypeReference (typeof (int));
291 // C# does not support Implementation Types, so this should be ignored
292 property.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
293 type.Members.Add (property);
296 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
297 "public class Test1 {{{0}"
299 + " public virtual int Name {{{0}"
301 + "}}{0}", writer.NewLine), Code);
305 public void PropertyMembersTypeGetOnly ()
309 CodeMemberProperty property = new CodeMemberProperty ();
310 property.Name = "Name";
311 property.Attributes = MemberAttributes.Family;
312 property.HasGet = true;
313 property.Type = new CodeTypeReference (typeof (int));
314 type.Members.Add (property);
317 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
318 "public class Test1 {{{0}"
320 + " protected virtual int Name {{{0}"
324 + "}}{0}", writer.NewLine), Code);
328 public void PropertyMembersTypeSetOnly ()
332 CodeMemberProperty property = new CodeMemberProperty ();
333 property.Name = "Name";
334 property.Attributes = MemberAttributes.FamilyOrAssembly;
335 property.HasSet = true;
336 property.Type = new CodeTypeReference (typeof (int));
337 type.Members.Add (property);
340 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
341 "public class Test1 {{{0}"
343 + " protected internal int Name {{{0}"
347 + "}}{0}", writer.NewLine), Code);
351 public void PropertyMembersTypeGetSet ()
355 CodeMemberProperty property = new CodeMemberProperty ();
356 property.Name = "Name";
357 property.Attributes = MemberAttributes.Assembly;
358 property.HasGet = true;
359 property.HasSet = true;
360 property.Type = new CodeTypeReference (typeof (int));
361 type.Members.Add (property);
364 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
365 "public class Test1 {{{0}"
368 + " internal virtual int Name {{{0}"
370 + " internal int Name {{{0}"
377 + "}}{0}", writer.NewLine), Code);
381 public void PropertyMembersTypeFamilyAndAssembly ()
385 CodeMemberProperty property = new CodeMemberProperty ();
386 property.Name = "Name";
387 property.Attributes = MemberAttributes.FamilyAndAssembly;
388 property.Type = new CodeTypeReference (typeof (int));
390 type.Members.Add (property);
393 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
394 "public class Test1 {{{0}"
397 + " internal int Name {{{0}"
399 + " /*FamANDAssem*/ internal int Name {{{0}"
402 + "}}{0}", writer.NewLine), Code);
406 /// C# CodeDOM does not output parameters for properties that aren't
410 public void PropertyParametersTest ()
414 CodeMemberProperty property = new CodeMemberProperty ();
415 property.Name = "Name";
416 property.Attributes = MemberAttributes.Public;
417 property.Type = new CodeTypeReference (typeof (int));
419 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
420 typeof (object), "value1");
421 property.Parameters.Add (param);
423 param = new CodeParameterDeclarationExpression (
424 typeof (int), "value2");
425 param.Direction = FieldDirection.Ref;
426 property.Parameters.Add (param);
428 type.Members.Add (property);
431 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
432 "public class Test1 {{{0}"
434 + " public virtual int Name {{{0}"
436 + "}}{0}", writer.NewLine), Code);
440 public void PropertyIndexerTest1 ()
444 CodeMemberProperty property = new CodeMemberProperty ();
445 // ensure case-insensitive comparison is done on name of property
446 property.Name = "iTem";
447 property.Attributes = MemberAttributes.Public;
448 property.Type = new CodeTypeReference (typeof (int));
450 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
451 typeof (object), "value1");
452 property.Parameters.Add (param);
454 param = new CodeParameterDeclarationExpression (
455 typeof (int), "value2");
456 param.Direction = FieldDirection.Ref;
457 property.Parameters.Add (param);
459 type.Members.Add (property);
462 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
463 "public class Test1 {{{0}"
465 + " public virtual int this[object value1, ref int value2] {{{0}"
467 + "}}{0}", writer.NewLine), Code);
471 /// Ensures indexer code is only output if property is named "Item"
472 /// (case-insensitive comparison) AND parameters are defined.
475 public void PropertyIndexerTest2 ()
479 CodeMemberProperty property = new CodeMemberProperty ();
480 // ensure case-insensitive comparison is done on name of property
481 property.Name = "iTem";
482 property.Attributes = MemberAttributes.Public;
483 property.Type = new CodeTypeReference (typeof (int));
484 type.Members.Add (property);
487 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
488 "public class Test1 {{{0}"
490 + " public virtual int iTem {{{0}"
492 + "}}{0}", writer.NewLine), Code);
496 public void PropertyIndexerGetOnly ()
500 CodeMemberProperty property = new CodeMemberProperty ();
501 // ensure case-insensitive comparison is done on name of property
502 property.Name = "iTem";
503 property.Attributes = MemberAttributes.Family;
504 property.HasGet = true;
505 property.Type = new CodeTypeReference (typeof (int));
507 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
508 typeof (object), "value1");
509 property.Parameters.Add (param);
511 type.Members.Add (property);
514 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
515 "public class Test1 {{{0}"
517 + " protected virtual int this[object value1] {{{0}"
521 + "}}{0}", writer.NewLine), Code);
525 public void PropertyIndexerSetOnly ()
529 CodeMemberProperty property = new CodeMemberProperty ();
530 // ensure case-insensitive comparison is done on name of property
531 property.Name = "iTem";
532 property.Attributes = MemberAttributes.Family;
533 property.HasSet = true;
534 property.Type = new CodeTypeReference (typeof (int));
536 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
537 typeof (object), "value1");
538 property.Parameters.Add (param);
540 type.Members.Add (property);
543 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
544 "public class Test1 {{{0}"
546 + " protected virtual int this[object value1] {{{0}"
550 + "}}{0}", writer.NewLine), Code);
554 public void PropertyImplementationTypes ()
558 CodeMemberProperty property = new CodeMemberProperty ();
559 property.Name = "Name";
560 property.Attributes = MemberAttributes.Public;
561 property.Type = new CodeTypeReference (typeof (int));
562 property.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
563 property.ImplementationTypes.Add (new CodeTypeReference ("IWhatever"));
564 type.Members.Add (property);
567 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
568 "public class Test1 {{{0}"
570 + " public virtual int Name {{{0}"
572 + "}}{0}", writer.NewLine), Code);
576 public void PropertyOverloadsTest1 ()
580 CodeMemberProperty property = new CodeMemberProperty ();
581 property.Name = "Name";
582 property.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
583 property.Type = new CodeTypeReference (typeof (int));
584 type.Members.Add (property);
587 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
588 "public class Test1 {{{0}"
590 + " public virtual int Name {{{0}"
592 + "}}{0}", writer.NewLine), Code);
596 public void PropertyOverloadsTest2 ()
600 CodeMemberProperty property = new CodeMemberProperty ();
601 property.Name = "Name";
602 property.Attributes = MemberAttributes.Public;
603 property.Type = new CodeTypeReference (typeof (int));
604 type.Members.Add (property);
606 property = new CodeMemberProperty ();
607 property.Name = "Name";
608 property.Attributes = MemberAttributes.Private;
609 property.Type = new CodeTypeReference (typeof (int));
610 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
611 typeof (object), "value1");
612 property.Parameters.Add (param);
613 type.Members.Add (property);
616 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
617 "public class Test1 {{{0}"
619 + " public virtual int Name {{{0}"
622 + " private int Name {{{0}"
624 + "}}{0}", writer.NewLine), Code);
628 public void PropertyOverloadsTest3 ()
632 CodeMemberProperty property = new CodeMemberProperty ();
633 property.Name = "Name";
634 property.Attributes = MemberAttributes.Public;
635 property.Type = new CodeTypeReference (typeof (int));
636 type.Members.Add (property);
638 property = new CodeMemberProperty ();
639 property.Name = "Name";
640 property.Attributes = MemberAttributes.Private;
641 property.Type = new CodeTypeReference (typeof (int));
642 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
643 typeof (object), "value1");
644 property.Parameters.Add (param);
645 property.PrivateImplementationType = new CodeTypeReference (typeof (int));
646 type.Members.Add (property);
649 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
650 "public class Test1 {{{0}"
652 + " public virtual int Name {{{0}"
655 + " int System.Int32.Name {{{0}"
657 + "}}{0}", writer.NewLine), Code);
661 /// Ensure no access modifiers are output if PrivateImplementationType
665 public void PropertyPrivateImplementationType ()
669 CodeMemberProperty property = new CodeMemberProperty ();
670 property.Name = "Item";
671 property.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
672 property.Type = new CodeTypeReference (typeof (int));
673 property.PrivateImplementationType = new CodeTypeReference (typeof (int));
674 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
675 typeof (object), "value1");
676 property.Parameters.Add (param);
677 type.Members.Add (property);
680 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
681 "public class Test1 {{{0}"
683 + " int System.Int32.this[object value1] {{{0}"
685 + "}}{0}", writer.NewLine), Code);
689 public void PropertyImplementationTypeOrder ()
693 CodeMemberProperty property = new CodeMemberProperty ();
694 property.Name = "Item";
695 property.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
696 property.Type = new CodeTypeReference (typeof (int));
697 property.PrivateImplementationType = new CodeTypeReference (typeof (int));
698 property.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
699 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
700 typeof (object), "value1");
701 property.Parameters.Add (param);
702 type.Members.Add (property);
705 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
706 "public class Test1 {{{0}"
708 + " int System.Int32.this[object value1] {{{0}"
710 + "}}{0}", writer.NewLine), Code);
714 public void MethodMembersTypeTest1 ()
718 CodeMemberMethod method = new CodeMemberMethod ();
720 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
722 method.CustomAttributes.Add (attrDec);
724 attrDec = new CodeAttributeDeclaration ();
726 method.CustomAttributes.Add (attrDec);
728 // C# does not support Implementation Types, so this should be ignored
729 method.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
731 type.Members.Add (method);
734 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
735 "public class Test1 {{{0}"
739 + " private void () {{{0}"
741 + "}}{0}", writer.NewLine), Code);
745 public void MethodMembersTypeTest2 ()
749 CodeMemberMethod method = new CodeMemberMethod ();
750 method.Name = "Something";
751 method.Attributes = MemberAttributes.Public;
752 method.ReturnType = new CodeTypeReference (typeof (int));
754 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
755 typeof (object), "value1");
756 method.Parameters.Add (param);
758 param = new CodeParameterDeclarationExpression (
759 typeof (object), "value2");
760 param.Direction = FieldDirection.In;
761 method.Parameters.Add (param);
763 param = new CodeParameterDeclarationExpression (typeof (int), "index");
764 param.Direction = FieldDirection.Out;
765 method.Parameters.Add (param);
767 param = new CodeParameterDeclarationExpression (typeof (int), "count");
768 param.Direction = FieldDirection.Ref;
769 method.Parameters.Add (param);
771 type.Members.Add (method);
774 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
775 "public class Test1 {{{0}"
777 + " public virtual int Something(object value1, object value2, out int index, ref int count) {{{0}"
779 + "}}{0}", writer.NewLine), Code);
783 public void MethodMembersTypeTest3 ()
787 CodeMemberMethod method = new CodeMemberMethod ();
788 method.Name = "Something";
789 method.Attributes = MemberAttributes.Public;
790 method.ReturnType = new CodeTypeReference (typeof (int));
793 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
794 typeof (object), "value");
795 method.Parameters.Add (param);
797 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
799 param.CustomAttributes.Add (attrDec);
801 attrDec = new CodeAttributeDeclaration ();
803 param.CustomAttributes.Add (attrDec);
806 param = new CodeParameterDeclarationExpression (typeof (int), "index");
807 param.Direction = FieldDirection.Out;
808 method.Parameters.Add (param);
810 attrDec = new CodeAttributeDeclaration ();
812 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
813 new CodePrimitiveExpression (false)));
814 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
815 new CodePrimitiveExpression (true)));
816 param.CustomAttributes.Add (attrDec);
818 attrDec = new CodeAttributeDeclaration ();
820 param.CustomAttributes.Add (attrDec);
822 type.Members.Add (method);
825 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
826 "public class Test1 {{{0}"
828 + " public virtual int Something([A()] [B()] object value, [C(A1=false, A2=true)] [D()] out int index) {{{0}"
830 + "}}{0}", writer.NewLine), Code);
834 public void MethodImplementationTypes ()
838 CodeMemberMethod method = new CodeMemberMethod ();
839 method.Name = "Execute";
840 method.Attributes = MemberAttributes.Assembly;
841 method.ReturnType = new CodeTypeReference (typeof (int));
842 method.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
843 method.ImplementationTypes.Add (new CodeTypeReference ("IWhatever"));
844 type.Members.Add (method);
847 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
848 "public class Test1 {{{0}"
851 + " internal virtual int Execute() {{{0}"
853 + " internal int Execute() {{{0}"
856 + "}}{0}", writer.NewLine), Code);
860 public void MethodOverloadsTest1 ()
864 CodeMemberMethod method = new CodeMemberMethod ();
865 method.Name = "Execute";
866 method.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
867 method.ReturnType = new CodeTypeReference (typeof (int));
868 type.Members.Add (method);
871 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
872 "public class Test1 {{{0}"
874 + " public virtual int Execute() {{{0}"
876 + "}}{0}", writer.NewLine), Code);
880 public void MethodOverloadsTest2 ()
884 CodeMemberMethod method = new CodeMemberMethod ();
885 method.Name = "Execute";
886 method.Attributes = MemberAttributes.Public;
887 type.Members.Add (method);
889 method = new CodeMemberMethod ();
890 method.Name = "Execute";
891 method.Attributes = MemberAttributes.Private;
892 method.ReturnType = new CodeTypeReference (typeof (int));
893 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
894 typeof (object), "value1");
895 method.Parameters.Add (param);
896 type.Members.Add (method);
899 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
900 "public class Test1 {{{0}"
902 + " public virtual void Execute() {{{0}"
905 + " private int Execute(object value1) {{{0}"
907 + "}}{0}", writer.NewLine), Code);
911 public void MethodOverloadsTest3 ()
915 CodeMemberMethod method = new CodeMemberMethod ();
916 method.Name = "Execute";
917 method.Attributes = MemberAttributes.Public;
918 type.Members.Add (method);
920 method = new CodeMemberMethod ();
921 method.Name = "Execute";
922 method.Attributes = MemberAttributes.Private;
923 method.ReturnType = new CodeTypeReference (typeof (int));
924 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
925 typeof (object), "value1");
926 method.Parameters.Add (param);
927 method.PrivateImplementationType = new CodeTypeReference (typeof (int));
928 type.Members.Add (method);
931 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
932 "public class Test1 {{{0}"
934 + " public virtual void Execute() {{{0}"
937 + " int System.Int32.Execute(object value1) {{{0}"
939 + "}}{0}", writer.NewLine), Code);
943 /// Ensure no access modifiers are output if PrivateImplementationType
947 public void MethodPrivateImplementationType ()
951 CodeMemberMethod method = new CodeMemberMethod ();
952 method.Name = "Execute";
953 method.Attributes = MemberAttributes.Public | MemberAttributes.Overloaded;
954 method.ReturnType = new CodeTypeReference (typeof (int));
955 method.PrivateImplementationType = new CodeTypeReference (typeof (int));
956 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
957 typeof (object), "value1");
958 method.Parameters.Add (param);
959 type.Members.Add (method);
962 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
963 "public class Test1 {{{0}"
965 + " int System.Int32.Execute(object value1) {{{0}"
967 + "}}{0}", writer.NewLine), Code);
971 public void MethodImplementationTypeOrder ()
975 CodeMemberMethod method = new CodeMemberMethod ();
976 method.Name = "Execute";
977 method.Attributes = MemberAttributes.Public;
978 method.ReturnType = new CodeTypeReference (typeof (int));
979 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
980 typeof (object), "value1");
981 method.Parameters.Add (param);
982 method.PrivateImplementationType = new CodeTypeReference (typeof (int));
983 method.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
984 type.Members.Add (method);
987 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
988 "public class Test1 {{{0}"
990 + " int System.Int32.Execute(object value1) {{{0}"
992 + "}}{0}", writer.NewLine), Code);
996 public void MethodReturnTypeAttributes ()
1000 CodeMemberMethod method = new CodeMemberMethod ();
1001 method.Name = "Execute";
1002 method.Attributes = MemberAttributes.Public;
1003 method.ReturnType = new CodeTypeReference (typeof (int));
1004 type.Members.Add (method);
1006 // method custom attributes
1007 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
1009 method.CustomAttributes.Add (attrDec);
1011 attrDec = new CodeAttributeDeclaration ();
1013 method.CustomAttributes.Add (attrDec);
1015 // return type custom attributes
1016 attrDec = new CodeAttributeDeclaration ();
1018 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
1019 new CodePrimitiveExpression (false)));
1020 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
1021 new CodePrimitiveExpression (true)));
1022 method.ReturnTypeCustomAttributes.Add (attrDec);
1024 attrDec = new CodeAttributeDeclaration ();
1026 method.ReturnTypeCustomAttributes.Add (attrDec);
1029 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1030 "public class Test1 {{{0}"
1034 + " [return: C(A1=false, A2=true)]{0}"
1035 + " [return: D()]{0}"
1036 + " public virtual int Execute() {{{0}"
1038 + "}}{0}", writer.NewLine), Code);
1042 public void ConstructorAttributesTest ()
1044 type.Name = "Test1";
1046 CodeConstructor ctor = new CodeConstructor ();
1048 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
1050 ctor.CustomAttributes.Add (attrDec);
1052 attrDec = new CodeAttributeDeclaration ();
1054 ctor.CustomAttributes.Add (attrDec);
1056 // C# does not support Implementation Types, so this should be ignored
1057 ctor.ImplementationTypes.Add (new CodeTypeReference ("IPolicy"));
1059 type.Members.Add (ctor);
1062 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1063 "public class Test1 {{{0}"
1067 + " private Test1() {{{0}"
1069 + "}}{0}", writer.NewLine), Code);
1073 public void ConstructorParametersTest ()
1075 type.Name = "Test1";
1077 CodeConstructor ctor = new CodeConstructor ();
1078 ctor.Name = "Whatever";
1079 ctor.Attributes = MemberAttributes.Public;
1081 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1082 typeof (object), "value1");
1083 ctor.Parameters.Add (param);
1085 param = new CodeParameterDeclarationExpression (
1086 typeof (object), "value2");
1087 param.Direction = FieldDirection.In;
1088 ctor.Parameters.Add (param);
1090 param = new CodeParameterDeclarationExpression (typeof (int), "index");
1091 param.Direction = FieldDirection.Out;
1092 ctor.Parameters.Add (param);
1094 param = new CodeParameterDeclarationExpression (typeof (int), "count");
1095 param.Direction = FieldDirection.Ref;
1096 ctor.Parameters.Add (param);
1098 type.Members.Add (ctor);
1101 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1102 "public class Test1 {{{0}"
1104 + " public Test1(object value1, object value2, out int index, ref int count) {{{0}"
1106 + "}}{0}", writer.NewLine), Code);
1110 public void ConstructorParameterAttributesTest ()
1112 type.Name = "Test1";
1114 CodeConstructor ctor = new CodeConstructor ();
1115 ctor.Name = "Something";
1116 ctor.Attributes = MemberAttributes.Public;
1119 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1120 typeof (object), "value");
1121 ctor.Parameters.Add (param);
1123 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
1125 param.CustomAttributes.Add (attrDec);
1127 attrDec = new CodeAttributeDeclaration ();
1129 param.CustomAttributes.Add (attrDec);
1132 param = new CodeParameterDeclarationExpression (typeof (int), "index");
1133 param.Direction = FieldDirection.Out;
1134 ctor.Parameters.Add (param);
1136 attrDec = new CodeAttributeDeclaration ();
1138 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
1139 new CodePrimitiveExpression (false)));
1140 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
1141 new CodePrimitiveExpression (true)));
1142 param.CustomAttributes.Add (attrDec);
1144 attrDec = new CodeAttributeDeclaration ();
1146 param.CustomAttributes.Add (attrDec);
1148 type.Members.Add (ctor);
1151 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1152 "public class Test1 {{{0}"
1154 + " public Test1([A()] [B()] object value, [C(A1=false, A2=true)] [D()] out int index) {{{0}"
1156 + "}}{0}", writer.NewLine), Code);
1160 public void BaseConstructorSingleArg ()
1162 type.Name = "Test1";
1164 CodeConstructor ctor = new CodeConstructor ();
1165 ctor.Name = "Something";
1166 ctor.Attributes = MemberAttributes.Public;
1169 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1170 typeof (object), "value1");
1171 ctor.Parameters.Add (param);
1174 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
1175 param.Direction = FieldDirection.Out;
1176 ctor.Parameters.Add (param);
1179 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1181 type.Members.Add (ctor);
1184 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1185 "public class Test1 {{{0}"
1187 + " public Test1(object value1, out int value2) : {0}"
1188 + " base(value1) {{{0}"
1190 + "}}{0}", writer.NewLine), Code);
1194 public void BaseConstructorMultipleArgs ()
1196 type.Name = "Test1";
1198 CodeConstructor ctor = new CodeConstructor ();
1199 ctor.Name = "Something";
1200 ctor.Attributes = MemberAttributes.Public;
1203 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1204 typeof (object), "value1");
1205 ctor.Parameters.Add (param);
1208 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
1209 param.Direction = FieldDirection.Out;
1210 ctor.Parameters.Add (param);
1213 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1214 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
1216 type.Members.Add (ctor);
1219 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1220 "public class Test1 {{{0}"
1222 + " public Test1(object value1, out int value2) : {0}"
1223 + " base(value1, value2) {{{0}"
1225 + "}}{0}", writer.NewLine), Code);
1229 public void ChainedConstructorSingleArg ()
1231 type.Name = "Test1";
1233 CodeConstructor ctor = new CodeConstructor ();
1234 ctor.Name = "Something";
1235 ctor.Attributes = MemberAttributes.Public;
1238 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1239 typeof (object), "value1");
1240 ctor.Parameters.Add (param);
1243 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
1244 param.Direction = FieldDirection.Out;
1245 ctor.Parameters.Add (param);
1247 // chained ctor args
1248 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1250 type.Members.Add (ctor);
1253 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1254 "public class Test1 {{{0}"
1256 + " public Test1(object value1, out int value2) : {0}"
1257 + " this(value1) {{{0}"
1259 + "}}{0}", writer.NewLine), Code);
1263 public void ChainedConstructorMultipleArgs ()
1265 type.Name = "Test1";
1267 CodeConstructor ctor = new CodeConstructor ();
1268 ctor.Name = "Something";
1269 ctor.Attributes = MemberAttributes.Public;
1272 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1273 typeof (object), "value1");
1274 ctor.Parameters.Add (param);
1277 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
1278 param.Direction = FieldDirection.Out;
1279 ctor.Parameters.Add (param);
1281 // chained ctor args
1282 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1283 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
1285 type.Members.Add (ctor);
1288 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1289 "public class Test1 {{{0}"
1291 + " public Test1(object value1, out int value2) : {0}"
1292 + " this(value1, value2) {{{0}"
1294 + "}}{0}", writer.NewLine), Code);
1298 public void BaseAndChainedConstructorArg ()
1300 type.Name = "Test1";
1302 CodeConstructor ctor = new CodeConstructor ();
1303 ctor.Name = "Something";
1304 ctor.Attributes = MemberAttributes.Public;
1307 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
1308 typeof (object), "value1");
1309 ctor.Parameters.Add (param);
1312 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
1313 param.Direction = FieldDirection.Out;
1314 ctor.Parameters.Add (param);
1317 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1319 // chained ctor args
1320 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
1321 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
1323 type.Members.Add (ctor);
1326 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
1327 "public class Test1 {{{0}"
1329 + " public Test1(object value1, out int value2) : {0}"
1330 + " base(value1) : {0}"
1331 + " this(value1, value2) {{{0}"
1333 + "}}{0}", writer.NewLine), Code);
1338 public void ReferencedTest ()
1340 codeUnit.ReferencedAssemblies.Add ("System.dll");
1342 Assertion.AssertEquals ("", Code);