1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
8
using ICSharpCode.NRefactory.Parser;
9
using ICSharpCode.NRefactory.Parser.CSharp;
10
using ICSharpCode.NRefactory.PrettyPrinter;
12
namespace ICSharpCode.NRefactory.Tests.Lexer.CSharp
15
public class PreprocessingTests
17
ILexer GenerateLexer(string text)
19
ILexer lexer = ParserFactory.CreateLexer(SupportedLanguage.CSharp, new StringReader(text));
20
lexer.EvaluateConditionalCompilation = true;
21
lexer.ConditionalCompilationSymbols["TEST"] = null;
25
int[] GetTokenKinds(string text)
27
List<int> list = new List<int>();
28
ILexer lexer = GenerateLexer(text);
30
while ((token = lexer.NextToken()) != null) {
32
if (token.Kind == Tokens.EOF)
35
Assert.AreEqual("", lexer.Errors.ErrorOutput);
36
return list.ToArray();
40
public void TestEmptyIfdef()
42
Assert.AreEqual(new int[] { Tokens.Int, Tokens.EOF }, GetTokenKinds("#if true\n#endif\nint"));
43
Assert.AreEqual(new int[] { Tokens.Int, Tokens.EOF }, GetTokenKinds("#if false\n#endif\nint"));
47
public void TestBooleanPrimitives()
49
Assert.AreEqual(new int[] { Tokens.True, Tokens.EOF }, GetTokenKinds("#if true \n true \n #else \n false \n #endif"));
50
Assert.AreEqual(new int[] { Tokens.False, Tokens.EOF }, GetTokenKinds("#if false \n true \n #else \n false \n #endif"));
54
public void TestDefinedSymbols()
56
Assert.AreEqual(new int[] { Tokens.True, Tokens.EOF }, GetTokenKinds("#if TEST \n true \n #else \n false \n #endif"));
57
Assert.AreEqual(new int[] { Tokens.False, Tokens.EOF }, GetTokenKinds("#if DEBUG \n true \n #else \n false \n #endif"));
61
public void TestDefineUndefineSymbol()
63
Assert.AreEqual(new int[] { Tokens.False, Tokens.EOF }, GetTokenKinds("#undef TEST \n #if TEST \n true \n #else \n false \n #endif"));
64
Assert.AreEqual(new int[] { Tokens.True, Tokens.EOF }, GetTokenKinds("#define DEBUG \n #if DEBUG \n true \n #else \n false \n #endif"));
65
Assert.AreEqual(new int[] { Tokens.True, Tokens.EOF }, GetTokenKinds("#define DEBUG // comment \n #if DEBUG \n true \n #else \n false \n #endif"));
69
public void TestNestedIfDef()
82
#if C // this is a comment
90
Assert.AreEqual(new int[] { Tokens.Class, Tokens.EOF }, GetTokenKinds(program));
91
Assert.AreEqual(new int[] { Tokens.Public, Tokens.Void, Tokens.EOF }, GetTokenKinds("#define A\n" + program));
92
Assert.AreEqual(new int[] { Tokens.Public, Tokens.Abstract, Tokens.Void, Tokens.EOF },
93
GetTokenKinds("#define A\n#define B\n" + program));
94
Assert.AreEqual(new int[] { Tokens.Public, Tokens.Virtual, Tokens.Void, Tokens.EOF },
95
GetTokenKinds("#define A\n#define C\n" + program));
96
Assert.AreEqual(new int[] { Tokens.Public, Tokens.Abstract, Tokens.Void, Tokens.EOF },
97
GetTokenKinds("#define A\n#define B\n#define C\n" + program));
98
Assert.AreEqual(new int[] { Tokens.Protected, Tokens.String, Tokens.EOF },
99
GetTokenKinds("#define B\n" + program));
100
Assert.AreEqual(new int[] { Tokens.Protected, Tokens.Sealed, Tokens.String, Tokens.EOF },
101
GetTokenKinds("#define B\n#define C\n" + program));
105
public void TestDefineInIfDef()
118
Assert.AreEqual(new int[] { Tokens.Class, Tokens.Struct, Tokens.EOF }, GetTokenKinds(program));
119
Assert.AreEqual(new int[] { Tokens.Int, Tokens.EOF }, GetTokenKinds("#define A\n" + program));
123
public void TestMultilineCommentStartInIfDef()
133
Assert.AreEqual(new int[] { Tokens.Class, Tokens.EOF }, GetTokenKinds(program));
134
Assert.AreEqual(new int[] { Tokens.Struct, Tokens.Class, Tokens.EOF }, GetTokenKinds("#define X\n" + program));
145
Assert.AreEqual(new int[] { Tokens.Semicolon, Tokens.Comma, Tokens.EOF }, GetTokenKinds(program));
146
ILexer lexer = GenerateLexer(program);
147
while (lexer.NextToken().Kind != Tokens.EOF);
148
List<ISpecial> specials = lexer.SpecialTracker.RetrieveSpecials();
150
Assert.IsTrue(specials[0] is BlankLine);
151
Assert.AreEqual(new Location(1, 1), specials[0].StartPosition);
152
Assert.AreEqual(new Location(1, 1), specials[0].EndPosition);
154
Assert.AreEqual("#region", (specials[1] as PreprocessingDirective).Cmd);
155
Assert.AreEqual("Region Title", (specials[1] as PreprocessingDirective).Arg);
156
Assert.AreEqual(new Location(2, 2), specials[1].StartPosition);
157
Assert.AreEqual(new Location(22, 2), specials[1].EndPosition);
159
Assert.AreEqual("#endregion", (specials[2] as PreprocessingDirective).Cmd);
160
Assert.AreEqual(new Location(2, 4), specials[2].StartPosition);
161
Assert.AreEqual(new Location(12, 4), specials[2].EndPosition);