public void CannotLookupAmbiguous()
        {
            var env = new StandardEnvironment();
            var one = new ConstantValueTestRow("one", "FOO");
            var two = new ConstantValueTestRow("two", "FOO");

            env.DefineFields(one, "one");
            env.DefineFields(two, "two");

            var ex = Assert.Catch <EvaluationException>(() => env.Lookup("FOO", null));

            Console.WriteLine(@"Expected exception: {0}", ex.Message);

            Assert.AreEqual("one", env.Lookup("FOO", "one"));
            Assert.AreEqual("two", env.Lookup("FOO", "two"));
        }
        private static object IsAbove(
            object inputKunstbaute, object inputStufe,
            object crossingKunstbaute, object crossingStufe)
        {
            const string i = "DECODE(input.KUNSTBAUTE," +
                             " 200,100, 300,100, 400,100, 500,100," +
                             " 700,-100, 1100,-100, 1200,-100, 0) + (input.STUFE ?? 0)";

            const string c = "DECODE(crossing.KUNSTBAUTE," +
                             " 200,100, 300,100, 400,100, 500,100," +
                             " 700,-100, 1100,-100, 1200,-100, 0) + (crossing.STUFE ?? 0)";

            var ie = ExpressionEvaluator.Create(i);
            var ce = ExpressionEvaluator.Create(c);
            var ee = ExpressionEvaluator.Create(string.Format("({0}) < ({1})", i, c));

            var input = new NamedValues
            {
                { "KUNSTBAUTE", inputKunstbaute },
                { "STUFE", inputStufe }
            };

            var crossing = new NamedValues
            {
                { "KUNSTBAUTE", crossingKunstbaute },
                { "STUFE", crossingStufe }
            };

            var env = new StandardEnvironment();

            env.DefineFields(input, "input");
            env.DefineFields(crossing, "crossing");

            var iv = ie.Evaluate(env);
            var cv = ce.Evaluate(env);
            var ev = ee.Evaluate(env);

            Console.WriteLine(
                @"Input: {0} level {1}, Crossing: {2} level {3}, iv={4}, cv={5}, above={6}",
                inputKunstbaute, inputStufe, crossingKunstbaute, crossingStufe,
                iv, cv, ev);

            return(ev);
        }
        public void CanLookupPrecedence()
        {
            // Lookup precedence for unqualified names:
            //   defined value < standard function < field value
            // Qualified names are always looked up on a row of fields
            // defined with the qualifier. CONCAT is a standard function.

            var          env       = new StandardEnvironment();
            var          row       = new ConstantValueTestRow("row", "CONCAT", "FOO");
            const string qualifier = "qualifier";

            Assert.Catch <EvaluationException>(() => env.Lookup("FOO", null));
            Assert.IsInstanceOf <Function>(env.Lookup("CONCAT", null));
            Assert.Catch <EvaluationException>(() => env.Lookup("CONCAT", qualifier));

            env.DefineFields(row, qualifier);

            Assert.AreEqual("row", env.Lookup("FOO", null));
            Assert.IsInstanceOf <Function>(env.Lookup("CONCAT", null));
            Assert.AreEqual("row", env.Lookup("CONCAT", qualifier));

            env.DefineValue("FOO", "foo");
            env.DefineValue("CONCAT", "value");

            Assert.AreEqual("foo", env.Lookup("FOO", null));
            Assert.AreEqual("value", env.Lookup("CONCAT", null));
            Assert.AreEqual("row", env.Lookup("CONCAT", qualifier));

            env.ForgetValue("CONCAT");
            env.ForgetValue("FOO");

            Assert.AreEqual("row", env.Lookup("FOO", null));
            Assert.IsInstanceOf <Function>(env.Lookup("CONCAT", null));
            Assert.AreEqual("row", env.Lookup("CONCAT", qualifier));

            env.ForgetFields("qualifier");

            Assert.Catch <EvaluationException>(() => env.Lookup("FOO", null));
            Assert.IsInstanceOf <Function>(env.Lookup("CONCAT", null));
            Assert.Catch <EvaluationException>(() => env.Lookup("CONCAT", qualifier));
        }