namespace HeuristicLab.Tests.Interpreter.Expressions { using HeuristicLab.Problems.ProgramSynthesis.Push.Parser; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class MixedExpressionTests : ExpressionTest { private const double Delta = 0.00000001; [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example1() { interpreter.Run("( 2 3 INTEGER.* 4.1 5.2 FLOAT.+ TRUE FALSE BOOLEAN.OR )"); Assert.AreEqual(6, interpreter.IntegerStack.Top); Assert.AreEqual(9.3, interpreter.FloatStack.Top); Assert.IsTrue(interpreter.BooleanStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example2() { interpreter.Run("( 5 1.23 INTEGER.+ ( 4 ) INTEGER.- 5.67 FLOAT.* )"); Assert.AreEqual(1, interpreter.IntegerStack.Top); Assert.AreEqual(6.9741, interpreter.FloatStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example3() { interpreter.Run("( 5 INTEGER.DUP INTEGER.+ )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example4() { interpreter.Run("( 5 CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) CODE.DO )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example5() { interpreter.Run("( DOUBLE CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) CODE.DEFINE 5 DOUBLE )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example6() { interpreter.Run("( CODE.QUOTE ( INTEGER.DUP INTEGER.+ ) DOUBLE CODE.DEFINE 5 DOUBLE )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example7() { interpreter.Run("( DOUBLE EXEC.DEFINE ( INTEGER.DUP INTEGER.+ ) 5 DOUBLE )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example8() { configuration.TopLevelPushCode = true; interpreter.IntegerStack.Push(5); interpreter.Run(@"( CODE.QUOTE ( INTEGER.POP 1 ) CODE.QUOTE ( CODE.DUP INTEGER.DUP 1 INTEGER.- CODE.DO INTEGER.* ) INTEGER.DUP 2 INTEGER.< CODE.IF )"); Assert.AreEqual(120, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.Count == 1); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example9() { interpreter.IntegerStack.Push(5); interpreter.Run("( 1 INTEGER.MAX 1 EXEC.DO*RANGE INTEGER.* )"); Assert.AreEqual(120, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example10() { interpreter.IntegerStack.Push(5); interpreter.Run("( 1 INTEGER.MAX 1 EXEC.DO*RANGE ( 2 INTEGER.* INTEGER.* ) )"); Assert.AreEqual(3840, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example11() { var program = PushParser.Parse("( INTEGER.= CODE.QUOTE FLOAT.* CODE.QUOTE FLOAT./ CODE.IF )"); interpreter.IntegerStack.Push(1, 1); interpreter.FloatStack.Push(2.1, 0.7); interpreter.Run(program); Assert.IsTrue(interpreter.IntegerStack.IsEmpty); Assert.AreEqual(1.47, interpreter.FloatStack.Top, Delta); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); interpreter.ClearStacks(); interpreter.IntegerStack.Push(1, 2); interpreter.FloatStack.Push(2.1, 0.7); interpreter.Run(program); Assert.IsTrue(interpreter.IntegerStack.IsEmpty); Assert.AreEqual(3d, interpreter.FloatStack.Top, Delta); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example12() { var program = PushParser.Parse("( INTEGER.= EXEC.IF FLOAT.* FLOAT./ )"); interpreter.IntegerStack.Push(1, 1); interpreter.FloatStack.Push(2.1, 0.7); interpreter.Run(program); Assert.IsTrue(interpreter.IntegerStack.IsEmpty); Assert.AreEqual(1.47, interpreter.FloatStack.Top, Delta); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); interpreter.ClearStacks(); interpreter.IntegerStack.Push(1, 2); interpreter.FloatStack.Push(2.1, 0.7); interpreter.Run(program); Assert.IsTrue(interpreter.IntegerStack.IsEmpty); Assert.AreEqual(3d, interpreter.FloatStack.Top, Delta); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example13() { interpreter.IntegerStack.Push(5); interpreter.Run("( EXEC.Y ( ( FALSE 2 INTEGER.* ) EXEC.IF ( ) EXEC.POP ) )"); Assert.AreEqual(10, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example14() { interpreter.IntegerStack.Push(5); interpreter.Run("( EXEC.Y ( ( 2 INTEGER.* INTEGER.DUP 1000 INTEGER.< ) EXEC.IF ( ) EXEC.POP ) )"); Assert.AreEqual(1280, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); Assert.IsTrue(interpreter.FloatStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example15() { interpreter.IntegerStack.Push(10); interpreter.FloatStack.Push(2); interpreter.Run(@"( ARG FLOAT.DEFINE EXEC.Y ( ARG FLOAT.* 1 INTEGER.- INTEGER.DUP 1 INTEGER.> EXEC.IF ( ) EXEC.POP ) )"); Assert.AreEqual(1024, interpreter.FloatStack.Top, Delta); Assert.AreEqual(1, interpreter.IntegerStack.Top); Assert.IsTrue(interpreter.CodeStack.IsEmpty); Assert.IsTrue(interpreter.ExecStack.IsEmpty); Assert.IsTrue(interpreter.NameStack.IsEmpty); Assert.IsTrue(interpreter.BooleanStack.IsEmpty); } [TestMethod] [TestProperty("Time", "Short")] [TestCategory("ExampleTest")] public void Example16() { var list = PushParser.Parse("( A B C )"); interpreter.CodeStack.Push(list); interpreter.Run("( CODE.DUP 0 CODE.INSERT )"); var id = interpreter.CodeStack.Top.GetHashCode(); if (id == default(int)) Assert.Fail(); } } }