2 // Microsoft.CSharp.* Test Cases
5 // Erik LeBel (eriklebel@yahoo.ca)
6 // Ilker Cetinkaya (mail@ilker.de)
13 using System.CodeDom.Compiler;
14 using System.Globalization;
18 using NUnit.Framework;
20 namespace MonoTests.Microsoft.CSharp
23 /// Test ICodeGenerator's GenerateCodeFromCompileUnit, along with a
24 /// minimal set CodeDom components.
27 public class CodeGeneratorFromCompileUnitTest : CodeGeneratorTestBase
29 private string codeUnitHeader = string.Empty;
30 private CodeCompileUnit codeUnit;
32 public CodeGeneratorFromCompileUnitTest ()
35 codeUnitHeader = Generate ();
42 codeUnit = new CodeCompileUnit ();
45 protected override string Generate (CodeGeneratorOptions options)
47 StringWriter writer = new StringWriter ();
48 writer.NewLine = NewLine;
50 generator.GenerateCodeFromCompileUnit (codeUnit, writer, options);
52 return writer.ToString ().Substring (codeUnitHeader.Length);
56 public void DefaultCodeUnitTest ()
58 Assert.AreEqual (string.Empty, Generate ());
62 [ExpectedException (typeof (NullReferenceException))]
63 public void NullCodeUnitTest ()
70 public void ReferencedTest ()
72 codeUnit.ReferencedAssemblies.Add ("System.dll");
73 Assert.AreEqual (string.Empty, Generate ());
77 public void SimpleNamespaceTest ()
81 CodeNamespace ns = new CodeNamespace ("A");
82 codeUnit.Namespaces.Add (ns);
84 Assert.AreEqual ("namespace A {\n \n}\n", code, "#1");
86 CodeGeneratorOptions options = new CodeGeneratorOptions ();
87 options.BracingStyle = "C";
88 code = Generate (options);
89 Assert.AreEqual ("namespace A\n{\n \n}\n", code, "#2");
93 public void ReferenceAndSimpleNamespaceTest()
95 CodeNamespace ns = new CodeNamespace ("A");
96 codeUnit.Namespaces.Add (ns);
97 codeUnit.ReferencedAssemblies.Add ("using System;");
98 Assert.AreEqual ("namespace A {\n \n}\n", Generate ());
102 public void SimpleAttributeTest ()
104 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
107 codeUnit.AssemblyCustomAttributes.Add (attrDec);
108 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
109 "[assembly: A()]{0}{0}", NewLine), Generate ());
113 public void AttributeWithValueTest ()
115 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
118 attrDec.Arguments.Add (new CodeAttributeArgument ("A1",
119 new CodePrimitiveExpression (false)));
120 attrDec.Arguments.Add (new CodeAttributeArgument ("A2",
121 new CodePrimitiveExpression (true)));
122 // null name should not be output
123 attrDec.Arguments.Add (new CodeAttributeArgument (null,
124 new CodePrimitiveExpression (true)));
125 // zero length name should not be output
126 attrDec.Arguments.Add (new CodeAttributeArgument (string.Empty,
127 new CodePrimitiveExpression (false)));
129 codeUnit.AssemblyCustomAttributes.Add (attrDec);
130 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
131 "[assembly: A(A1=false, A2=true, true, false)]{0}{0}", NewLine),
136 public void MultipleAttributeTest ()
138 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
140 codeUnit.AssemblyCustomAttributes.Add (attrDec);
142 attrDec = new CodeAttributeDeclaration ();
144 codeUnit.AssemblyCustomAttributes.Add (attrDec);
145 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
146 "[assembly: A()]{0}[assembly: B()]{0}{0}", NewLine),
151 public void AttributeAndSimpleNamespaceTest ()
153 CodeNamespace ns = new CodeNamespace ("A");
154 codeUnit.Namespaces.Add (ns);
156 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
158 codeUnit.AssemblyCustomAttributes.Add (attrDec);
160 attrDec = new CodeAttributeDeclaration ();
162 codeUnit.AssemblyCustomAttributes.Add (attrDec);
164 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
165 "[assembly: A()]{0}[assembly: B()]{0}{0}namespace A {{{0} {0}"
166 + "}}{0}", NewLine), Generate ());
170 public void CodeSnippetTest ()
172 StringWriter writer = new StringWriter ();
173 writer.NewLine = NewLine;
175 codeUnit = new CodeSnippetCompileUnit ("public class Test1 {}");
176 generator.GenerateCodeFromCompileUnit (codeUnit, writer, options);
178 Assert.AreEqual ("public class Test1 {}" + writer.NewLine, writer.ToString ());
182 public void AttributeAndGlobalNamespaceWithImportTest ()
184 CodeNamespace ns = new CodeNamespace ();
185 ns.Imports.Add (new CodeNamespaceImport ("Z"));
186 ns.Imports.Add (new CodeNamespaceImport ("A"));
187 codeUnit.Namespaces.Add (ns);
189 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
191 codeUnit.AssemblyCustomAttributes.Add (attrDec);
193 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
194 "using A;{0}using Z;{0}{0}[assembly: A()]{0}{0}{0}", NewLine), Generate ());
198 public void GlobalAttributeBeforeType ()
200 StringWriter writer = new StringWriter ();
201 writer.NewLine = NewLine;
203 codeUnit = new CodeCompileUnit () {
204 AssemblyCustomAttributes = {
205 new CodeAttributeDeclaration (
206 new CodeTypeReference (typeof (CLSCompliantAttribute)),
207 new CodeAttributeArgument (new CodePrimitiveExpression (false))),
210 new CodeNamespace () {
212 new CodeTypeDeclaration ("Resources"),
218 generator.GenerateCodeFromCompileUnit (codeUnit, writer, options);
221 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
222 "[assembly: System.CLSCompliantAttribute(false)]{0}{0}{0}{0}public class Resources {{{0}}}{0}", NewLine), Generate ());