void Case(UString input, TokenType[] tokenTypes, params object[] expected) { Debug.Assert(expected.Length <= tokenTypes.Length); bool error = false; var lexer = new Les3Lexer(input, "", new MessageSinkFromDelegate((type, ctx, msg, args) => { TraceMessageSink.Value.Write(type, ctx, msg, args); error = true; })); int index = 0; for (int i = 0; i < tokenTypes.Length; i++) { error = false; Token token = lexer.NextToken().Value; Assert.LessOrEqual(index, token.StartIndex); Assert.AreEqual(tokenTypes[i], token.Type()); if (i < expected.Length) { var value = token.IsUninterpretedLiteral ? token.TextValue(lexer).ToString() : token.Value; var expected_i = expected[i]; if (expected[i] is Error e) { Assert.IsTrue(error, "Expected error didn't occur in «{0}»", input); expected_i = e.Value; } else { Assert.IsFalse(error, "Unexpected error in token [{0}] of «{1}»", i, input); } if (expected_i is Pair <string, Symbol> pair) { Assert.AreEqual(pair.A, value); Assert.AreEqual(pair.B, token.TypeMarker); } else { Assert.AreEqual(expected_i, value); } } index = token.EndIndex; } var nothing = lexer.NextToken(); Assert.That(!nothing.HasValue, "Extra token after the expected ones in «" + input.ToString() + "»"); }
void Case(UString input, TokenType[] tokenTypes, params object[] expected) { Debug.Assert(expected.Length <= tokenTypes.Length); bool error = false; var lexer = new Les3Lexer(input, "", new MessageSinkFromDelegate((type, ctx, msg, args) => { TraceMessageSink.Value.Write(type, ctx, msg, args); error = true; })); int index = 0; for (int i = 0; i < tokenTypes.Length; i++) { error = false; Token token = lexer.NextToken().Value; Assert.LessOrEqual(index, token.StartIndex); Assert.AreEqual(tokenTypes[i], token.Type()); if (i < expected.Length) { if (expected[i] is Error) { Assert.IsTrue(error, "Expected error didn't occur in «{0}»", input); Assert.AreEqual(((Error)expected[i]).Value, token.Value); } else { Assert.AreEqual(expected[i], token.Value); Assert.IsFalse(error, "Unexpected error in token [{0}] of «{1}»", i, input); } } index = token.EndIndex; } var nothing = lexer.NextToken(); Assert.That(!nothing.HasValue, "Extra token after the expected ones in «" + input.ToString() + "»"); }