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 var import = new CodeNamespaceImport ("Z");
185 AddGlobalNamespaceWithImport (codeUnit, import);
186 AddAssemblyAttribute (codeUnit, "A");
188 Assert.AreEqual (string.Format (CultureInfo.InvariantCulture,
189 "using Z;{0}{0}[assembly: A()]{0}{0}", NewLine), Generate ());
192 private static void AddGlobalNamespaceWithImport (CodeCompileUnit codeUnit, CodeNamespaceImport import) {
193 CodeNamespace ns = new CodeNamespace ();
194 ns.Imports.Add (import);
195 codeUnit.Namespaces.Add (ns);
198 private static void AddAssemblyAttribute (CodeCompileUnit codeUnit, string attributeName) {
199 CodeAttributeDeclaration attrDec = new CodeAttributeDeclaration ();
200 attrDec.Name = attributeName;
201 codeUnit.AssemblyCustomAttributes.Add (attrDec);