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 public void MethodMembersTypeTest1 ()
374 CodeMemberMethod method = new CodeMemberMethod ();
376 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
378 method.CustomAttributes.Add (attrDec);
380 attrDec = new CodeAttributeDeclaration ();
382 method.CustomAttributes.Add (attrDec);
384 type.Members.Add (method);
387 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
388 "Public Class Test1{0}"
392 + " Private Sub (){0}"
394 + "End Class{0}", writer.NewLine), Code);
398 public void MethodMembersTypeTest2 ()
402 CodeMemberMethod method = new CodeMemberMethod ();
403 method.Name = "Something";
404 method.Attributes = MemberAttributes.Public;
405 method.ReturnType = new CodeTypeReference (typeof (int));
407 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
408 typeof(object), "value1");
409 method.Parameters.Add (param);
411 param = new CodeParameterDeclarationExpression (
412 typeof (object), "value2");
413 param.Direction = FieldDirection.In;
414 method.Parameters.Add (param);
416 param = new CodeParameterDeclarationExpression (typeof (int), "index");
417 param.Direction = FieldDirection.Out;
418 method.Parameters.Add (param);
420 param = new CodeParameterDeclarationExpression (typeof (int), "count");
421 param.Direction = FieldDirection.Ref;
422 method.Parameters.Add (param);
424 type.Members.Add (method);
427 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
428 "Public Class Test1{0}"
430 + " Public Overridable Function Something(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer) As Integer{0}"
432 + "End Class{0}", writer.NewLine), Code);
436 public void MethodMembersTypeTest3 ()
440 CodeMemberMethod method = new CodeMemberMethod ();
441 method.Name = "Something";
442 method.Attributes = MemberAttributes.Public;
443 method.ReturnType = new CodeTypeReference (typeof (int));
446 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
447 typeof (object), "value");
448 method.Parameters.Add (param);
450 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
452 param.CustomAttributes.Add (attrDec);
454 attrDec = new CodeAttributeDeclaration ();
456 param.CustomAttributes.Add (attrDec);
460 param = new CodeParameterDeclarationExpression (typeof (int), "index");
461 param.Direction = FieldDirection.Out;
462 method.Parameters.Add (param);
464 attrDec = new CodeAttributeDeclaration ();
466 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
467 new CodePrimitiveExpression (false)));
468 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
469 new CodePrimitiveExpression (true)));
470 param.CustomAttributes.Add (attrDec);
472 attrDec = new CodeAttributeDeclaration ();
474 param.CustomAttributes.Add (attrDec);
476 type.Members.Add (method);
479 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
480 "Public Class Test1{0}"
482 + " Public Overridable Function Something(<A(), B()> ByVal value As Object, <C(A1:=false, A2:=true), D()> ByRef index As Integer) As Integer{0}"
484 + "End Class{0}", writer.NewLine), Code);
488 public void ConstructorAttributesTest ()
492 CodeConstructor ctor = new CodeConstructor ();
494 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
496 ctor.CustomAttributes.Add (attrDec);
498 attrDec = new CodeAttributeDeclaration ();
500 ctor.CustomAttributes.Add (attrDec);
502 type.Members.Add (ctor);
505 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
506 "Public Class Test1{0}"
510 + " Private Sub New(){0}"
513 + "End Class{0}", writer.NewLine), Code);
517 public void ConstructorParametersTest ()
521 CodeConstructor ctor = new CodeConstructor ();
522 ctor.Name = "Whatever";
523 ctor.Attributes = MemberAttributes.Public;
525 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
526 typeof (object), "value1");
527 ctor.Parameters.Add (param);
529 param = new CodeParameterDeclarationExpression (
530 typeof (object), "value2");
531 param.Direction = FieldDirection.In;
532 ctor.Parameters.Add (param);
534 param = new CodeParameterDeclarationExpression (typeof (int), "index");
535 param.Direction = FieldDirection.Out;
536 ctor.Parameters.Add (param);
538 param = new CodeParameterDeclarationExpression (typeof (int), "count");
539 param.Direction = FieldDirection.Ref;
540 ctor.Parameters.Add (param);
542 type.Members.Add (ctor);
545 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
546 "Public Class Test1{0}"
548 + " Public Sub New(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer){0}"
551 + "End Class{0}", writer.NewLine), Code);
555 public void ConstructorParameterAttributesTest ()
559 CodeConstructor ctor = new CodeConstructor ();
560 ctor.Name = "Something";
561 ctor.Attributes = MemberAttributes.Public;
564 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
565 typeof (object), "value");
566 ctor.Parameters.Add (param);
568 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
570 param.CustomAttributes.Add (attrDec);
572 attrDec = new CodeAttributeDeclaration ();
574 param.CustomAttributes.Add (attrDec);
577 param = new CodeParameterDeclarationExpression (typeof (int), "index");
578 param.Direction = FieldDirection.Out;
579 ctor.Parameters.Add (param);
581 attrDec = new CodeAttributeDeclaration ();
583 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
584 new CodePrimitiveExpression (false)));
585 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
586 new CodePrimitiveExpression (true)));
587 param.CustomAttributes.Add (attrDec);
589 attrDec = new CodeAttributeDeclaration ();
591 param.CustomAttributes.Add (attrDec);
593 type.Members.Add (ctor);
596 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
597 "Public Class Test1{0}"
599 + " Public Sub New(<A(), B()> ByVal value As Object, <C(A1:=false, A2:=true), D()> ByRef index As Integer){0}"
602 + "End Class{0}", writer.NewLine), Code);
606 public void BaseConstructorSingleArg ()
610 CodeConstructor ctor = new CodeConstructor ();
611 ctor.Name = "Something";
612 ctor.Attributes = MemberAttributes.Public;
615 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
616 typeof (object), "value1");
617 ctor.Parameters.Add (param);
620 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
621 param.Direction = FieldDirection.Out;
622 ctor.Parameters.Add (param);
625 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
627 type.Members.Add (ctor);
630 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
631 "Public Class Test1{0}"
633 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
634 + " MyBase.New(value1){0}"
636 + "End Class{0}", writer.NewLine), Code);
640 public void BaseConstructorMultipleArgs ()
644 CodeConstructor ctor = new CodeConstructor ();
645 ctor.Name = "Something";
646 ctor.Attributes = MemberAttributes.Public;
649 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
650 typeof (object), "value1");
651 ctor.Parameters.Add (param);
654 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
655 param.Direction = FieldDirection.Out;
656 ctor.Parameters.Add (param);
659 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
660 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
662 type.Members.Add (ctor);
665 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
666 "Public Class Test1{0}"
668 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
669 + " MyBase.New(value1, value2){0}"
671 + "End Class{0}", writer.NewLine), Code);
675 public void ChainedConstructorSingleArg ()
679 CodeConstructor ctor = new CodeConstructor ();
680 ctor.Name = "Something";
681 ctor.Attributes = MemberAttributes.Public;
684 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
685 typeof (object), "value1");
686 ctor.Parameters.Add (param);
689 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
690 param.Direction = FieldDirection.Out;
691 ctor.Parameters.Add (param);
694 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
696 // should be ignored as chained ctor args should take precedence over base
698 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
700 type.Members.Add (ctor);
703 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
704 "Public Class Test1{0}"
706 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
707 + " Me.New(value1){0}"
709 + "End Class{0}", writer.NewLine), Code);
713 public void ChainedConstructorMultipleArgs ()
717 CodeConstructor ctor = new CodeConstructor ();
718 ctor.Name = "Something";
719 ctor.Attributes = MemberAttributes.Public;
722 CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
723 typeof (object), "value1");
724 ctor.Parameters.Add (param);
727 param = new CodeParameterDeclarationExpression (typeof (int), "value2");
728 param.Direction = FieldDirection.Out;
729 ctor.Parameters.Add (param);
732 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
733 ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
735 // should be ignored as chained ctor args should take precedence over base
737 ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
739 type.Members.Add (ctor);
742 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
743 "Public Class Test1{0}"
745 + " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
746 + " Me.New(value1, value2){0}"
748 + "End Class{0}", writer.NewLine), Code);