#![allow(clippy::result_large_err)]
#![allow(clippy::unnecessary_unwrap)]
#![allow(clippy::single_match)]
#![allow(clippy::approx_constant)]
#![allow(unused_variables)]
use std::collections::HashMap;
use qlexpress::init_options::InitOptions;
use qlexpress::ql_options::QLOptions;
use qlexpress::runtime::value::DataValue;
use qlexpress::security::ql_security_strategy::QLSecurityStrategy;
use qlexpress::Express4Runner;
fn runner() -> Express4Runner {
Express4Runner::new()
}
fn open_runner() -> Express4Runner {
Express4Runner::with_init_options(
InitOptions::builder()
.security_strategy(QLSecurityStrategy::open())
.build(),
)
}
fn options() -> QLOptions {
QLOptions::builder().build()
}
#[test]
fn express4_runner_basic() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
}
#[test]
fn express4_runner_with_context() {
let r = runner();
let o = options();
let mut ctx = HashMap::new();
ctx.insert("x".to_string(), DataValue::Int(10));
assert_eq!(
r.execute("x + 5", ctx, &o).unwrap().result(),
&DataValue::Int(15)
);
}
#[test]
fn express4_runner_multi_statement() {
let r = runner();
let o = options();
assert_eq!(
r.execute("int a = 1; int b = 2; a + b", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn ql_parser_expressions() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2 * 3", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(7)
);
assert_eq!(
r.execute("(1 + 2) * 3", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(9)
);
}
#[test]
fn ql_parser_variable_declaration() {
let r = runner();
let o = options();
assert_eq!(
r.execute("int x = 42; x", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(42)
);
}
#[test]
fn ql_parser_string_literals() {
let r = runner();
let o = options();
assert_eq!(
r.execute("'hello'", HashMap::new(), &o).unwrap().result(),
&DataValue::Str("hello".into())
);
assert_eq!(
r.execute("\"world\"", HashMap::new(), &o).unwrap().result(),
&DataValue::Str("world".into())
);
}
#[test]
fn qvm_instruction_visitor_complex() {
let r = runner();
let o = options();
assert_eq!(
r.execute(
"int x = 0; for(int i = 0; i < 3; i = i + 1) { x = x + i; } x",
HashMap::new(),
&o
)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn import_manager() {
let r = runner();
let o = options();
let result = r.execute("import java.util.HashMap; 42", HashMap::new(), &o);
assert!(result.is_ok());
assert_eq!(result.unwrap().result(), &DataValue::Int(42));
}
#[test]
fn parser_operator_manager() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
assert_eq!(
r.execute("1 - 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(-1)
);
assert_eq!(
r.execute("2 * 3", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(6)
);
assert_eq!(
r.execute("true && false", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Bool(false)
);
}
#[test]
fn operator_factory() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 == 1", HashMap::new(), &o).unwrap().result(),
&DataValue::Bool(true)
);
assert_eq!(
r.execute("1 != 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Bool(true)
);
}
#[test]
fn parse_tree_structure() {
let r = runner();
let o = options();
assert_eq!(
r.execute("((1 + 2) * (3 - 1)) / 2", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn compile_cache() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
}
#[test]
fn q_context_operations() {
let r = runner();
let o = options();
assert_eq!(
r.execute(
"int x = 1;\nif(true) {\n int y = 2;\n x = x + y;\n}\nx",
HashMap::new(),
&o
)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn qvm_runtime_execution() {
let r = runner();
let o = options();
assert_eq!(
r.execute("42", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(42)
);
}
#[test]
fn q_result_types() {
let r = runner();
let o = options();
assert_eq!(
r.execute("42", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(42)
);
assert_eq!(
r.execute("'hello'", HashMap::new(), &o).unwrap().result(),
&DataValue::Str("hello".into())
);
assert_eq!(
r.execute("true", HashMap::new(), &o).unwrap().result(),
&DataValue::Bool(true)
);
assert_eq!(
r.execute("null", HashMap::new(), &o).unwrap().result(),
&DataValue::Null
);
}
#[test]
fn value_interface() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
}
#[test]
fn left_value_assignment() {
let r = runner();
let o = options();
assert_eq!(
r.execute("int x = 0; x = 10; x", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(10)
);
}
#[test]
fn qlambda_basic() {
let r = runner();
let o = options();
assert_eq!(
r.execute("f = (x) -> x * 2; f(5)", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(10)
);
}
#[test]
fn qlambda_inner_closure() {
let r = runner();
let o = options();
assert_eq!(
r.execute(
"int base = 10; f = (x) -> base + x; f(5)",
HashMap::new(),
&o
)
.unwrap()
.result(),
&DataValue::Long(15)
);
}
#[test]
fn qlambda_definition() {
let r = runner();
let o = options();
assert_eq!(
r.execute("function f(x) { return x * 2; } f(5)", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(10)
);
}
#[test]
fn member_resolver() {
let r = open_runner();
let o = options();
assert_eq!(
r.execute("m = {'a':1,'b':2}; m.size()", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(2)
);
}
#[test]
fn imethod_invoke() {
let r = open_runner();
let o = options();
assert_eq!(
r.execute("[1,2,3].size()", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn map_express_context() {
let r = runner();
let o = options();
let mut ctx = HashMap::new();
ctx.insert("a".to_string(), DataValue::Int(1));
ctx.insert("b".to_string(), DataValue::Int(2));
assert_eq!(
r.execute("a + b", ctx, &o).unwrap().result(),
&DataValue::Int(3)
);
}
#[test]
fn dynamic_variable_context() {
let r = runner();
let o = options();
assert_eq!(
r.execute("int x = 1; x = x + 1; x", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(2)
);
}
#[test]
fn data_value_types() {
let r = runner();
let o = options();
assert_eq!(
r.execute("42", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(42)
);
assert_eq!(
r.execute("42L", HashMap::new(), &o).unwrap().result(),
&DataValue::Long(42)
);
assert_eq!(
r.execute("3.14", HashMap::new(), &o).unwrap().result(),
&DataValue::Double(3.14)
);
assert_eq!(
r.execute("'hi'", HashMap::new(), &o).unwrap().result(),
&DataValue::Str("hi".into())
);
assert_eq!(
r.execute("true", HashMap::new(), &o).unwrap().result(),
&DataValue::Bool(true)
);
assert_eq!(
r.execute("null", HashMap::new(), &o).unwrap().result(),
&DataValue::Null
);
}
#[test]
fn assignable_data_value() {
let r = runner();
let o = options();
assert_eq!(
r.execute("int x = 0; x = 42; x", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(42)
);
}
#[test]
fn array_item_value() {
let r = runner();
let o = options();
assert_eq!(
r.execute("[10, 20, 30][1]", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(20)
);
}
#[test]
fn list_item_value() {
let r = runner();
let o = options();
let result = r.execute("a = [1,2,3]; a[0]", HashMap::new(), &o).unwrap();
assert_eq!(result.result(), &DataValue::Int(1));
}
#[test]
fn map_item_value() {
let r = runner();
let o = options();
assert_eq!(
r.execute("m = {'key': 'val'}; m['key']", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Str("val".into())
);
}
#[test]
fn field_value() {
let r = runner();
let o = options();
assert_eq!(
r.execute("m = {'x': 10}; m['x']", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(10)
);
}
#[test]
fn ql_exception_syntax() {
let r = runner();
let o = options();
let result = r.execute("1 +", HashMap::new(), &o);
assert!(result.is_err());
}
#[test]
fn ql_runtime_exception() {
let r = runner();
let o = options();
let result = r.execute("null + 1", HashMap::new(), &o);
assert!(result.is_err());
}
#[test]
fn ql_timeout_exception() {
let r = runner();
let o = QLOptions::builder().timeout_millis(1).build();
let result = r.execute("int i = 0; while(true) { i = i + 1; }", HashMap::new(), &o);
}
#[test]
fn error_reporter() {
let r = runner();
let o = options();
let result = r.execute("throw 'test error'", HashMap::new(), &o);
assert!(result.is_err());
}
#[test]
fn qlambda_function() {
let r = runner();
let o = options();
assert_eq!(
r.execute("f = (x) -> x + 1; f(5)", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(6)
);
}
#[test]
fn extension_function_map() {
let r = open_runner();
let o = options();
let result = r.execute("[1,2,3].map((x) -> x * 2)", HashMap::new(), &o);
assert!(result.is_ok());
}
#[test]
fn extension_function_filter() {
let r = open_runner();
let o = options();
let result = r.execute("[1,2,3,4,5].filter((x) -> x > 3)", HashMap::new(), &o);
assert!(result.is_ok());
}
#[test]
fn expression_trace() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(3)
);
}
#[test]
fn method_invoke_utils() {
let r = open_runner();
let o = options();
assert_eq!(
r.execute("[1,2,3].size()", HashMap::new(), &o)
.unwrap()
.result(),
&DataValue::Int(3)
);
}
#[test]
fn throw_utils() {
let r = runner();
let o = options();
let result = r.execute("throw 'error'", HashMap::new(), &o);
assert!(result.is_err());
}
#[test]
fn value_utils() {
let r = runner();
let o = options();
assert_eq!(
r.execute("1 + 2L", HashMap::new(), &o).unwrap().result(),
&DataValue::Long(3)
);
}
#[test]
fn println_utils() {
let r = runner();
let o = options();
assert_eq!(
r.execute("42", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(42)
);
}
#[test]
fn ql_function_util() {
let r = runner();
let o = options();
assert_eq!(
r.execute(
"function add(a, b) { return a + b; } add(3, 4)",
HashMap::new(),
&o
)
.unwrap()
.result(),
&DataValue::Int(7)
);
}
#[test]
fn number_math_null() {
let r = runner();
let o = options();
let result = r.execute("null + 1", HashMap::new(), &o);
assert!(result.is_err());
}
#[test]
fn integer_math_boundaries() {
let r = runner();
let o = options();
assert_eq!(
r.execute("0 + 0", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(0)
);
assert_eq!(
r.execute("-1 + 1", HashMap::new(), &o).unwrap().result(),
&DataValue::Int(0)
);
}
#[test]
fn long_math_large() {
let r = runner();
let o = options();
let result = r
.execute("999999999999999999L + 1L", HashMap::new(), &o)
.unwrap();
assert_eq!(result.result(), &DataValue::Long(1000000000000000000));
}
#[test]
fn floating_point_special() {
let r = runner();
let o = options();
let result = r.execute("1.0 / 0.0", HashMap::new(), &o).unwrap();
match result.result() {
DataValue::Double(d) => assert!(d.is_infinite()),
other => panic!("Expected Double infinity, got {:?}", other),
}
}
#[test]
fn big_decimal_precision() {
let r = runner();
let o = options();
let result = r.execute("1 / 3", HashMap::new(), &o).unwrap();
match result.result() {
DataValue::BigDec(s) => assert!(s.contains("3333333333")),
other => panic!("Expected BigDec, got {:?}", other),
}
}
#[test]
fn big_integer_arbitrary() {
let r = runner();
let o = options();
let result = r
.execute(
"999999999999999999 * 999999999999999999",
HashMap::new(),
&o,
)
.unwrap();
match result.result() {
DataValue::BigInt(ref s) => assert!(s.to_string().len() > 10),
DataValue::Long(_) => {} other => panic!("Expected BigInt or Long, got {:?}", other),
}
}