using MathEngine.Parser.Tokeniser; using MathEngine.Parser.Parser; namespace EngineTests { /// /// Class for testing the Parser /// [TestClass] public class ParserTests { /// /// Test the Parser on a basic List of tokens /// [TestMethod] public void TestParserBasicExpression() { //Arrange string testString = "3+4"; List testList = Tokeniser.Tokenise(testString); Token three = new("3", Token.Type.Numeric, Token.NumericType.Decimal, 0); Token four = new("4", Token.Type.Numeric, Token.NumericType.Decimal, 0); Assert.IsNotNull(testList); Stack expectedStack = new(); expectedStack.Push(Token.Plus); expectedStack.Push(four); expectedStack.Push(three); //Act Stack returnedStack = Parser.Parse(testList); //Assert if (returnedStack.Count != expectedStack.Count) { Assert.Fail(); } else { while (returnedStack.Count > 0) { if (!returnedStack.Pop().Equals(expectedStack.Pop())) { Assert.Fail(); } } } } /// /// Test the Parser on a more compilicated basic expression to see if operator precedence is respected /// [TestMethod] public void TestParserBasicExpressionAllOperators() { //Arrange string testString = "3+4*8-47.2/9"; List testList = Tokeniser.Tokenise(testString); Token three = new("3", Token.Type.Numeric, Token.NumericType.Decimal, 0); Token four = new("4", Token.Type.Numeric, Token.NumericType.Decimal, 0); Token eight = new("8", Token.Type.Numeric, Token.NumericType.Decimal, 0); Token nine = new("9", Token.Type.Numeric, Token.NumericType.Decimal, 0); Token fourSevenPoint2 = new("47.2", Token.Type.Numeric, Token.NumericType.Decimal, 0); Assert.IsNotNull(testList); Stack expectedStack = new(); expectedStack.Push(Token.Minus); expectedStack.Push(Token.Divide); expectedStack.Push(nine); expectedStack.Push(fourSevenPoint2); expectedStack.Push(Token.Plus); expectedStack.Push(Token.Multiply); expectedStack.Push(eight); expectedStack.Push(four); expectedStack.Push(three); //Act Stack returnedStack = Parser.Parse(testList); //Assert if (returnedStack.Count != expectedStack.Count) { Assert.Fail(); } else { while (returnedStack.Count > 0) { if (!returnedStack.Pop().Equals(expectedStack.Pop())) { Assert.Fail(); } } } } } }