using Xunit;
using MathEngine.Tokenizer;
using static MathEngine.Tokenizer.Token;
using Xunit.Sdk;
using System;
namespace EngineTests.Tokenizer
{
///
/// Class for testing the Tokenizer
///
public class TokenizerTests
{
///
/// Test the Tokenizer on an empty string
///
[Fact]
public void TestTokenizeEmptystringReturnsEmptyList()
{
string testString = "";
Token one = new("1", TokenType.Numeric);
List expectedValue = new()
{
one,
Token.Plus,
one
};
List returnedValue = ExpressionTokenizer.Tokenize(testString);
Assert.Empty(returnedValue);
}
public static IEnumerable TestTokenizeStringsCases
{
get
{
Token one = new("1", TokenType.Numeric);
Token decimal_token = new("123.456", TokenType.Numeric);
Token point_five = new(".5", TokenType.Numeric);
List basic_expression = new List { one, Token.Plus, one };
return new List {
new object[] { "1+1", basic_expression},
new object[] { " 1 + 1 ", basic_expression },
new object[] { "+", new List { Token.Plus} },
new object[] { "-", new List { Token.Minus} },
new object[] { "*", new List { Token.Multiply} },
new object[] { "/", new List { Token.Divide} },
new object[] { "^", new List { Token.Exponentiation} },
new object[] { "(", new List { Token.LeftParenthesis} },
new object[] { ")", new List { Token.RightParenthesis} },
new object[] { "123.456", new List { decimal_token } },
new object[] { ".5", new List { point_five } },
};
}
}
///
/// Test the Tokenizer on strings
///
[Theory]
[MemberData(nameof(TestTokenizeStringsCases))]
public void TestTokenizeStrings(string testString, object expectedResult)
{
List returnedValue = ExpressionTokenizer.Tokenize(testString.AsSpan());
Assert.Equal(expectedResult, returnedValue);
}
///
/// Test the Tokenizer on a basic string, but with significant ammounts of whitespace
///
[Fact]
public void TestTokenizeNumberWithMultipleDecimalPointsIsInvalid()
{
string test_expression = "123.456.789";
var ex = Assert.Throws(() => ExpressionTokenizer.Tokenize(test_expression.AsSpan()));
Assert.Equal("Syntax error: The number 123.456.789 has multiple decimal point when at most one is allowed.", ex.Message);
}
///
/// Test the Tokenizer with all operators
///
[Fact]
public void TestTokenizeStringWithAllOperators()
{
//Arrange
string testString = "1+2-3*4/5";
Token one = new("1", TokenType.Numeric);
Token two = new("2", TokenType.Numeric);
Token three = new("3", TokenType.Numeric);
Token four = new("4", TokenType.Numeric);
Token five = new("5", TokenType.Numeric);
List expectedValue = new()
{
one,
Token.Plus,
two,
Token.Minus,
three,
Token.Multiply,
four,
Token.Divide,
five
};
List returnedValue = ExpressionTokenizer.Tokenize(testString);
}
}
}