linux-packaging-mono/mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorFromNamespaceTest.cs
Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

535 lines
15 KiB
C#

//
// Microsoft.CSharp.* Test Cases
//
// Authors:
// Erik LeBel (eriklebel@yahoo.ca)
//
// (c) 2003 Erik LeBel
//
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Globalization;
using System.IO;
using System.Text;
using NUnit.Framework;
namespace MonoTests.Microsoft.CSharp
{
/// <summary>
/// Test ICodeGenerator's GenerateCodeFromNamespace, along with a
/// minimal set CodeDom components.
/// </summary>
[TestFixture]
public class CodeGeneratorFromNamespaceTest : CodeGeneratorTestBase
{
CodeNamespace codeNamespace;
[SetUp]
public void Init ()
{
InitBase ();
codeNamespace = new CodeNamespace ();
}
protected override string Generate (CodeGeneratorOptions options)
{
StringWriter writer = new StringWriter ();
writer.NewLine = NewLine;
generator.GenerateCodeFromNamespace (codeNamespace, writer, options);
writer.Close ();
return writer.ToString ();
}
[Test]
[ExpectedException (typeof (NullReferenceException))]
public void NullNamespaceTest ()
{
codeNamespace = null;
Generate ();
}
[Test]
public void NullNamespaceNameTest ()
{
codeNamespace.Name = null;
Assert.AreEqual ("\n", Generate ());
}
[Test]
public void DefaultNamespaceTest ()
{
Assert.AreEqual ("\n", Generate ());
}
[Test]
public void SimpleNamespaceTest ()
{
string code = null;
codeNamespace.Name = "A";
code = Generate ();
Assert.AreEqual ("namespace A {\n \n}\n", code, "#1");
CodeGeneratorOptions options = new CodeGeneratorOptions ();
options.BracingStyle = "C";
code = Generate (options);
Assert.AreEqual ("namespace A\n{\n \n}\n", code, "#2");
}
[Test]
public void InvalidNamespaceTest ()
{
codeNamespace.Name = "A,B";
Assert.AreEqual ("namespace A,B {\n \n}\n", Generate ());
}
[Test]
public void CommentOnlyNamespaceTest ()
{
CodeCommentStatement comment = new CodeCommentStatement ("a");
codeNamespace.Comments.Add (comment);
Assert.AreEqual ("// a\n\n", Generate ());
}
[Test]
public void ImportsTest ()
{
codeNamespace.Imports.Add (new CodeNamespaceImport ("System"));
codeNamespace.Imports.Add (new CodeNamespaceImport ("System.Collections"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"using System;{0}" +
"using System.Collections;{0}" +
"{0}", NewLine), Generate (), "#1");
codeNamespace.Name = "A";
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace A {{{0}" +
" using System;{0}" +
" using System.Collections;{0}" +
" {0}" +
"}}{0}", NewLine), Generate (), "#2");
codeNamespace.Name = null;
codeNamespace.Comments.Add (new CodeCommentStatement ("a"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"// a{0}" +
"using System;{0}" +
"using System.Collections;{0}" +
"{0}", NewLine), Generate (), "#3");
codeNamespace.Name = "A";
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"// a{0}" +
"namespace A {{{0}" +
" using System;{0}" +
" using System.Collections;{0}" +
" {0}" +
"}}{0}", NewLine), Generate (), "#4");
}
[Test]
public void TypeTest ()
{
codeNamespace.Types.Add (new CodeTypeDeclaration ("Person"));
Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
"{0}" +
"{0}" +
"public class Person {{{0}" +
"}}{0}", NewLine), Generate (), "#A1");
CodeGeneratorOptions options = new CodeGeneratorOptions ();
options.BlankLinesBetweenMembers = false;
Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
"{0}" +
"public class Person {{{0}" +
"}}{0}", NewLine), Generate (options), "#A2");
codeNamespace.Name = "A";
Assert.AreEqual (string.Format(CultureInfo.InvariantCulture,
"namespace A {{{0}" +
" {0}" +
" {0}" +
" public class Person {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#B1");
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace A {{{0}" +
" {0}" +
" public class Person {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (options), "#B2");
}
[Test]
public void Type_TypeParameters ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
type.TypeParameters.Add (new CodeTypeParameter ("T"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T>{0}" +
" {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#1");
type.TypeParameters.Add (new CodeTypeParameter ("as"));
type.TypeParameters.Add (new CodeTypeParameter ("is"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T, as, is>{0}" +
" {0}" +
" {0}" +
" {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#2");
CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
type.TypeParameters.Add (typeParamR);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T, as, is, R>{0}" +
" {0}" +
" {0}" +
" {0}" +
" where R : System.IComparable {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#3");
type.TypeParameters.Add (new CodeTypeParameter ("S"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T, as, is, R, S>{0}" +
" {0}" +
" {0}" +
" {0}" +
" where R : System.IComparable{0}" +
" {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#4");
}
[Test]
public void Type_TypeParameters_Constraints ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
type.TypeParameters.Add (typeParamT);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T>{0}" +
" where T : System.IComparable {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#1");
typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T>{0}" +
" where T : System.IComparable, System.ICloneable {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#2");
typeParamT.HasConstructorConstraint = true;
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T>{0}" +
" where T : System.IComparable, System.ICloneable, new () {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#3");
CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
type.TypeParameters.Add (typeParamS);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T, S>{0}" +
" where T : System.IComparable, System.ICloneable, new (){0}" +
" where S : System.IDisposable {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#4");
CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
typeParamR.HasConstructorConstraint = true;
type.TypeParameters.Add (typeParamR);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T, S, R>{0}" +
" where T : System.IComparable, System.ICloneable, new (){0}" +
" where S : System.IDisposable{0}" +
" where R : new() {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#5");
}
[Test]
public void Type_TypeParameters_ConstructorConstraint ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
CodeTypeParameter typeParam = new CodeTypeParameter ("T");
typeParam.HasConstructorConstraint = true;
type.TypeParameters.Add (typeParam);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass<T>{0}" +
" where T : new() {{{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate ());
}
[Test]
public void Method_TypeParameters ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
CodeMemberMethod method = new CodeMemberMethod ();
method.Name = "SomeMethod";
type.Members.Add (method);
method.TypeParameters.Add (new CodeTypeParameter ("T"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T>(){0}" +
" {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#1");
method.TypeParameters.Add (new CodeTypeParameter ("as"));
method.TypeParameters.Add (new CodeTypeParameter ("is"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T, as, is>(){0}" +
" {0}" +
" {0}" +
" {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#2");
CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
typeParamR.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
method.TypeParameters.Add (typeParamR);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T, as, is, R>(){0}" +
" {0}" +
" {0}" +
" {0}" +
" where R : System.IComparable {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#3");
method.TypeParameters.Add (new CodeTypeParameter ("S"));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T, as, is, R, S>(){0}" +
" {0}" +
" {0}" +
" {0}" +
" where R : System.IComparable{0}" +
" {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#4");
}
[Test]
public void Method_TypeParameters_Constraints ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
CodeMemberMethod method = new CodeMemberMethod ();
method.Name = "SomeMethod";
type.Members.Add (method);
CodeTypeParameter typeParamT = new CodeTypeParameter ("T");
typeParamT.Constraints.Add (new CodeTypeReference (typeof (IComparable)));
method.TypeParameters.Add (typeParamT);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T>(){0}" +
" where T : System.IComparable {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#1");
typeParamT.Constraints.Add (new CodeTypeReference (typeof (ICloneable)));
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T>(){0}" +
" where T : System.IComparable, System.ICloneable {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#2");
typeParamT.HasConstructorConstraint = true;
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T>(){0}" +
" where T : System.IComparable, System.ICloneable, new () {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#3");
CodeTypeParameter typeParamS = new CodeTypeParameter ("S");
typeParamS.Constraints.Add (new CodeTypeReference (typeof (IDisposable)));
method.TypeParameters.Add (typeParamS);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T, S>(){0}" +
" where T : System.IComparable, System.ICloneable, new (){0}" +
" where S : System.IDisposable {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#4");
CodeTypeParameter typeParamR = new CodeTypeParameter ("R");
typeParamR.HasConstructorConstraint = true;
method.TypeParameters.Add (typeParamR);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T, S, R>(){0}" +
" where T : System.IComparable, System.ICloneable, new (){0}" +
" where S : System.IDisposable{0}" +
" where R : new() {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate (), "#5");
}
[Test] // bug #353921
public void Method_TypeParameters_ConstructorConstraint ()
{
codeNamespace.Name = "SomeNS";
CodeTypeDeclaration type = new CodeTypeDeclaration ("SomeClass");
codeNamespace.Types.Add (type);
CodeMemberMethod method = new CodeMemberMethod ();
method.Name = "SomeMethod";
type.Members.Add (method);
CodeTypeParameter typeParam = new CodeTypeParameter ("T");
typeParam.HasConstructorConstraint = true;
method.TypeParameters.Add (typeParam);
Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
"namespace SomeNS {{{0}" +
" {0}" +
" {0}" +
" public class SomeClass {{{0}" +
" {0}" +
" private void SomeMethod<T>(){0}" +
" where T : new() {{{0}" +
" }}{0}" +
" }}{0}" +
"}}{0}", NewLine), Generate ());
}
}
}