Files
VAR.ExpressionEvaluator/VAR.ExpressionEvaluator.Tests/TokenizerTests.cs

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);
}
}
}