diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
index 65360fa8e..ef2c26728 100644
--- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
+++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
@@ -138,6 +138,8 @@
+
+
diff --git a/src/Orchard.Tests.Modules/Scripting.Dlr/EvaluatorTests.cs b/src/Orchard.Tests.Modules/Scripting.Dlr/EvaluatorTests.cs
new file mode 100644
index 000000000..5dd2b3aca
--- /dev/null
+++ b/src/Orchard.Tests.Modules/Scripting.Dlr/EvaluatorTests.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using Autofac;
+using NUnit.Framework;
+using Orchard.Scripting;
+using Orchard.Scripting.Compiler;
+using Orchard.Scripting.Dlr.Services;
+using Orchard.Tests.Stubs;
+
+namespace Orchard.Tests.Modules.Scripting.Dlr {
+ [TestFixture]
+ public class EvaluatorTests : EvaluatorTestsBase {
+ private IContainer _container;
+ private IScriptingManager _scriptingManager;
+
+ [SetUp]
+ public void Init() {
+ var builder = new ContainerBuilder();
+ builder.RegisterType().As();
+ builder.RegisterType().As();
+ _container = builder.Build();
+ _scriptingManager = _container.Resolve();
+ }
+
+ protected override EvaluationResult EvaluateSimpleExpression(string expression, Func, object> methodInvocationCallback) {
+ var evaluator = new RubyScriptExpressionEvaluator(_scriptingManager, new StubCacheManager());
+ try {
+ var value = evaluator.Evaluate(expression, new[] { new GlobalMethodProvider(methodInvocationCallback) });
+ return new EvaluationResult(value);
+ }
+ catch (Exception e) {
+ Trace.WriteLine(string.Format("Error during evaluation of '{0}': {1}", expression, e.Message));
+ return new EvaluationResult(new Error { Message = e.Message, Exception = e });
+ }
+ }
+
+ private class GlobalMethodProvider : IGlobalMethodProvider {
+ private readonly Func, object> _methodInvocationCallback;
+
+ public GlobalMethodProvider(Func, object> methodInvocationCallback) {
+ _methodInvocationCallback = methodInvocationCallback;
+ }
+
+ public void Process(GlobalMethodContext context) {
+ context.Result = _methodInvocationCallback(context.FunctionName, context.Arguments);
+ }
+ }
+ }
+}
diff --git a/src/Orchard.Tests.Modules/Scripting/EvaluatorTests.cs b/src/Orchard.Tests.Modules/Scripting/EvaluatorTests.cs
index 4f84c496c..f93c211e8 100644
--- a/src/Orchard.Tests.Modules/Scripting/EvaluatorTests.cs
+++ b/src/Orchard.Tests.Modules/Scripting/EvaluatorTests.cs
@@ -7,146 +7,17 @@ using Orchard.Scripting.Compiler;
namespace Orchard.Tests.Modules.Scripting {
[TestFixture]
- public class EvaluatorTests {
- [Test]
- public void EvaluateSimpleConstant() {
- var result = EvaluateSimpleExpression("true and true");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateInvalidBooleanExpression() {
- var result = EvaluateSimpleExpression("true and 1");
- Assert.That(result.IsError, Is.True);
- }
-
- [Test]
- public void EvaluateBooleanExpression() {
- var result = EvaluateSimpleExpression("not true");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.BoolValue, Is.EqualTo(false));
- }
-
- [Test]
- public void EvaluateSimpleArithmetic() {
- var result = EvaluateSimpleExpression("1 + 2 * 3 - 6 / 2");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(4));
- }
-
- [Test]
- public void EvaluateRelationalOperators() {
- var result = EvaluateSimpleExpression("1 < 2");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateRelationalOperators2() {
- var result = EvaluateSimpleExpression("2 <= 2");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateRelationalOperators3() {
- var result = EvaluateSimpleExpression("1 < 2 or 2 > 3 and !false");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateRelationalOperators4() {
- var result = EvaluateSimpleExpression("1 > 2 or 2 > 3 and !false");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(false));
- }
-
- [Test]
- public void EvaluateRelationalOperators5() {
- var result = EvaluateSimpleExpression("1 > 2 or 4 > 3 and !false");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateRelationalOperators6() {
- var result = EvaluateSimpleExpression("!false");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateEqualityOperators() {
- var result = EvaluateSimpleExpression("1 == 2");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(false));
- }
-
- [Test]
- public void EvaluateEqualityOperators2() {
- var result = EvaluateSimpleExpression("1 != 2");
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateSimpleMethodCall() {
- var result = EvaluateSimpleExpression("print 1 + 2 * 3 - 6 / 2",
- (m, args) => (m == "print") ? (int)args[0] * 2 : 0);
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(4 * 2));
- }
-
- [Test]
- public void EvaluateSimpleMethodCall2() {
- var result = EvaluateSimpleExpression("foo 1 + bar 3",
- (m, args) =>
- (m == "foo") ? (int)args[0] * 2 :
- (m == "bar") ? (int)args[0] : 0);
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(2 * (1 + 3)));
- }
-
- [Test]
- public void EvaluateSimpleMethodCall3() {
- var result = EvaluateSimpleExpression("foo(1) + bar(3)",
- (m, args) =>
- (m == "foo") ? (int)args[0] * 2 :
- (m == "bar") ? (int)args[0] : 0);
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(2 + 3));
- }
-
- [Test]
- public void EvaluateSimpleMethodCall4() {
- var result = EvaluateSimpleExpression("foo",
- (m, args) => (m == "foo") ? true : false);
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- [Test]
- public void EvaluateSimpleMethodCall5() {
- var result = EvaluateSimpleExpression("foo()",
- (m, args) => (m == "foo") ? true : false);
- Assert.That(result.IsError, Is.False);
- Assert.That(result.Value, Is.EqualTo(true));
- }
-
- private EvaluationResult EvaluateSimpleExpression(string expression) {
- return EvaluateSimpleExpression(expression, (m, args) => null);
- }
-
- private EvaluationResult EvaluateSimpleExpression(
- string expression, Func, object> methodInvocationCallback) {
-
+ public class EvaluatorTests : EvaluatorTestsBase {
+ protected override EvaluationResult EvaluateSimpleExpression(string expression, Func, object> methodInvocationCallback) {
var ast = new Parser(expression).Parse();
- foreach(var error in ast.GetErrors()) {
+ foreach (var error in ast.GetErrors()) {
Trace.WriteLine(string.Format("Error during parsing of '{0}': {1}", expression, error.Message));
}
- Assert.That(ast.GetErrors().Any(), Is.False);
+
+ if (ast.GetErrors().Any()) {
+ return new EvaluationResult(new Error { Message = ast.GetErrors().First().Message });
+ }
+
var result = new Interpreter().Evalutate(new EvaluationContext {
Tree = ast,
MethodInvocationCallback = methodInvocationCallback
@@ -155,4 +26,4 @@ namespace Orchard.Tests.Modules.Scripting {
return result;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Orchard.Tests.Modules/Scripting/EvaluatorTestsBase.cs b/src/Orchard.Tests.Modules/Scripting/EvaluatorTestsBase.cs
new file mode 100644
index 000000000..1f3be7ae3
--- /dev/null
+++ b/src/Orchard.Tests.Modules/Scripting/EvaluatorTestsBase.cs
@@ -0,0 +1,527 @@
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+using Orchard.Scripting.Compiler;
+
+namespace Orchard.Tests.Modules.Scripting {
+ [TestFixture]
+ public abstract class EvaluatorTestsBase {
+ [Test]
+ public void EvaluateSimpleConstant() {
+ var result = EvaluateSimpleExpression("true and true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateSimpleConstant0() {
+ var result = EvaluateSimpleExpression("true && true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression() {
+ var result = EvaluateSimpleExpression("true and 1");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression1() {
+ var result = EvaluateSimpleExpression("true && 1");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression2() {
+ var result = EvaluateSimpleExpression("true and 0");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(0));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression3() {
+ var result = EvaluateSimpleExpression("true && 0");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(0));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression4() {
+ var result = EvaluateSimpleExpression("1 and true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression5() {
+ var result = EvaluateSimpleExpression("0 and true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression6() {
+ var result = EvaluateSimpleExpression("1 && true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression7() {
+ var result = EvaluateSimpleExpression("true and 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression8() {
+ var result = EvaluateSimpleExpression("true && 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression9() {
+ var result = EvaluateSimpleExpression("'boo' and true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression10() {
+ var result = EvaluateSimpleExpression("'boo' && true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression11() {
+ var result = EvaluateSimpleExpression("true or 1");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression12() {
+ var result = EvaluateSimpleExpression("true || 1");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression13() {
+ var result = EvaluateSimpleExpression("1 or true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression14() {
+ var result = EvaluateSimpleExpression("1 || true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression15() {
+ var result = EvaluateSimpleExpression("true or 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression16() {
+ var result = EvaluateSimpleExpression("false or 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression17() {
+ var result = EvaluateSimpleExpression("nil or 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression18() {
+ var result = EvaluateSimpleExpression("'boo' or nil");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression19() {
+ var result = EvaluateSimpleExpression("true || 'boo'");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression20() {
+ var result = EvaluateSimpleExpression("'boo' or true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression21() {
+ var result = EvaluateSimpleExpression("'boo' || true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo("boo"));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression22() {
+ var result = EvaluateSimpleExpression("1 and 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(2));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression23() {
+ var result = EvaluateSimpleExpression("false and 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(false));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression24() {
+ var result = EvaluateSimpleExpression("nil and 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(null));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression25() {
+ var result = EvaluateSimpleExpression("nil and false");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(null));
+ }
+
+ [Test]
+ public void EvaluateConvertingBooleanExpression26() {
+ var result = EvaluateSimpleExpression("nil and true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(null));
+ }
+
+ [Test]
+ public void EvaluateBooleanExpression() {
+ var result = EvaluateSimpleExpression("not true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.BoolValue, Is.EqualTo(false));
+ }
+
+ [Test]
+ public void EvaluateBooleanExpression0() {
+ var result = EvaluateSimpleExpression("!true");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.BoolValue, Is.EqualTo(false));
+ }
+
+ [Test]
+ public void EvaluateSimpleArithmetic() {
+ var result = EvaluateSimpleExpression("1 + 2 * 3 - 6 / 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(4));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators() {
+ var result = EvaluateSimpleExpression("1 < 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators2() {
+ var result = EvaluateSimpleExpression("2 <= 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators3() {
+ var result = EvaluateSimpleExpression("1 < 2 or 2 > 3 and !false");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators4() {
+ var result = EvaluateSimpleExpression("1 > 2 or 2 > 3 and !false");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(false));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators5() {
+ var result = EvaluateSimpleExpression("1 > 2 or 4 > 3 and !false");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators6() {
+ var result = EvaluateSimpleExpression("!false");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators7() {
+ var result = EvaluateSimpleExpression("5 || 10 && nil");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(5));
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators8() {
+ var result = EvaluateSimpleExpression("true or false and nil");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.IsNull, Is.True);
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators9() {
+ var result = EvaluateSimpleExpression("true and nil");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.IsNull, Is.True);
+ }
+
+ [Test]
+ public void EvaluateRelationalOperators10() {
+ var result = EvaluateSimpleExpression("5 and nil");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.IsNull, Is.True);
+ }
+
+ [Test]
+ public void EvaluateEqualityOperators() {
+ var result = EvaluateSimpleExpression("1 == 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(false));
+ }
+
+ [Test]
+ public void EvaluateEqualityOperators2() {
+ var result = EvaluateSimpleExpression("1 != 2");
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall() {
+ var result = EvaluateSimpleExpression("printtoto 1 + 2 * 3 - 6 / 2",
+ (m, args) => (m == "printtoto") ? (int)args[0] * 2 : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(4 * 2));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall2() {
+ var result = EvaluateSimpleExpression("printtoto(1 + 2 * 3 - 6 / 2)",
+ (m, args) => (m == "printtoto") ? (int)args[0] * 2 : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(4 * 2));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall3() {
+ var result = EvaluateSimpleExpression("foo 1 + bar 3",
+ (m, args) =>
+ (m == "foo") ? (int)args[0] * 2 :
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall4() {
+ var result = EvaluateSimpleExpression("foo(1 + bar 3)",
+ (m, args) =>
+ (m == "foo") ? (int)args[0] * 2 :
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall5() {
+ var result = EvaluateSimpleExpression("foo 1 + bar(3)",
+ (m, args) =>
+ (m == "foo") ? (int)args[0] * 2 :
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(2 * (1 + 3)));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall6() {
+ var result = EvaluateSimpleExpression("foo(1) + bar(3)",
+ (m, args) =>
+ (m == "foo") ? (int)args[0] * 2 :
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(2 + 3));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall7() {
+ var result = EvaluateSimpleExpression("foo",
+ (m, args) => (m == "foo") ? true : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall8() {
+ var result = EvaluateSimpleExpression("foo()",
+ (m, args) => (m == "foo") ? true : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall9() {
+#if false
+ var result = EvaluateSimpleExpression("1 + bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+#endif
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall10() {
+#if false
+ var result = EvaluateSimpleExpression("1 || bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+#endif
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall11() {
+#if false
+ var result = EvaluateSimpleExpression("1 * bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+#endif
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall12() {
+#if false
+ var result = EvaluateSimpleExpression("1 && bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+#endif
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall13() {
+#if false
+ var result = EvaluateSimpleExpression("(1 + bar 3)",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.True);
+#endif
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall14() {
+ var result = EvaluateSimpleExpression("1 + bar(3)",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1 + 3));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall15() {
+ var result = EvaluateSimpleExpression("1 + (bar 3)",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1 + 3));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall16() {
+ var result = EvaluateSimpleExpression("1 and bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(3));
+ }
+
+ [Test]
+ public void EvaluateSimpleMethodCall17() {
+ var result = EvaluateSimpleExpression("1 or bar 3",
+ (m, args) =>
+ (m == "bar") ? (int)args[0] : 0);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(1));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall() {
+ var result = EvaluateSimpleExpression("authenticated and url \"~/boo*\"",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall2() {
+ var result = EvaluateSimpleExpression("(authenticated) and (url \"~/boo*\")",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall3() {
+ var result = EvaluateSimpleExpression("(authenticated and url \"~/boo*\")",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall4() {
+ var result = EvaluateSimpleExpression("(authenticated) and url \"~/boo*\"",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall5() {
+ var result = EvaluateSimpleExpression("(authenticated()) and (url \"~/boo*\")",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ [Test]
+ public void EvaluateComplexMethodCall6() {
+ var result = EvaluateSimpleExpression("authenticated() and url(\"~/boo*\")",
+ (m, args) => (m == "authenticated") ? true : (m == "url") ? (string)args[0] == "~/boo*" : false);
+ Assert.That(result.IsError, Is.False);
+ Assert.That(result.Value, Is.EqualTo(true));
+ }
+
+ private EvaluationResult EvaluateSimpleExpression(string expression) {
+ return EvaluateSimpleExpression(expression, (m, args) => null);
+ }
+
+ protected abstract EvaluationResult EvaluateSimpleExpression(string expression, Func, object> methodInvocationCallback);
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Tests.Modules/Scripting/ParserTests.cs b/src/Orchard.Tests.Modules/Scripting/ParserTests.cs
index d4ecfc481..1f5afce59 100644
--- a/src/Orchard.Tests.Modules/Scripting/ParserTests.cs
+++ b/src/Orchard.Tests.Modules/Scripting/ParserTests.cs
@@ -110,6 +110,30 @@ namespace Orchard.Tests.Modules.Scripting {
});
}
+ [Test]
+ public void ParserShouldUnderstandOperatorPrecedence5() {
+ var tree = new Parser("1+2+3").Parse();
+ CheckTree(tree, new object[] {
+ "binop", TokenKind.Plus,
+ "binop", TokenKind.Plus,
+ "const", 1,
+ "const", 2,
+ "const", 3,
+ });
+ }
+
+ [Test]
+ public void ParserShouldUnderstandOperatorPrecedence6() {
+ var tree = new Parser("1+2-3").Parse();
+ CheckTree(tree, new object[] {
+ "binop", TokenKind.Minus,
+ "binop", TokenKind.Plus,
+ "const", 1,
+ "const", 2,
+ "const", 3,
+ });
+ }
+
[Test]
public void ParserShouldUnderstandRelationalOperators() {
var tree = new Parser("true == true").Parse();
@@ -184,14 +208,14 @@ namespace Orchard.Tests.Modules.Scripting {
public void ParserShouldUnderstandRelationalOperatorPrecedence() {
var tree = new Parser("1 < 2 or 2 > 3 and !false").Parse();
CheckTree(tree, new object[] {
- "binop", TokenKind.Or,
- "binop", TokenKind.LessThan,
- "const", 1,
- "const", 2,
"binop", TokenKind.And,
- "binop", TokenKind.GreaterThan,
- "const", 2,
- "const", 3,
+ "binop", TokenKind.Or,
+ "binop", TokenKind.LessThan,
+ "const", 1,
+ "const", 2,
+ "binop", TokenKind.GreaterThan,
+ "const", 2,
+ "const", 3,
"unop", TokenKind.NotSign,
"const", false,
});
@@ -201,14 +225,14 @@ namespace Orchard.Tests.Modules.Scripting {
public void ParserShouldUnderstandRelationalOperatorPrecedence2() {
var tree = new Parser("1 < 2 and 2 > 3 or !false").Parse();
CheckTree(tree, new object[] {
- "binop", TokenKind.And,
- "binop", TokenKind.LessThan,
- "const", 1,
- "const", 2,
- "binop", TokenKind.Or,
- "binop", TokenKind.GreaterThan,
- "const", 2,
- "const", 3,
+ "binop", TokenKind.Or,
+ "binop", TokenKind.And,
+ "binop", TokenKind.LessThan,
+ "const", 1,
+ "const", 2,
+ "binop", TokenKind.GreaterThan,
+ "const", 2,
+ "const", 3,
"unop", TokenKind.NotSign,
"const", false,
});
@@ -234,11 +258,11 @@ namespace Orchard.Tests.Modules.Scripting {
"binop", TokenKind.Mul,
"const", 1,
"binop", TokenKind.Plus,
- "binop", TokenKind.Div,
- "const", 2,
- "binop", TokenKind.Mul,
+ "binop", TokenKind.Mul,
+ "binop", TokenKind.Div,
+ "const", 2,
"const", 4,
- "const", 6,
+ "const", 6,
"const", 3,
});
}
@@ -246,6 +270,14 @@ namespace Orchard.Tests.Modules.Scripting {
[Test]
public void ParserShouldContainErrorExpressions() {
var tree = new Parser("1 + not 3").Parse();
+ CheckTree(tree, new object[] {
+ "error",
+ });
+ }
+
+ [Test]
+ public void ParserShouldContainErrorExpressions2() {
+ var tree = new Parser("1 +").Parse();
CheckTree(tree, new object[] {
"binop", TokenKind.Plus,
"const", 1,
diff --git a/src/Orchard.Web/Modules/Orchard.Scripting.Dlr/Services/RubyScriptExpressionEvaluator.cs b/src/Orchard.Web/Modules/Orchard.Scripting.Dlr/Services/RubyScriptExpressionEvaluator.cs
index 5f4fa40ac..61a283ce3 100644
--- a/src/Orchard.Web/Modules/Orchard.Scripting.Dlr/Services/RubyScriptExpressionEvaluator.cs
+++ b/src/Orchard.Web/Modules/Orchard.Scripting.Dlr/Services/RubyScriptExpressionEvaluator.cs
@@ -41,6 +41,12 @@ ExecContext
var ops = _cacheManager.Get("----", ctx => (ObjectOperations)_scriptingManager.ExecuteOperation(x => x));
object execContext = _cacheManager.Get(expression, ctx => (object)ops.InvokeMember(execContextType, "alloc", expression));
dynamic result = ops.InvokeMember(execContext, "evaluate", new CallbackApi(this, providers));
+ return ConvertRubyValue(result);
+ }
+
+ private object ConvertRubyValue(object result) {
+ if (result is IronRuby.Builtins.MutableString)
+ return result.ToString();
return result;
}
@@ -58,8 +64,11 @@ ExecContext
}
}
- private object Evaluate(IEnumerable providers, string name, IList