Fixed space indents to tabs to adhere to Mono coding guidelines.
[mono.git] / mcs / class / System / Test / System.CodeDom.Compiler / CodeGeneratorGenerateFromCompileUnitTest.cs
1 //
2 // CodeGenerator.GenerateFromCompileUnit Tests
3 //
4 // Authors:
5 // Ilker Cetinkaya (mail@ilker.de)
6 //
7 // This is a specific test for an issue on GenerateFromCompileUnit.
8 // Up until 2012 (version 2.10.n) the method emits attribute first
9 // and imports afterwards on global namespace scope. Example:
10 //
11 // ~~~~
12 // [assembly: AssemblyVersion("1.0")]
13 // using System.Reflection;
14 // ~~~~
15 //
16 // This in particular causes compiler to bail with CS1529.
17 // Albeit well aware that this is a _language specific_ issue
18 // (or requirement), the actual fix is aimed on CodeGenerator since
19 // the wrong emit order is as well in GenerateFromCompileUnit of abstract
20 // base. The probability to harm any other language generators
21 // is very low. It's near common sense to have imports on top
22 // on global namespace / file level.
23 //
24 // The test is being repeated for the internal `CSharpCodeGenerator`.
25 // See `Microsoft.CSharp` (Mono.CSharp namespace) for details.
26 //
27 // This test verifies the issue as well as describes correct expectation.
28
29 using System;
30 using System.CodeDom;
31 using System.CodeDom.Compiler;
32 using System.IO;
33
34 using NUnit.Framework;
35
36 namespace MonoTests.System.CodeDom.Compiler
37 {
38         [TestFixture]
39         public class CodeGeneratorGenerateFromCompileUnitTest {
40                 [Test]
41                 public void When_Having_AssemblyAttribute_And_Using_Namespace_It_Should_Generate_Namespace_First_And_Attribute_Afterwards () {
42                         ICodeGenerator generator = new SampleCodeGenerator ();
43                         var compileUnit = ACompileUnitWithAttributeAndNamespace ();
44                         var writer = new StringWriter ();
45                         var options = new CodeGeneratorOptions ();
46
47                         generator.GenerateCodeFromCompileUnit (compileUnit, writer, options);
48
49                         string result = writer.ToString ();
50                         
51                         int importPosition = result.IndexOf (IMPORT);
52                         int attributePosition = result.IndexOf (ATTRIBUTE);
53
54                         Assert.Greater (attributePosition, importPosition, "Actual order: " + result);
55                 }
56
57                 private const string ATTRIBUTE = "ATTRIBUTE";
58                 private const string IMPORT = "IMPORT";
59
60                 private CodeCompileUnit ACompileUnitWithAttributeAndNamespace () {
61                         var compileUnit = new CodeCompileUnit ();
62                         var importNs = new CodeNamespace ();
63
64                         importNs.Imports.Add (new CodeNamespaceImport (IMPORT));
65
66                         compileUnit.AssemblyCustomAttributes.Add (new CodeAttributeDeclaration (ATTRIBUTE));
67                         compileUnit.Namespaces.Add (importNs);
68
69                         return compileUnit;
70                 }
71
72                 private class SampleCodeGenerator : CodeGenerator {
73                         /* test overrides */
74                         protected override void GenerateAttributeDeclarationsStart (CodeAttributeDeclarationCollection attributes) { Output.Write ("ATTRIBUTE"); }
75                         protected override void GenerateAttributeDeclarationsEnd (CodeAttributeDeclarationCollection attributes) {}
76                         protected override void GenerateNamespaceImport (CodeNamespaceImport i) { Output.Write ("IMPORT"); }
77                         /* must overrides */
78                         protected override string NullToken { get { return string.Empty; } }
79                         protected override void GenerateArgumentReferenceExpression (CodeArgumentReferenceExpression e) {}
80                         protected override void GenerateArrayCreateExpression (CodeArrayCreateExpression e) {}
81                         protected override void GenerateArrayIndexerExpression (CodeArrayIndexerExpression e) {}
82                         protected override void GenerateAssignStatement (CodeAssignStatement s) {}
83                         protected override void GenerateAttachEventStatement (CodeAttachEventStatement s) {}
84                         protected override void GenerateBaseReferenceExpression (CodeBaseReferenceExpression e) {}
85                         protected override void GenerateCastExpression (CodeCastExpression e) {}
86                         protected override void GenerateComment (CodeComment comment) {}
87                         protected override void GenerateConditionStatement (CodeConditionStatement s) {}
88                         protected override void GenerateConstructor (CodeConstructor x, CodeTypeDeclaration d) {}
89                         protected override void GenerateDelegateCreateExpression (CodeDelegateCreateExpression e) {}
90                         protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression e) {}
91                         protected override void GenerateEntryPointMethod (CodeEntryPointMethod m, CodeTypeDeclaration d) {}
92                         protected override void GenerateEvent (CodeMemberEvent ev, CodeTypeDeclaration d) {}
93                         protected override void GenerateEventReferenceExpression (CodeEventReferenceExpression e) {}
94                         protected override void GenerateExpressionStatement (CodeExpressionStatement statement) {}
95                         protected override void GenerateField (CodeMemberField f) {}
96                         protected override void GenerateFieldReferenceExpression (CodeFieldReferenceExpression e) {}
97                         protected override void GenerateGotoStatement (CodeGotoStatement statement) {}
98                         protected override void GenerateIndexerExpression (CodeIndexerExpression e) {}
99                         protected override void GenerateIterationStatement (CodeIterationStatement s) {}
100                         protected override void GenerateLabeledStatement (CodeLabeledStatement statement) {}
101                         protected override void GenerateLinePragmaStart (CodeLinePragma p) {}
102                         protected override void GenerateLinePragmaEnd (CodeLinePragma p) {}
103                         protected override void GenerateMethod (CodeMemberMethod m, CodeTypeDeclaration d) {}
104                         protected override void GenerateMethodInvokeExpression (CodeMethodInvokeExpression e) {}
105                         protected override void GenerateMethodReferenceExpression (CodeMethodReferenceExpression e) {}
106                         protected override void GenerateMethodReturnStatement (CodeMethodReturnStatement e) {}
107                         protected override void GenerateNamespaceStart (CodeNamespace ns) {}
108                         protected override void GenerateNamespaceEnd (CodeNamespace ns) {}
109                         protected override void GenerateObjectCreateExpression (CodeObjectCreateExpression e) {}
110                         protected override void GenerateProperty (CodeMemberProperty p, CodeTypeDeclaration d) {}
111                         protected override void GeneratePropertyReferenceExpression (CodePropertyReferenceExpression e) {}
112                         protected override void GeneratePropertySetValueReferenceExpression (CodePropertySetValueReferenceExpression e) {}
113                         protected override void GenerateRemoveEventStatement (CodeRemoveEventStatement statement) {}
114                         protected override void GenerateSnippetExpression (CodeSnippetExpression e) {}
115                         protected override void GenerateSnippetMember (CodeSnippetTypeMember m) {}
116                         protected override void GenerateThisReferenceExpression (CodeThisReferenceExpression e) {}
117                         protected override void GenerateThrowExceptionStatement (CodeThrowExceptionStatement s) {}
118                         protected override void GenerateTryCatchFinallyStatement (CodeTryCatchFinallyStatement s) {}
119                         protected override void GenerateTypeEnd (CodeTypeDeclaration declaration) {}
120                         protected override void GenerateTypeConstructor (CodeTypeConstructor constructor) {}
121                         protected override void GenerateTypeStart (CodeTypeDeclaration declaration) {}
122                         protected override void GenerateVariableDeclarationStatement (CodeVariableDeclarationStatement e) {}
123                         protected override void GenerateVariableReferenceExpression (CodeVariableReferenceExpression e) {}
124                         protected override void OutputType (CodeTypeReference t) {}
125                         protected override string QuoteSnippetString (string value) { return string.Empty; }
126                         protected override string CreateEscapedIdentifier (string value) { return string.Empty; }
127                         protected override string CreateValidIdentifier (string value) { return string.Empty; }
128                         protected override string GetTypeOutput (CodeTypeReference type) { return string.Empty; }
129                         protected override bool IsValidIdentifier (string value) { return false; }
130                         protected override bool Supports (GeneratorSupport supports) { return false; }
131                 }
132         }
133 }