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); } }