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