1mod common;23use std::path::PathBuf;45use gcmodule::Cc;6use jrsonnet_evaluator::{7 error::Result,8 function::{builtin, Builtin, CallLocation},9 gc::TraceBox,10 typed::Typed,11 val::FuncVal,12 State, Val,13};1415#[builtin]16fn a() -> Result<u32> {17 Ok(1)18}1920#[test]21fn basic_function() -> Result<()> {22 let s = State::default();23 let a: a = a {};24 let v = u32::from_untyped(25 a.call(26 s.clone(),27 s.create_default_context(),28 CallLocation::native(),29 &[],30 )?,31 s.clone(),32 )?;3334 ensure_eq!(v, 1);35 Ok(())36}3738#[builtin]39fn native_add(a: u32, b: u32) -> Result<u32> {40 Ok(a + b)41}4243#[test]44fn call_from_code() -> Result<()> {45 let s = State::default();46 s.with_stdlib();47 s.settings_mut().globals.insert(48 "nativeAdd".into(),49 Val::Func(FuncVal::StaticBuiltin(native_add::INST)),50 );5152 let v = s.evaluate_snippet_raw(53 PathBuf::new().into(),54 "55 assert nativeAdd(1, 2) == 3;56 assert nativeAdd(100, 200) == 300;57 null58 "59 .into(),60 )?;61 ensure_val_eq!(s.clone(), v, Val::Null);62 Ok(())63}6465#[builtin(fields(66 a: u3267))]68fn curried_add(this: &curried_add, b: u32) -> Result<u32> {69 Ok(this.a + b)70}7172#[builtin]73fn curry_add(a: u32) -> Result<FuncVal> {74 Ok(FuncVal::Builtin(Cc::new(TraceBox(Box::new(curried_add {75 a,76 })))))77}7879#[test]80fn nonstatic_builtin() -> Result<()> {81 let s = State::default();82 s.with_stdlib();83 s.settings_mut().globals.insert(84 "curryAdd".into(),85 Val::Func(FuncVal::StaticBuiltin(curry_add::INST)),86 );8788 let v = s.evaluate_snippet_raw(89 PathBuf::new().into(),90 "91 local a = curryAdd(1);92 local b = curryAdd(4);9394 assert a(2) == 3;95 assert a(200) == 201;9697 assert b(2) == 6;98 assert b(200) == 204;99 null100 "101 .into(),102 )?;103 ensure_val_eq!(s.clone(), v, Val::Null);104 Ok(())105}