public void EvaluateWithThreeExpressions()
        {
            Context context = new Context();
            FunExpression expr1 = this.MakeExpression("fun(0) -> 1 end.");
            FunExpression expr2 = this.MakeExpression("fun(1) -> 1 end.");
            FunExpression expr3 = this.MakeExpression("fun(X) -> f(X-1) + f(X-2) end.");
            MultiFunExpression mexpr = new MultiFunExpression(new FunExpression[] { expr1, expr2, expr3 });

            var result = mexpr.Evaluate(context);

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(MultiFunction));

            var mfunc = (MultiFunction)result;

            Assert.IsNotNull(mfunc.Functions);
            Assert.AreEqual(3, mfunc.Functions.Count);
        }
        public void RaiseIfArityIsWrong()
        {
            Context context = new Context();
            FunExpression expr1 = this.MakeExpression("fun(0) -> 1 end.");
            FunExpression expr2 = this.MakeExpression("fun(1) -> 1 end.");
            FunExpression expr3 = this.MakeExpression("fun(X, Y) -> f(X-1) + f(X-2) end.");
            MultiFunExpression mexpr = new MultiFunExpression(new FunExpression[] { expr1, expr2, expr3 });

            try
            {
                mexpr.Evaluate(context);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.AreEqual("head mismatch", ex.Message);
            }
        }
        public void EvaluateWithOneExpression()
        {
            Context context = new Context();
            FunExpression expr = this.MakeExpression("fun(0) -> 1 end.");
            MultiFunExpression mexpr = new MultiFunExpression(new FunExpression[] { expr });

            Assert.IsFalse(mexpr.HasVariable());

            var result = mexpr.Evaluate(context);

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(MultiFunction));

            var mfunc = (MultiFunction)result;

            Assert.IsNotNull(mfunc.Functions);
            Assert.AreEqual(1, mfunc.Functions.Count);
        }