2 // Microsoft.VisualBasic.* Test Cases
5 // Gert Driesen (drieseng@users.sourceforge.net)
10 using System.Globalization;
13 using System.CodeDom.Compiler;
15 using NUnit.Framework;
17 namespace MonoTests.Microsoft.VisualBasic
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 (string.Format (CultureInfo.InvariantCulture,
48 "Public Class {0}End Class{0}", writer.NewLine), Code);
52 [ExpectedException (typeof (NullReferenceException))]
53 public void NullTypeTest ()
60 public void SimpleTypeTest ()
64 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
65 "Public Class Test1{0}End Class{0}", writer.NewLine), Code);
69 public void AttributesAndTypeTest ()
73 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
75 type.CustomAttributes.Add (attrDec);
77 attrDec = new CodeAttributeDeclaration ();
79 type.CustomAttributes.Add (attrDec);
82 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
83 "<A(), _{0} B()> _{0}Public Class Test1{0}End Class{0}",
84 writer.NewLine), Code);
88 public void EventMembersTypeTest1 ()
92 CodeMemberEvent evt = new CodeMemberEvent ();
94 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
96 evt.CustomAttributes.Add (attrDec);
98 attrDec = new CodeAttributeDeclaration ();
100 evt.CustomAttributes.Add (attrDec);
102 type.Members.Add (evt);
105 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
106 "Public Class Test1{0} {0} <A(), _{0} B()> _{0} "
107 + "Private Event As System.Void{0}End Class{0}", writer.NewLine), Code);
111 public void EventMembersTypeTest2 ()
115 CodeMemberEvent evt = new CodeMemberEvent ();
116 evt.Name = "OnClick";
117 evt.Attributes = MemberAttributes.Public;
118 evt.Type = new CodeTypeReference(typeof (int));
119 type.Members.Add (evt);
122 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
123 "Public Class Test1{0} {0} "
124 + "Public Event OnClick As Integer{0}"
125 + "End Class{0}", writer.NewLine), Code);
129 public void FieldMembersTypeTest1 ()
133 CodeMemberField fld = new CodeMemberField ();
135 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
137 fld.CustomAttributes.Add (attrDec);
139 attrDec = new CodeAttributeDeclaration ();
141 fld.CustomAttributes.Add (attrDec);
143 type.Members.Add (fld);
146 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
147 "Public Class Test1{0} {0} <A(), _{0} B()> _{0} "
148 + "Private As System.Void{0}End Class{0}", writer.NewLine), Code);
152 public void FieldMembersTypeTest2 ()
156 CodeMemberField fld = new CodeMemberField ();
158 fld.Attributes = MemberAttributes.Public;
159 fld.Type = new CodeTypeReference (typeof (int));
160 type.Members.Add (fld);
163 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
164 "Public Class Test1{0} {0} "
165 + "Public Name As Integer{0}"
166 + "End Class{0}", writer.NewLine), Code);
170 public void PropertyMembersTypeTest1 ()
174 CodeMemberProperty property = new CodeMemberProperty ();
176 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
178 property.CustomAttributes.Add (attrDec);
180 attrDec = new CodeAttributeDeclaration ();
182 property.CustomAttributes.Add (attrDec);
184 type.Members.Add (property);
187 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
188 "Public Class Test1{0}"
193 + " Private Property () As System.Void{0}"
195 + " Private Property As System.Void{0}"
198 + "End Class{0}", writer.NewLine), Code);
202 public void PropertyMembersTypeTest2 ()
206 CodeMemberProperty property = new CodeMemberProperty ();
207 property.Name = "Name";
208 property.Attributes = MemberAttributes.Public;
209 property.Type = new CodeTypeReference (typeof (int));
210 type.Members.Add (property);
213 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
214 "Public Class Test1{0}"
217 + " Public Overridable Property Name() As Integer{0}"
219 + " Public Overridable Property Name As Integer{0}"
222 + "End Class{0}", writer.NewLine), Code);
226 public void PropertyMembersTypeGetOnly ()
230 CodeMemberProperty property = new CodeMemberProperty ();
231 property.Name = "Name";
232 property.Attributes = MemberAttributes.Family;
233 property.HasGet = true;
234 property.Type = new CodeTypeReference (typeof (int));
235 type.Members.Add (property);
238 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
239 "Public Class Test1{0}"
242 + " Protected Overridable ReadOnly Property Name() As Integer{0}"
244 + " Protected Overridable ReadOnly Property Name As Integer{0}"
249 + "End Class{0}", writer.NewLine), Code);
253 public void PropertyMembersTypeSetOnly ()
257 CodeMemberProperty property = new CodeMemberProperty ();
258 property.Name = "Name";
259 property.Attributes = MemberAttributes.FamilyAndAssembly;
260 property.HasSet = true;
261 property.Type = new CodeTypeReference (typeof (int));
262 type.Members.Add (property);
265 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
266 "Public Class Test1{0}"
269 + " Friend WriteOnly Property Name() As Integer{0}"
271 + " Friend WriteOnly Property Name As Integer{0}"
276 + "End Class{0}", writer.NewLine), Code);
280 public void PropertyMembersTypeGetSet ()
284 CodeMemberProperty property = new CodeMemberProperty ();
285 property.Name = "Name";
286 property.Attributes = MemberAttributes.Family;
287 property.HasGet = true;
288 property.HasSet = true;
289 property.Type = new CodeTypeReference (typeof (int));
290 type.Members.Add (property);
293 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
294 "Public Class Test1{0}"
297 + " Protected Overridable Property Name() As Integer{0}"
299 + " Protected Overridable Property Name As Integer{0}"
306 + "End Class{0}", writer.NewLine), Code);
310 // A bug in MS.NET 1.x causes MemberAttributes.FamilyOrAssembly to be
311 // generated as Protected
312 [Category("NotDotNet")]
315 public void PropertyMembersTypeFamilyOrAssembly ()
319 CodeMemberProperty property = new CodeMemberProperty ();
320 property.Name = "Name";
321 property.Attributes = MemberAttributes.FamilyOrAssembly;
322 property.Type = new CodeTypeReference (typeof (int));
324 type.Members.Add (property);
327 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
328 "Public Class Test1{0}"
331 + " Protected Friend Property Name() As Integer{0}"
333 + " Protected Friend Property Name As Integer{0}"
336 + "End Class{0}", writer.NewLine), Code);
340 // A bug in MS.NET 1.x causes MemberAttributes.Assembly to be generated
342 [Category ("NotDotNet")]
345 public void PropertyMembersTypeAssembly ()
349 CodeMemberProperty property = new CodeMemberProperty ();
350 property.Name = "Name";
351 property.Attributes = MemberAttributes.Assembly;
352 property.Type = new CodeTypeReference (typeof (int));
354 type.Members.Add (property);
357 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
358 "Public Class Test1{0}"
361 + " Friend Overridable Property Name() As Integer{0}"
363 + " Friend Property Name As Integer{0}"
366 + "End Class{0}", writer.NewLine), Code);
370 /// Apparently VB.NET CodeDOM also allows properties that aren't indexers
371 /// to have parameters.
374 public void PropertyParametersTest ()
378 CodeMemberProperty property = new CodeMemberProperty ();
379 property.Name = "Name";
380 property.Attributes = MemberAttributes.Public;
381 property.Type = new CodeTypeReference (typeof (int));
383 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
384 typeof (object), "value1");
385 property.Parameters.Add (param);
387 param = new CodeParameterDeclarationExpression (
388 typeof (int), "value2");
389 param.Direction = FieldDirection.Ref;
390 property.Parameters.Add (param);
392 type.Members.Add (property);
395 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
396 "Public Class Test1{0}"
398 + " Public Overridable Property Name(ByVal value1 As Object, ByRef value2 As Integer) As Integer{0}"
400 + "End Class{0}", writer.NewLine), Code);
404 public void PropertyIndexerTest1 ()
408 CodeMemberProperty property = new CodeMemberProperty ();
409 // ensure case-insensitive comparison is done on name of property
410 property.Name = "iTem";
411 property.Attributes = MemberAttributes.Public;
412 property.Type = new CodeTypeReference (typeof (int));
414 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
415 typeof (object), "value1");
416 property.Parameters.Add (param);
418 param = new CodeParameterDeclarationExpression (
419 typeof (int), "value2");
420 param.Direction = FieldDirection.Ref;
421 property.Parameters.Add (param);
423 type.Members.Add (property);
426 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
427 "Public Class Test1{0}"
429 + " Public Overridable Default Property iTem(ByVal value1 As Object, ByRef value2 As Integer) As Integer{0}"
431 + "End Class{0}", writer.NewLine), Code);
435 /// Ensures Default keyword is only output if property is named "Item"
436 /// (case-insensitive comparison) AND parameters are defined.
439 public void PropertyIndexerTest2 ()
443 CodeMemberProperty property = new CodeMemberProperty ();
444 // ensure case-insensitive comparison is done on name of property
445 property.Name = "iTem";
446 property.Attributes = MemberAttributes.Public;
447 property.Type = new CodeTypeReference (typeof (int));
448 type.Members.Add (property);
451 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
452 "Public Class Test1{0}"
455 + " Public Overridable Property iTem() As Integer{0}"
457 + " Public Overridable Property iTem As Integer{0}"
460 + "End Class{0}", writer.NewLine), Code);
464 public void MethodMembersTypeTest1 ()
468 CodeMemberMethod method = new CodeMemberMethod ();
470 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
472 method.CustomAttributes.Add (attrDec);
474 attrDec = new CodeAttributeDeclaration ();
476 method.CustomAttributes.Add (attrDec);
478 type.Members.Add (method);
481 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
482 "Public Class Test1{0}"
486 + " Private Sub (){0}"
488 + "End Class{0}", writer.NewLine), Code);
492 public void MethodMembersTypeTest2 ()
496 CodeMemberMethod method = new CodeMemberMethod ();
497 method.Name = "Something";
498 method.Attributes = MemberAttributes.Public;
499 method.ReturnType = new CodeTypeReference (typeof (int));
501 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
502 typeof(object), "value1");
503 method.Parameters.Add (param);
505 param = new CodeParameterDeclarationExpression (
506 typeof (object), "value2");
507 param.Direction = FieldDirection.In;
508 method.Parameters.Add (param);
510 param = new CodeParameterDeclarationExpression (typeof (int), "index");
511 param.Direction = FieldDirection.Out;
512 method.Parameters.Add (param);
514 param = new CodeParameterDeclarationExpression (typeof (int), "count");
515 param.Direction = FieldDirection.Ref;
516 method.Parameters.Add (param);
518 type.Members.Add (method);
521 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
522 "Public Class Test1{0}"
524 + " Public Overridable Function Something(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer) As Integer{0}"
526 + "End Class{0}", writer.NewLine), Code);
530 public void MethodMembersTypeTest3 ()
534 CodeMemberMethod method = new CodeMemberMethod ();
535 method.Name = "Something";
536 method.Attributes = MemberAttributes.Public;
537 method.ReturnType = new CodeTypeReference (typeof (int));
540 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
541 typeof (object), "value");
542 method.Parameters.Add (param);
544 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
546 param.CustomAttributes.Add (attrDec);
548 attrDec = new CodeAttributeDeclaration ();
550 param.CustomAttributes.Add (attrDec);
554 param = new CodeParameterDeclarationExpression (typeof (int), "index");
555 param.Direction = FieldDirection.Out;
556 method.Parameters.Add (param);
558 attrDec = new CodeAttributeDeclaration ();
560 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
561 new CodePrimitiveExpression (false)));
562 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
563 new CodePrimitiveExpression (true)));
564 param.CustomAttributes.Add (attrDec);
566 attrDec = new CodeAttributeDeclaration ();
568 param.CustomAttributes.Add (attrDec);
570 type.Members.Add (method);
573 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
574 "Public Class Test1{0}"
576 + " Public Overridable Function Something(<A(), B()> ByVal value As Object, <C(A1:=false, A2:=true), D()> ByRef index As Integer) As Integer{0}"
578 + "End Class{0}", writer.NewLine), Code);
582 public void ConstructorAttributesTest ()
586 CodeConstructor ctor = new CodeConstructor ();
588 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
590 ctor.CustomAttributes.Add (attrDec);
592 attrDec = new CodeAttributeDeclaration ();
594 ctor.CustomAttributes.Add (attrDec);
596 type.Members.Add (ctor);
599 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
600 "Public Class Test1{0}"
604 + " Private Sub New(){0}"
607 + "End Class{0}", writer.NewLine), Code);
611 public void ConstructorParametersTest ()
615 CodeConstructor ctor = new CodeConstructor ();
616 ctor.Name = "Whatever";
617 ctor.Attributes = MemberAttributes.Public;
619 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
620 typeof (object), "value1");
621 ctor.Parameters.Add (param);
623 param = new CodeParameterDeclarationExpression (
624 typeof (object), "value2");
625 param.Direction = FieldDirection.In;
626 ctor.Parameters.Add (param);
628 param = new CodeParameterDeclarationExpression (typeof (int), "index");
629 param.Direction = FieldDirection.Out;
630 ctor.Parameters.Add (param);
632 param = new CodeParameterDeclarationExpression (typeof (int), "count");
633 param.Direction = FieldDirection.Ref;
634 ctor.Parameters.Add (param);
636 type.Members.Add (ctor);
639 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
640 "Public Class Test1{0}"
642 + " Public Sub New(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer){0}"
645 + "End Class{0}", writer.NewLine), Code);
649 public void ConstructorParameterAttributesTest ()
653 CodeConstructor ctor = new CodeConstructor ();
654 ctor.Name = "Something";
655 ctor.Attributes = MemberAttributes.Public;
658 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
659 typeof (object), "value");
660 ctor.Parameters.Add (param);
662 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
664 param.CustomAttributes.Add (attrDec);
666 attrDec = new CodeAttributeDeclaration ();
668 param.CustomAttributes.Add (attrDec);
671 param = new CodeParameterDeclarationExpression (typeof (int), "index");
672 param.Direction = FieldDirection.Out;
673 ctor.Parameters.Add (param);
675 attrDec = new CodeAttributeDeclaration ();
677 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
678 new CodePrimitiveExpression (false)));
679 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
680 new CodePrimitiveExpression (true)));
681 param.CustomAttributes.Add (attrDec);
683 attrDec = new CodeAttributeDeclaration ();
685 param.CustomAttributes.Add (attrDec);
687 type.Members.Add (ctor);
690 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
691 "Public Class Test1{0}"
693 + " Public Sub New(<A(), B()> ByVal value As Object, <C(A1:=false, A2:=true), D()> ByRef index As Integer){0}"
696 + "End Class{0}", writer.NewLine), Code);
700 public void BaseConstructorSingleArg ()
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"));
721 type.Members.Add (ctor);
724 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
725 "Public Class Test1{0}"
727 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
728 + " MyBase.New(value1){0}"
730 + "End Class{0}", writer.NewLine), Code);
734 public void BaseConstructorMultipleArgs ()
738 CodeConstructor ctor = new CodeConstructor ();
739 ctor.Name = "Something";
740 ctor.Attributes = MemberAttributes.Public;
743 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
744 typeof (object), "value1");
745 ctor.Parameters.Add (param);
748 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
749 param.Direction = FieldDirection.Out;
750 ctor.Parameters.Add (param);
753 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
754 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
756 type.Members.Add (ctor);
759 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
760 "Public Class Test1{0}"
762 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
763 + " MyBase.New(value1, value2){0}"
765 + "End Class{0}", writer.NewLine), Code);
769 public void ChainedConstructorSingleArg ()
773 CodeConstructor ctor = new CodeConstructor ();
774 ctor.Name = "Something";
775 ctor.Attributes = MemberAttributes.Public;
778 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
779 typeof (object), "value1");
780 ctor.Parameters.Add (param);
783 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
784 param.Direction = FieldDirection.Out;
785 ctor.Parameters.Add (param);
788 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
790 // should be ignored as chained ctor args should take precedence over base
792 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
794 type.Members.Add (ctor);
797 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
798 "Public Class Test1{0}"
800 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
801 + " Me.New(value1){0}"
803 + "End Class{0}", writer.NewLine), Code);
807 public void ChainedConstructorMultipleArgs ()
811 CodeConstructor ctor = new CodeConstructor ();
812 ctor.Name = "Something";
813 ctor.Attributes = MemberAttributes.Public;
816 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
817 typeof (object), "value1");
818 ctor.Parameters.Add (param);
821 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
822 param.Direction = FieldDirection.Out;
823 ctor.Parameters.Add (param);
826 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
827 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
829 // should be ignored as chained ctor args should take precedence over base
831 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
833 type.Members.Add (ctor);
836 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
837 "Public Class Test1{0}"
839 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
840 + " Me.New(value1, value2){0}"
842 + "End Class{0}", writer.NewLine), Code);