231 lines
6.3 KiB
C#
231 lines
6.3 KiB
C#
using System.IO;
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
|
namespace VAR.ExpressionEvaluator.Tests
|
|
{
|
|
[TestClass()]
|
|
public class TokenizerTests
|
|
{
|
|
[TestMethod()]
|
|
public void Tokenizer__Plus()
|
|
{
|
|
var testString = "10 + 20";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "10"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 10);
|
|
t.NextToken();
|
|
|
|
// "+"
|
|
Assert.AreEqual(t.Token, Token.Plus);
|
|
t.NextToken();
|
|
|
|
// "20"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 20);
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__PlusMinusAndDecimal()
|
|
{
|
|
var testString = "10 + 20 - 30.123";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "10"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 10);
|
|
t.NextToken();
|
|
|
|
// "+"
|
|
Assert.AreEqual(t.Token, Token.Plus);
|
|
t.NextToken();
|
|
|
|
// "20"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 20);
|
|
t.NextToken();
|
|
|
|
// "-"
|
|
Assert.AreEqual(t.Token, Token.Minus);
|
|
t.NextToken();
|
|
|
|
// "20"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 30.123m);
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__SimpleString()
|
|
{
|
|
var testString = "\"Hello World\"";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "Hello World"
|
|
Assert.AreEqual(t.Token, Token.String);
|
|
Assert.AreEqual(t.Text, "Hello World");
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__StringWithEscaping()
|
|
{
|
|
var testString = "\"Hello \\\"World\\\"\"";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "Hello \"World\""
|
|
Assert.AreEqual(t.Token, Token.String);
|
|
Assert.AreEqual(t.Text, "Hello \"World\"");
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__Identifiers()
|
|
{
|
|
var testString = "null true false _$variable1 $variable2 [;{}#]";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "null"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "null");
|
|
t.NextToken();
|
|
|
|
// "true"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "true");
|
|
t.NextToken();
|
|
|
|
// "false"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "false");
|
|
t.NextToken();
|
|
|
|
// "_$variable1"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "_$variable1");
|
|
t.NextToken();
|
|
|
|
// "$variable2"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "$variable2");
|
|
t.NextToken();
|
|
|
|
// ";{}#"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, ";{}#");
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__AllTogether()
|
|
{
|
|
var testString = "(10 + 20) * -30.123 + \"Hello \\\"World\\\"\" = false";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "("
|
|
Assert.AreEqual(t.Token, Token.ParenthesisStart);
|
|
t.NextToken();
|
|
|
|
// "10"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 10);
|
|
t.NextToken();
|
|
|
|
// "+"
|
|
Assert.AreEqual(t.Token, Token.Plus);
|
|
t.NextToken();
|
|
|
|
// "20"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 20);
|
|
t.NextToken();
|
|
|
|
// ")"
|
|
Assert.AreEqual(t.Token, Token.ParenthesisEnd);
|
|
t.NextToken();
|
|
|
|
// "*"
|
|
Assert.AreEqual(t.Token, Token.Multiply);
|
|
t.NextToken();
|
|
|
|
// "-"
|
|
Assert.AreEqual(t.Token, Token.Minus);
|
|
t.NextToken();
|
|
|
|
// "20"
|
|
Assert.AreEqual(t.Token, Token.Number);
|
|
Assert.AreEqual(t.Number, 30.123m);
|
|
t.NextToken();
|
|
|
|
// "+"
|
|
Assert.AreEqual(t.Token, Token.Plus);
|
|
t.NextToken();
|
|
|
|
// "Hello \"World\""
|
|
Assert.AreEqual(t.Token, Token.String);
|
|
Assert.AreEqual(t.Text, "Hello \"World\"");
|
|
t.NextToken();
|
|
|
|
// "="
|
|
Assert.AreEqual(t.Token, Token.Equals);
|
|
t.NextToken();
|
|
|
|
// "false"
|
|
Assert.AreEqual(t.Token, Token.Identifier);
|
|
Assert.AreEqual(t.Text, "false");
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
[TestMethod()]
|
|
public void Tokenizer__MoreTokens()
|
|
{
|
|
var testString = "= < > <= >= == === ";
|
|
var t = new Tokenizer(new StringReader(testString));
|
|
|
|
// "="
|
|
Assert.AreEqual(t.Token, Token.Equals);
|
|
t.NextToken();
|
|
|
|
// "<"
|
|
Assert.AreEqual(t.Token, Token.LessThan);
|
|
t.NextToken();
|
|
|
|
// ">"
|
|
Assert.AreEqual(t.Token, Token.GreaterThan);
|
|
t.NextToken();
|
|
|
|
// "<="
|
|
Assert.AreEqual(t.Token, Token.LessOrEqualThan);
|
|
t.NextToken();
|
|
|
|
// ">="
|
|
Assert.AreEqual(t.Token, Token.GreaterOrEqualThan);
|
|
t.NextToken();
|
|
|
|
// "=="
|
|
Assert.AreEqual(t.Token, Token.Equals);
|
|
t.NextToken();
|
|
|
|
// "==="
|
|
Assert.AreEqual(t.Token, Token.ExclusiveEquals);
|
|
t.NextToken();
|
|
|
|
Assert.AreEqual(t.Token, Token.EOF);
|
|
}
|
|
|
|
}
|
|
} |