use dust_lang::{ error::{Error, ValidationError}, identifier::Identifier, *, }; #[test] fn function_call_with_type_argument() { assert_eq!( interpret( "test", " foobar = fn (T)(x : T) T { x } foobar::(int)::(42) ", ), Ok(Some(Value::integer(42))) ); } #[test] fn function_call() { assert_eq!( interpret( "test", " foobar = fn (message : str) str { message } foobar('Hiya') ", ), Ok(Some(Value::string("Hiya".to_string()))) ); } #[test] fn call_empty_function() { assert_eq!( interpret( "test", " foobar = fn (message : str) none {} foobar('Hiya') ", ), Ok(None) ); } #[test] fn callback() { assert_eq!( interpret( "test", " foobar = fn (cb: fn() -> str) str { cb() } foobar(fn () str { 'Hiya' }) ", ), Ok(Some(Value::string("Hiya".to_string()))) ); } #[test] fn built_in_function_call() { assert_eq!(interpret("test", "io.write_line('Hiya')"), Ok(None)); } #[test] fn function_context_does_not_capture_values() { assert_eq!( interpret( "test", " x = 1 foo = fn () any { x } " ) .unwrap_err() .errors(), &vec![Error::Validation { error: ValidationError::VariableNotFound { identifier: Identifier::new("x"), position: (50, 51).into() }, position: (32, 53).into() }] ); assert_eq!( interpret( "test", " x = 1 foo = fn (x: int) int { x } foo(2) " ), Ok(Some(Value::integer(2))) ); } #[test] fn function_context_captures_functions() { assert_eq!( interpret( "test", " bar = fn () int { 2 } foo = fn () int { bar() } foo() " ), Ok(Some(Value::integer(2))) ); } #[test] fn recursion() { assert_eq!( interpret( "test", " fib = fn (i: int) int { if i <= 1 { 1 } else { fib(i - 1) + fib(i - 2) } } fib(8) " ), Ok(Some(Value::integer(34))) ); }