using Xunit; using MathEngine.Parser; using MathEngine.Tokenizer; using static MathEngine.Tokenizer.Token; namespace EngineTests { /// /// Class for testing the Parser /// public class ParserTests { public static IEnumerable TestParserValidExpressionsCases { get { 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); return new List { new object[] { "1+1", new Queue(new List { one, one, Token.Plus }) }, new object[] { "1-1", new Queue(new List { one, one, Token.Minus }) }, new object[] { "1*1", new Queue(new List { one, one, Token.Multiply }) }, new object[] { "1/1", new Queue(new List { one, one, Token.Divide }) }, new object[] { "1^1", new Queue(new List { one, one, Token.Exponentiation }) }, new object[] { "3 + 4 * 2", new Queue(new List { three, four, two, Token.Multiply, Token.Plus }) }, new object[] { "(1+2)*3", new Queue(new List {one, two, Token.Plus, three, Token.Multiply }) }, new object[] { "1+(2*3)", new Queue(new List { one, two , three, Token.Multiply, Token.Plus }) }, new object[] { "((1))", new Queue(new List { one }) }, new object[] { "(1+2)+3", new Queue(new List { one, two, Token.Plus, three, Token.Plus }) }, new object[] { "1+2*3-4/2", new Queue(new List { one, two, three, Token.Multiply, Token.Plus, four, two, Token.Divide, Token.Minus }) }, new object[] { "1-2-3", new Queue(new List {one, two, Token.Minus, three, Token.Minus }) }, new object[] { "2^3^4", new Queue(new List { two, three, four, Token.Exponentiation, Token.Exponentiation }) }, new object[] { "((1+2))+((3+4))", new Queue(new List { one, two, Token.Plus, three, four, Token.Plus, Token.Plus }) }, new object[] { "1 + ((2 + 3) * 4) - 5", new Queue(new List { one, two, three, Token.Plus, four, Token.Multiply, Token.Plus,five, Token.Minus }) }, new object[] { "1 ^ (2 + 3)", new Queue(new List { one, two, three, Token.Plus, Token.Exponentiation }) }, new object[] { " ((1 + 2) * (3 + (4 * 5)))", new Queue(new List { one, two, Token.Plus, three, four, five, Token.Multiply, Token.Plus, Token.Multiply }) }, new object[] { "(((((((1)))))))", new Queue(new List { one }) }, new object[] { "-1", new Queue(new List { one, Token.UnaryMinus }) }, new object[] { "+1", new Queue(new List { one, Token.UnaryPlus }) }, new object[] { "1+-1", new Queue(new List { one, one, Token.UnaryMinus, Token.Plus }) }, new object[] { "-(1+2)", new Queue(new List { one, two, Token.Plus, Token.UnaryMinus }) }, new object[] { "--1", new Queue(new List { one, Token.UnaryMinus, Token.UnaryMinus }) }, new object[] { "+-1", new Queue(new List { one, Token.UnaryMinus, Token.UnaryPlus }) }, new object[] { "-3^2", new Queue(new List { three, two, Token.Exponentiation, Token.UnaryMinus}) }, new object[] { "1++2", new Queue(new List { one, two, Token.UnaryPlus, Token.Plus}) }, new object[] { "1--2", new Queue(new List { one, two, Token.UnaryMinus, Token.Minus }) }, }; } } /// /// Test the Parser on valid expressions /// [Theory] [MemberData(nameof(TestParserValidExpressionsCases))] public void TestParserValidExpressions(string expression, object expected_result) { List testList = ExpressionTokenizer.Tokenize(expression); Queue returned_rpn_qeue = Parser.Parse(testList); Assert.Equal(expected_result, returned_rpn_qeue); } public static IEnumerable TestParserInValidExpressionsCases { get { 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); return new List { new object[] { "1//1", new Queue(new List { one, one, Token.Plus }) }, }; } } /// /// Test the Parser on invalid expressions /// These are expressions that are considered Parsing errors, such /// [Theory] [MemberData(nameof(TestParserInValidExpressionsCases))] public void TestParserInValidExpressions(string expression, object expected_result) { Assert.True(true); return; //List testList = ExpressionTokenizer.Tokenize(expression); //Queue returned_rpn_qeue = Parser.Parse(testList); //Assert.Equal(expected_result, returned_rpn_qeue); } } }