1
// ****************************************************************
2
// This is free software licensed under the NUnit license. You may
3
// obtain a copy of the license at http://nunit.org
4
// ****************************************************************
9
using NUnit.UiException.CodeFormatters;
11
namespace NUnit.UiException.Tests.CodeFormatters
14
public class TestLexer
16
private TestingLexer _lexer;
21
_lexer = new TestingLexer();
27
public void Test_Default()
29
Assert.That(_lexer.CurrentToken, Is.Null);
30
Assert.That(_lexer.HasNext(), Is.False);
31
Assert.That(_lexer.Next(), Is.False);
37
[ExpectedException(typeof(ArgumentNullException))]
38
public void Test_SetText_Throws_NullArgumentException()
40
_lexer.Parse(null); // throws exception
43
private void _checkOutput(string sequence, LexToken[] expected)
46
StringBuilder recognized;
52
lexer.Parse(sequence);
54
recognized = new StringBuilder();
59
recognized.Append(lexer.CurrentToken.Text);
61
error = String.Format("Token [{0}] was expected, but lexer returned [{1}] instead, near: [{2}].",
64
recognized.ToString());
66
Assert.That(lexer.CurrentToken, Is.EqualTo(expected[i]), error);
71
Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
75
while (j < expected.Length)
77
error += expected[j].ToString();
82
Assert.That(i == expected.Length, "Error, more tokens were expected. {0}", error);
88
public void Test_Split_Words()
90
_checkOutput("one two three\r\n'",
92
new TestingToken("one", 0, LexerTag.Text),
93
new TestingToken(" ", 3, LexerTag.Separator),
94
new TestingToken("two", 4, LexerTag.Text),
95
new TestingToken(" ", 7, LexerTag.Separator),
96
new TestingToken("three", 8, LexerTag.Text),
97
new TestingToken("\r", 13, LexerTag.Separator),
98
new TestingToken("\n", 14, LexerTag.EndOfLine),
99
new TestingToken("'", 15, LexerTag.SingleQuote)
106
public void Test_Split_SingleQuote()
108
_checkOutput("'hello'",
110
new TestingToken("'", 0, LexerTag.SingleQuote),
111
new TestingToken("hello", 1, LexerTag.Text),
112
new TestingToken("'", 6, LexerTag.SingleQuote)
119
public void Test_Split_DoubleQuote()
121
_checkOutput("\"hello\"",
123
new TestingToken("\"", 0, LexerTag.DoubleQuote),
124
new TestingToken("hello", 1, LexerTag.Text),
125
new TestingToken("\"", 6, LexerTag.DoubleQuote)
129
// lexer should not be confused by escapment character \"
137
_checkOutput("\"\"hello\"\"",
139
new TestingToken("\"", 0, LexerTag.DoubleQuote),
140
new TestingToken("\"", 1, LexerTag.DoubleQuote),
141
new TestingToken("hello", 2, LexerTag.Text),
142
new TestingToken("\"", 7, LexerTag.DoubleQuote),
143
new TestingToken("\"", 8, LexerTag.DoubleQuote)
147
// lexer should not be confused by escapment character \'
155
_checkOutput("\"\'A\'\"",
157
new TestingToken("\"", 0, LexerTag.DoubleQuote),
158
new TestingToken("\'", 1, LexerTag.SingleQuote),
159
new TestingToken("A", 2, LexerTag.Text),
160
new TestingToken("\'", 3, LexerTag.SingleQuote),
161
new TestingToken("\"", 4, LexerTag.DoubleQuote)
168
public void Test_Split_NumberSign()
170
_checkOutput("#hello#",
172
new TestingToken("#", 0, LexerTag.Separator),
173
new TestingToken("hello", 1, LexerTag.Text),
174
new TestingToken("#", 6, LexerTag.Separator)
181
public void Test_Dot_Character()
183
_checkOutput("this.Something",
185
new TestingToken("this", 0, LexerTag.Text),
186
new TestingToken(".", 4, LexerTag.Separator),
187
new TestingToken("Something", 5, LexerTag.Text)
194
public void Test_Split_ColonCharacter()
198
new TestingToken(":", 0, LexerTag.Separator),
199
new TestingToken("a", 1, LexerTag.Text),
200
new TestingToken(":", 2, LexerTag.Separator)
205
new TestingToken("<", 0, LexerTag.Separator),
206
new TestingToken("a", 1, LexerTag.Text),
207
new TestingToken("<", 2, LexerTag.Separator)
212
new TestingToken(">", 0, LexerTag.Separator),
213
new TestingToken("a", 1, LexerTag.Text),
214
new TestingToken(">", 2, LexerTag.Separator)
219
new TestingToken(",", 0, LexerTag.Separator),
220
new TestingToken("a", 1, LexerTag.Text),
221
new TestingToken(",", 2, LexerTag.Separator)
228
public void Test_Split_Equals()
232
new TestingToken("=", 0, LexerTag.Separator),
233
new TestingToken("a", 1, LexerTag.Text),
234
new TestingToken("=", 2, LexerTag.Separator)
241
public void Test_Split_New_Line()
243
_checkOutput("\none\n",
245
new TestingToken("\n", 0, LexerTag.EndOfLine),
246
new TestingToken("one", 1, LexerTag.Text),
247
new TestingToken("\n", 4, LexerTag.EndOfLine)
254
public void Test_Split_WhiteSpaces()
258
_checkOutput(" hello ",
260
new TestingToken(" ", 0, LexerTag.Separator),
261
new TestingToken("hello", 1, LexerTag.Text),
262
new TestingToken(" ", 6, LexerTag.Separator)
267
_checkOutput("\rhello\r",
269
new TestingToken("\r", 0, LexerTag.Separator),
270
new TestingToken("hello", 1, LexerTag.Text),
271
new TestingToken("\r", 6, LexerTag.Separator)
276
_checkOutput(";hello;",
278
new TestingToken(";", 0, LexerTag.Separator),
279
new TestingToken("hello", 1, LexerTag.Text),
280
new TestingToken(";", 6, LexerTag.Separator)
285
_checkOutput("[hello[",
287
new TestingToken("[", 0, LexerTag.Separator),
288
new TestingToken("hello", 1, LexerTag.Text),
289
new TestingToken("[", 6, LexerTag.Separator)
294
_checkOutput("]hello]",
296
new TestingToken("]", 0, LexerTag.Separator),
297
new TestingToken("hello", 1, LexerTag.Text),
298
new TestingToken("]", 6, LexerTag.Separator)
303
_checkOutput("(hello(",
305
new TestingToken("(", 0, LexerTag.Separator),
306
new TestingToken("hello", 1, LexerTag.Text),
307
new TestingToken("(", 6, LexerTag.Separator)
312
_checkOutput(")hello)",
314
new TestingToken(")", 0, LexerTag.Separator),
315
new TestingToken("hello", 1, LexerTag.Text),
316
new TestingToken(")", 6, LexerTag.Separator)
323
public void Test_Split_CommentC()
325
_checkOutput("/*plop/*",
327
new TestingToken("/*", 0, LexerTag.CommentC_Open),
328
new TestingToken("plop", 2, LexerTag.Text),
329
new TestingToken("/*", 6, LexerTag.CommentC_Open)
333
_checkOutput("*/plop*/",
335
new TestingToken("*/", 0, LexerTag.CommentC_Close),
336
new TestingToken("plop", 2, LexerTag.Text),
337
new TestingToken("*/", 6, LexerTag.CommentC_Close)
344
public void Test_Split_CommentCpp()
346
_checkOutput("//plop//",
348
new TestingToken("//", 0, LexerTag.CommentCpp),
349
new TestingToken("plop", 2, LexerTag.Text),
350
new TestingToken("//", 6, LexerTag.CommentCpp)
359
/// Subclasses Lexer to access and test internal methods.
364
public TestingLexer()
368
public new void Clear()
381
public TestingToken(string text, int index, LexerTag tag)
1
// ****************************************************************
2
// This is free software licensed under the NUnit license. You may
3
// obtain a copy of the license at http://nunit.org
4
// ****************************************************************
9
using NUnit.UiException.CodeFormatters;
11
namespace NUnit.UiException.Tests.CodeFormatters
14
public class TestLexer
16
private TestingLexer _lexer;
21
_lexer = new TestingLexer();
27
public void Test_Default()
29
Assert.That(_lexer.CurrentToken, Is.Null);
30
Assert.That(_lexer.HasNext(), Is.False);
31
Assert.That(_lexer.Next(), Is.False);
37
[ExpectedException(typeof(ArgumentNullException))]
38
public void Test_SetText_Throws_NullArgumentException()
40
_lexer.Parse(null); // throws exception
43
private void _checkOutput(string sequence, LexToken[] expected)
46
StringBuilder recognized;
52
lexer.Parse(sequence);
54
recognized = new StringBuilder();
59
recognized.Append(lexer.CurrentToken.Text);
61
error = String.Format("Token [{0}] was expected, but lexer returned [{1}] instead, near: [{2}].",
64
recognized.ToString());
66
Assert.That(lexer.CurrentToken, Is.EqualTo(expected[i]), error);
71
Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
75
while (j < expected.Length)
77
error += expected[j].ToString();
82
Assert.That(i == expected.Length, "Error, more tokens were expected. {0}", error);
88
public void Test_Split_Words()
90
_checkOutput("one two three\r\n'",
92
new TestingToken("one", 0, LexerTag.Text),
93
new TestingToken(" ", 3, LexerTag.Separator),
94
new TestingToken("two", 4, LexerTag.Text),
95
new TestingToken(" ", 7, LexerTag.Separator),
96
new TestingToken("three", 8, LexerTag.Text),
97
new TestingToken("\r", 13, LexerTag.Separator),
98
new TestingToken("\n", 14, LexerTag.EndOfLine),
99
new TestingToken("'", 15, LexerTag.SingleQuote)
106
public void Test_Split_SingleQuote()
108
_checkOutput("'hello'",
110
new TestingToken("'", 0, LexerTag.SingleQuote),
111
new TestingToken("hello", 1, LexerTag.Text),
112
new TestingToken("'", 6, LexerTag.SingleQuote)
119
public void Test_Split_DoubleQuote()
121
_checkOutput("\"hello\"",
123
new TestingToken("\"", 0, LexerTag.DoubleQuote),
124
new TestingToken("hello", 1, LexerTag.Text),
125
new TestingToken("\"", 6, LexerTag.DoubleQuote)
129
// lexer should not be confused by escapment character \"
137
_checkOutput("\"\"hello\"\"",
139
new TestingToken("\"", 0, LexerTag.DoubleQuote),
140
new TestingToken("\"", 1, LexerTag.DoubleQuote),
141
new TestingToken("hello", 2, LexerTag.Text),
142
new TestingToken("\"", 7, LexerTag.DoubleQuote),
143
new TestingToken("\"", 8, LexerTag.DoubleQuote)
147
// lexer should not be confused by escapment character \'
155
_checkOutput("\"\'A\'\"",
157
new TestingToken("\"", 0, LexerTag.DoubleQuote),
158
new TestingToken("\'", 1, LexerTag.SingleQuote),
159
new TestingToken("A", 2, LexerTag.Text),
160
new TestingToken("\'", 3, LexerTag.SingleQuote),
161
new TestingToken("\"", 4, LexerTag.DoubleQuote)
168
public void Test_Split_NumberSign()
170
_checkOutput("#hello#",
172
new TestingToken("#", 0, LexerTag.Separator),
173
new TestingToken("hello", 1, LexerTag.Text),
174
new TestingToken("#", 6, LexerTag.Separator)
181
public void Test_Dot_Character()
183
_checkOutput("this.Something",
185
new TestingToken("this", 0, LexerTag.Text),
186
new TestingToken(".", 4, LexerTag.Separator),
187
new TestingToken("Something", 5, LexerTag.Text)
194
public void Test_Split_ColonCharacter()
198
new TestingToken(":", 0, LexerTag.Separator),
199
new TestingToken("a", 1, LexerTag.Text),
200
new TestingToken(":", 2, LexerTag.Separator)
205
new TestingToken("<", 0, LexerTag.Separator),
206
new TestingToken("a", 1, LexerTag.Text),
207
new TestingToken("<", 2, LexerTag.Separator)
212
new TestingToken(">", 0, LexerTag.Separator),
213
new TestingToken("a", 1, LexerTag.Text),
214
new TestingToken(">", 2, LexerTag.Separator)
219
new TestingToken(",", 0, LexerTag.Separator),
220
new TestingToken("a", 1, LexerTag.Text),
221
new TestingToken(",", 2, LexerTag.Separator)
228
public void Test_Split_Equals()
232
new TestingToken("=", 0, LexerTag.Separator),
233
new TestingToken("a", 1, LexerTag.Text),
234
new TestingToken("=", 2, LexerTag.Separator)
241
public void Test_Split_New_Line()
243
_checkOutput("\none\n",
245
new TestingToken("\n", 0, LexerTag.EndOfLine),
246
new TestingToken("one", 1, LexerTag.Text),
247
new TestingToken("\n", 4, LexerTag.EndOfLine)
254
public void Test_Split_WhiteSpaces()
258
_checkOutput(" hello ",
260
new TestingToken(" ", 0, LexerTag.Separator),
261
new TestingToken("hello", 1, LexerTag.Text),
262
new TestingToken(" ", 6, LexerTag.Separator)
267
_checkOutput("\rhello\r",
269
new TestingToken("\r", 0, LexerTag.Separator),
270
new TestingToken("hello", 1, LexerTag.Text),
271
new TestingToken("\r", 6, LexerTag.Separator)
276
_checkOutput(";hello;",
278
new TestingToken(";", 0, LexerTag.Separator),
279
new TestingToken("hello", 1, LexerTag.Text),
280
new TestingToken(";", 6, LexerTag.Separator)
285
_checkOutput("[hello[",
287
new TestingToken("[", 0, LexerTag.Separator),
288
new TestingToken("hello", 1, LexerTag.Text),
289
new TestingToken("[", 6, LexerTag.Separator)
294
_checkOutput("]hello]",
296
new TestingToken("]", 0, LexerTag.Separator),
297
new TestingToken("hello", 1, LexerTag.Text),
298
new TestingToken("]", 6, LexerTag.Separator)
303
_checkOutput("(hello(",
305
new TestingToken("(", 0, LexerTag.Separator),
306
new TestingToken("hello", 1, LexerTag.Text),
307
new TestingToken("(", 6, LexerTag.Separator)
312
_checkOutput(")hello)",
314
new TestingToken(")", 0, LexerTag.Separator),
315
new TestingToken("hello", 1, LexerTag.Text),
316
new TestingToken(")", 6, LexerTag.Separator)
323
public void Test_Split_CommentC()
325
_checkOutput("/*plop/*",
327
new TestingToken("/*", 0, LexerTag.CommentC_Open),
328
new TestingToken("plop", 2, LexerTag.Text),
329
new TestingToken("/*", 6, LexerTag.CommentC_Open)
333
_checkOutput("*/plop*/",
335
new TestingToken("*/", 0, LexerTag.CommentC_Close),
336
new TestingToken("plop", 2, LexerTag.Text),
337
new TestingToken("*/", 6, LexerTag.CommentC_Close)
344
public void Test_Split_CommentCpp()
346
_checkOutput("//plop//",
348
new TestingToken("//", 0, LexerTag.CommentCpp),
349
new TestingToken("plop", 2, LexerTag.Text),
350
new TestingToken("//", 6, LexerTag.CommentCpp)
359
/// Subclasses Lexer to access and test internal methods.
364
public TestingLexer()
368
public new void Clear()
381
public TestingToken(string text, int index, LexerTag tag)