//
// Microsoft.VisualBasic.* Test Cases
//
// Authors:
// Gert Driesen (drieseng@users.sourceforge.net)
//
// (c) Novell
//
using System;
using System.Globalization;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using NUnit.Framework;
namespace MonoTests.Microsoft.VisualBasic
{
///
///
/// Test ICodeGenerator's GenerateCodeFromType, along with a
/// minimal set CodeDom components.
///
///
[TestFixture]
public class CodeGeneratorFromTypeTest : CodeGeneratorTestBase
{
CodeTypeDeclaration type = null;
[SetUp]
public void Init ()
{
InitBase ();
type = new CodeTypeDeclaration ();
}
protected override void Generate ()
{
generator.GenerateCodeFromType (type, writer, options);
writer.Close ();
}
[Test]
public void DefaultTypeTest ()
{
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class {0}End Class{0}", writer.NewLine), Code);
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void NullTypeTest ()
{
type = null;
Generate ();
}
[Test]
public void SimpleTypeTest ()
{
type.Name = "Test1";
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}End Class{0}", writer.NewLine), Code);
}
[Test]
public void AttributesAndTypeTest ()
{
type.Name = "Test1";
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
type.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
type.CustomAttributes.Add (attrDec);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
" _{0}Public Class Test1{0}End Class{0}",
writer.NewLine), Code);
}
[Test]
public void EventMembersTypeTest1 ()
{
type.Name = "Test1";
CodeMemberEvent evt = new CodeMemberEvent ();
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
evt.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
evt.CustomAttributes.Add (attrDec);
type.Members.Add (evt);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0} {0} _{0} "
+ "Private Event As System.Void{0}End Class{0}", writer.NewLine), Code);
}
[Test]
public void EventMembersTypeTest2 ()
{
type.Name = "Test1";
CodeMemberEvent evt = new CodeMemberEvent ();
evt.Name = "OnClick";
evt.Attributes = MemberAttributes.Public;
evt.Type = new CodeTypeReference(typeof (int));
type.Members.Add (evt);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0} {0} "
+ "Public Event OnClick As Integer{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void FieldMembersTypeTest1 ()
{
type.Name = "Test1";
CodeMemberField fld = new CodeMemberField ();
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
fld.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
fld.CustomAttributes.Add (attrDec);
type.Members.Add (fld);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0} {0} _{0} "
+ "Private As System.Void{0}End Class{0}", writer.NewLine), Code);
}
[Test]
public void FieldMembersTypeTest2 ()
{
type.Name = "Test1";
CodeMemberField fld = new CodeMemberField ();
fld.Name = "Name";
fld.Attributes = MemberAttributes.Public;
fld.Type = new CodeTypeReference (typeof (int));
type.Members.Add (fld);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0} {0} "
+ "Public Name As Integer{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void PropertyMembersTypeTest1 ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
property.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
property.CustomAttributes.Add (attrDec);
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " _{0}"
#if NET_2_0
+ " Private Property () As System.Void{0}"
#else
+ " Private Property As System.Void{0}"
#endif
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void PropertyMembersTypeTest2 ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.Public;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Public Overridable Property Name() As Integer{0}"
#else
+ " Public Overridable Property Name As Integer{0}"
#endif
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void PropertyMembersTypeGetOnly ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.Family;
property.HasGet = true;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Protected Overridable ReadOnly Property Name() As Integer{0}"
#else
+ " Protected Overridable ReadOnly Property Name As Integer{0}"
#endif
+ " Get{0}"
+ " End Get{0}"
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void PropertyMembersTypeSetOnly ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.FamilyAndAssembly;
property.HasSet = true;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Friend WriteOnly Property Name() As Integer{0}"
#else
+ " Friend WriteOnly Property Name As Integer{0}"
#endif
+ " Set{0}"
+ " End Set{0}"
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void PropertyMembersTypeGetSet ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.Family;
property.HasGet = true;
property.HasSet = true;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Protected Overridable Property Name() As Integer{0}"
#else
+ " Protected Overridable Property Name As Integer{0}"
#endif
+ " Get{0}"
+ " End Get{0}"
+ " Set{0}"
+ " End Set{0}"
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
#if !NET_2_0
// A bug in MS.NET 1.x causes MemberAttributes.FamilyOrAssembly to be
// generated as Protected
[Category("NotDotNet")]
#endif
[Test]
public void PropertyMembersTypeFamilyOrAssembly ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.FamilyOrAssembly;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Protected Friend Property Name() As Integer{0}"
#else
+ " Protected Friend Property Name As Integer{0}"
#endif
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
#if !NET_2_0
// A bug in MS.NET 1.x causes MemberAttributes.Assembly to be generated
// as Protected
[Category ("NotDotNet")]
#endif
[Test]
public void PropertyMembersTypeAssembly ()
{
type.Name = "Test1";
CodeMemberProperty property = new CodeMemberProperty ();
property.Name = "Name";
property.Attributes = MemberAttributes.Assembly;
property.Type = new CodeTypeReference (typeof (int));
type.Members.Add (property);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
#if NET_2_0
+ " Friend Overridable Property Name() As Integer{0}"
#else
+ " Friend Property Name As Integer{0}"
#endif
+ " End Property{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void MethodMembersTypeTest1 ()
{
type.Name = "Test1";
CodeMemberMethod method = new CodeMemberMethod ();
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
method.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
method.CustomAttributes.Add (attrDec);
type.Members.Add (method);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " _{0}"
+ " Private Sub (){0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void MethodMembersTypeTest2 ()
{
type.Name = "Test1";
CodeMemberMethod method = new CodeMemberMethod ();
method.Name = "Something";
method.Attributes = MemberAttributes.Public;
method.ReturnType = new CodeTypeReference (typeof (int));
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof(object), "value1");
method.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (
typeof (object), "value2");
param.Direction = FieldDirection.In;
method.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (typeof (int), "index");
param.Direction = FieldDirection.Out;
method.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (typeof (int), "count");
param.Direction = FieldDirection.Ref;
method.Parameters.Add (param);
type.Members.Add (method);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Overridable Function Something(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer) As Integer{0}"
+ " End Function{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void MethodMembersTypeTest3 ()
{
type.Name = "Test1";
CodeMemberMethod method = new CodeMemberMethod ();
method.Name = "Something";
method.Attributes = MemberAttributes.Public;
method.ReturnType = new CodeTypeReference (typeof (int));
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value");
method.Parameters.Add (param);
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
param.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
param.CustomAttributes.Add (attrDec);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "index");
param.Direction = FieldDirection.Out;
method.Parameters.Add (param);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "C";
attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
new CodePrimitiveExpression (false)));
attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
new CodePrimitiveExpression (true)));
param.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "D";
param.CustomAttributes.Add (attrDec);
type.Members.Add (method);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Overridable Function Something( ByVal value As Object, ByRef index As Integer) As Integer{0}"
+ " End Function{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void ConstructorAttributesTest ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
ctor.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
ctor.CustomAttributes.Add (attrDec);
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " _{0}"
+ " Private Sub New(){0}"
+ " MyBase.New{0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void ConstructorParametersTest ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Whatever";
ctor.Attributes = MemberAttributes.Public;
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value1");
ctor.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (
typeof (object), "value2");
param.Direction = FieldDirection.In;
ctor.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (typeof (int), "index");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
param = new CodeParameterDeclarationExpression (typeof (int), "count");
param.Direction = FieldDirection.Ref;
ctor.Parameters.Add (param);
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New(ByVal value1 As Object, ByVal value2 As Object, ByRef index As Integer, ByRef count As Integer){0}"
+ " MyBase.New{0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void ConstructorParameterAttributesTest ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Something";
ctor.Attributes = MemberAttributes.Public;
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value");
ctor.Parameters.Add (param);
CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "A";
param.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "B";
param.CustomAttributes.Add (attrDec);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "index");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "C";
attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
new CodePrimitiveExpression (false)));
attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
new CodePrimitiveExpression (true)));
param.CustomAttributes.Add (attrDec);
attrDec = new CodeAttributeDeclaration ();
attrDec.Name = "D";
param.CustomAttributes.Add (attrDec);
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New( ByVal value As Object, ByRef index As Integer){0}"
+ " MyBase.New{0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void BaseConstructorSingleArg ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Something";
ctor.Attributes = MemberAttributes.Public;
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value1");
ctor.Parameters.Add (param);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "value2");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
// base ctor args
ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
+ " MyBase.New(value1){0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void BaseConstructorMultipleArgs ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Something";
ctor.Attributes = MemberAttributes.Public;
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value1");
ctor.Parameters.Add (param);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "value2");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
// base ctor args
ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
+ " MyBase.New(value1, value2){0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void ChainedConstructorSingleArg ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Something";
ctor.Attributes = MemberAttributes.Public;
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value1");
ctor.Parameters.Add (param);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "value2");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
// chained ctor args
ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
// should be ignored as chained ctor args should take precedence over base
// ctor args
ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
+ " Me.New(value1){0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
[Test]
public void ChainedConstructorMultipleArgs ()
{
type.Name = "Test1";
CodeConstructor ctor = new CodeConstructor ();
ctor.Name = "Something";
ctor.Attributes = MemberAttributes.Public;
// first parameter
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression (
typeof (object), "value1");
ctor.Parameters.Add (param);
// second parameter
param = new CodeParameterDeclarationExpression (typeof (int), "value2");
param.Direction = FieldDirection.Out;
ctor.Parameters.Add (param);
// chained ctor args
ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value1"));
ctor.ChainedConstructorArgs.Add (new CodeVariableReferenceExpression ("value2"));
// should be ignored as chained ctor args should take precedence over base
// ctor args
ctor.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("value3"));
type.Members.Add (ctor);
Generate ();
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"Public Class Test1{0}"
+ " {0}"
+ " Public Sub New(ByVal value1 As Object, ByRef value2 As Integer){0}"
+ " Me.New(value1, value2){0}"
+ " End Sub{0}"
+ "End Class{0}", writer.NewLine), Code);
}
}
}