|
@@ -2169,4 +2169,139 @@ void expression_tests() {
|
|
|
// random number instead of "3"
|
|
// random number instead of "3"
|
|
|
assert(value == "Length: 3");
|
|
assert(value == "Length: 3");
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ // ==================== Parameterized Expression Tests ====================
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_single", () => {
|
|
|
|
|
+ // Single parameter: $0 > 5
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0 > 5",
|
|
|
|
|
+ new NativeElement<int>(10)
|
|
|
|
|
+ );
|
|
|
|
|
+ var context = new EvaluationContext(new PropertyDictionary());
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ bool value;
|
|
|
|
|
+ assert(result.try_get_as<bool>(out value));
|
|
|
|
|
+ assert(value == true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_multiple", () => {
|
|
|
|
|
+ // Multiple parameters: $0 + $1
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0 + $1",
|
|
|
|
|
+ new NativeElement<int>(3),
|
|
|
|
|
+ new NativeElement<int>(4)
|
|
|
|
|
+ );
|
|
|
|
|
+ var context = new EvaluationContext(new PropertyDictionary());
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ int64? value;
|
|
|
|
|
+ assert(result.try_get_as<int64?>(out value));
|
|
|
|
|
+ assert(value == 7);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_with_variable", () => {
|
|
|
|
|
+ // Parameter with variable: x > $0
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("x > $0",
|
|
|
|
|
+ new NativeElement<int>(5)
|
|
|
|
|
+ );
|
|
|
|
|
+ var props = new PropertyDictionary();
|
|
|
|
|
+ props.set("x", new NativeElement<int>(10));
|
|
|
|
|
+ var context = new EvaluationContext(props);
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ bool value;
|
|
|
|
|
+ assert(result.try_get_as<bool>(out value));
|
|
|
|
|
+ assert(value == true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_string", () => {
|
|
|
|
|
+ // String parameter: $0 == "hello"
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0 == \"hello\"",
|
|
|
|
|
+ new NativeElement<string>("hello")
|
|
|
|
|
+ );
|
|
|
|
|
+ var context = new EvaluationContext(new PropertyDictionary());
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ bool value;
|
|
|
|
|
+ assert(result.try_get_as<bool>(out value));
|
|
|
|
|
+ assert(value == true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_complex_object", () => {
|
|
|
|
|
+ // Complex object parameter: $0.name
|
|
|
|
|
+ var person = new ExprTestPerson("Alice", 30);
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0.name",
|
|
|
|
|
+ new NativeElement<ExprTestPerson>(person)
|
|
|
|
|
+ );
|
|
|
|
|
+ var context = new EvaluationContext(new PropertyDictionary());
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ string value;
|
|
|
|
|
+ assert(result.try_get_as<string>(out value));
|
|
|
|
|
+ assert(value == "Alice");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_in_ternary", () => {
|
|
|
|
|
+ // Parameter in ternary: $0 ? "yes" : "no"
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0 ? \"yes\" : \"no\"",
|
|
|
|
|
+ new NativeElement<bool>(true)
|
|
|
|
|
+ );
|
|
|
|
|
+ var context = new EvaluationContext(new PropertyDictionary());
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ string value;
|
|
|
|
|
+ assert(result.try_get_as<string>(out value));
|
|
|
|
|
+ assert(value == "yes");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_in_lambda", () => {
|
|
|
|
|
+ // Parameter in lambda: items.where(i => i.rank > $0)
|
|
|
|
|
+ var persons = new Series<ExprTestPerson>();
|
|
|
|
|
+ persons.add(new ExprTestPerson("Alice", 30, 5));
|
|
|
|
|
+ persons.add(new ExprTestPerson("Bob", 25, 1));
|
|
|
|
|
+ persons.add(new ExprTestPerson("Charlie", 35, 3));
|
|
|
|
|
+
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("items.where(i => i.rank > $0)",
|
|
|
|
|
+ new NativeElement<int>(2)
|
|
|
|
|
+ );
|
|
|
|
|
+ var props = new PropertyDictionary();
|
|
|
|
|
+ props.set("items", new NativeElement<Enumerable<ExprTestPerson>?>(persons));
|
|
|
|
|
+ var context = new EvaluationContext(props);
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ Elements elements;
|
|
|
|
|
+ assert(result.try_get_as<Elements>(out elements));
|
|
|
|
|
+
|
|
|
|
|
+ var count = 0;
|
|
|
|
|
+ elements.iterate(e => count++);
|
|
|
|
|
+ assert(count == 2); // Alice (rank 5) and Charlie (rank 3)
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_range_check", () => {
|
|
|
|
|
+ // Range check with two parameters: $0 <= x && x <= $1
|
|
|
|
|
+ var expr = ExpressionParser.parse_with_params("$0 <= x && x <= $1",
|
|
|
|
|
+ new NativeElement<int>(0),
|
|
|
|
|
+ new NativeElement<int>(100)
|
|
|
|
|
+ );
|
|
|
|
|
+ var props = new PropertyDictionary();
|
|
|
|
|
+ props.set("x", new NativeElement<int>(50));
|
|
|
|
|
+ var context = new EvaluationContext(props);
|
|
|
|
|
+ var result = expr.evaluate(context);
|
|
|
|
|
+
|
|
|
|
|
+ bool value;
|
|
|
|
|
+ assert(result.try_get_as<bool>(out value));
|
|
|
|
|
+ assert(value == true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_expression_string", () => {
|
|
|
|
|
+ // Test to_expression_string returns $N format
|
|
|
|
|
+ var expr = new ParameterExpression(0, new NativeElement<int>(42));
|
|
|
|
|
+ assert(expr.to_expression_string() == "$0");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Test.add_func("/invercargill/expressions/parameter_expression_type", () => {
|
|
|
|
|
+ // Test expression_type is PARAMETER
|
|
|
|
|
+ var expr = new ParameterExpression(0, new NativeElement<int>(42));
|
|
|
|
|
+ assert(expr.expression_type == ExpressionType.PARAMETER);
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|