use dust_lang::*; #[test] fn function_call() { assert_eq!( interpret( " foobar = (message ) { message } foobar('Hiya') ", ), Ok(Value::string("Hiya".to_string())) ); } #[test] fn call_empty_function() { assert_eq!( interpret( " foobar = (message ) {} foobar('Hiya') ", ), Ok(Value::none()) ); } #[test] fn callback() { assert_eq!( interpret( " foobar = (cb <() -> str>) { cb() } foobar(() { 'Hiya' }) ", ), Ok(Value::string("Hiya".to_string())) ); } #[test] fn built_in_function_call() { assert_eq!(interpret("output('Hiya')"), Ok(Value::Option(None))); } #[test] fn function_context_does_not_capture_normal_values() { assert_eq!( interpret( " x = 1 foo = () { x } " ), Err(Error::VariableIdentifierNotFound("x".to_string())) ); } #[test] fn function_context_captures_functions() { assert_eq!( interpret( " x = 1 foo = (x ) { x } foo(2) " ), Ok(Value::Integer(2)) ); assert_eq!( interpret( " bar = () { 2 } foo = () { bar() } foo() " ), Ok(Value::Integer(2)) ); assert_eq!( interpret( " foo = () { bar() } foo() bar = () { 2 } " ), Ok(Value::Integer(2)) ); } #[test] fn function_context_captures_structure_definitions() { let map = Map::new(); map.set("name".to_string(), Value::string("bob"), None) .unwrap(); assert_eq!( interpret( " User = struct { name } bob = () { new User { name = 'bob' } } bob() " ), Ok(Value::Map(map.clone())) ); assert_eq!( interpret( " bob = () { new User { name = 'bob' } } User = struct { name } bob() " ), Ok(Value::Map(map)) ); }