Beispiel #1
0
        public void verify_methods_ambiguity()
        {
            // since arguments types are not taken under consideration for methods overloading, following logic should fail
            var parser = new Parser();

            parser.AddFunction <int, string>("Whoami", i => string.Format("utility method {0}", i));
            parser.AddFunction <string, string>("Whoami", s => string.Format("utility method {0}", s));

            parser.AddFunction <string, string, string>("Glue", (s1, s2) => string.Concat(s1, s2));
            parser.AddFunction <int, int, string>("Glue", (i1, i2) => string.Concat(i1, i2));

            try
            {
                Assert.IsTrue(parser.Parse <object>("Whoami(0) == 'utility method 0'").Invoke(null));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.IsTrue(e is InvalidOperationException);
                Assert.AreEqual(
                    "Parse error: Function Whoami accepting 1 parameter is ambiguous.",
                    e.Message);
            }

            try
            {
                Assert.IsTrue(parser.Parse <object>("Glue('a', 'b') == 'ab'").Invoke(null));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.IsTrue(e is InvalidOperationException);
                Assert.AreEqual(
                    "Parse error: Function Glue accepting 2 parameters is ambiguous.",
                    e.Message);
            }

            // not only built-in, but also context extracted methods are subjected to the same rules
            parser = new Parser();
            var model = new ModelWithAmbiguousMethods();

            try
            {
                Assert.IsTrue(parser.Parse <ModelWithAmbiguousMethods>("Whoami(0) == 'model method 0'").Invoke(model));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.AreEqual(
                    "Parse error: Function Whoami accepting 1 parameter is ambiguous.",
                    e.Message);
            }
        }
        public void verify_methods_ambiguity()
        {
            // since arguments types are not taken under consideration for methods overloading, following logic should fail
            var parser = new Parser();
            parser.AddFunction<int, string>("Whoami", i => string.Format("utility method {0}", i));
            parser.AddFunction<string, string>("Whoami", s => string.Format("utility method {0}", s));

            parser.AddFunction<string, string, string>("Glue", (s1, s2) => string.Concat(s1, s2));
            parser.AddFunction<int, int, string>("Glue", (i1, i2) => string.Concat(i1, i2));

            try
            {
                Assert.IsTrue(parser.Parse<object>("Whoami(0) == 'utility method 0'").Invoke(null));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.IsTrue(e is InvalidOperationException);
                Assert.AreEqual(
                    @"Parse error on line 1, column 1:
            ... Whoami(0) == 'utility method 0' ...
            ^--- Function 'Whoami' accepting 1 argument is ambiguous.",
                    e.Message);
            }

            try
            {
                Assert.IsTrue(parser.Parse<object>("Glue('a', 'b') == 'ab'").Invoke(null));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.IsTrue(e is InvalidOperationException);
                Assert.AreEqual(
                    @"Parse error on line 1, column 1:
            ... Glue('a', 'b') == 'ab' ...
            ^--- Function 'Glue' accepting 2 arguments is ambiguous.",
                    e.Message);
            }

            // not only built-in, but also context extracted methods are subjected to the same rules
            parser = new Parser();
            var model = new ModelWithAmbiguousMethods();

            try
            {
                Assert.IsTrue(parser.Parse<ModelWithAmbiguousMethods>("Whoami(0) == 'model method 0'").Invoke(model));
                Assert.Fail();
            }
            catch (Exception e)
            {
                Assert.AreEqual(
                    @"Parse error on line 1, column 1:
            ... Whoami(0) == 'model method 0' ...
            ^--- Function 'Whoami' accepting 1 argument is ambiguous.",
                    e.Message);
            }
        }