1mod common;23use std::path::PathBuf;45use gcmodule::Cc;6use jrsonnet_evaluator::{7 error::Result,8 function::{builtin, builtin::Builtin, CallLocation, FuncVal},9 gc::TraceBox,10 typed::Typed,11 State, Val,12};1314#[builtin]15fn a() -> Result<u32> {16 Ok(1)17}1819#[test]20fn basic_function() -> Result<()> {21 let s = State::default();22 let a: a = a {};23 let v = u32::from_untyped(24 a.call(25 s.clone(),26 s.create_default_context(),27 CallLocation::native(),28 &(),29 )?,30 s.clone(),31 )?;3233 ensure_eq!(v, 1);34 Ok(())35}3637#[builtin]38fn native_add(a: u32, b: u32) -> Result<u32> {39 Ok(a + b)40}4142#[test]43fn call_from_code() -> Result<()> {44 let s = State::default();45 s.with_stdlib();46 s.settings_mut().globals.insert(47 "nativeAdd".into(),48 Val::Func(FuncVal::StaticBuiltin(native_add::INST)),49 );5051 let v = s.evaluate_snippet_raw(52 PathBuf::new().into(),53 "54 assert nativeAdd(1, 2) == 3;55 assert nativeAdd(100, 200) == 300;56 null57 "58 .into(),59 )?;60 ensure_val_eq!(s.clone(), v, Val::Null);61 Ok(())62}6364#[builtin(fields(65 a: u3266))]67fn curried_add(this: &curried_add, b: u32) -> Result<u32> {68 Ok(this.a + b)69}7071#[builtin]72fn curry_add(a: u32) -> Result<FuncVal> {73 Ok(FuncVal::Builtin(Cc::new(TraceBox(Box::new(curried_add {74 a,75 })))))76}7778#[test]79fn nonstatic_builtin() -> Result<()> {80 let s = State::default();81 s.with_stdlib();82 s.settings_mut().globals.insert(83 "curryAdd".into(),84 Val::Func(FuncVal::StaticBuiltin(curry_add::INST)),85 );8687 let v = s.evaluate_snippet_raw(88 PathBuf::new().into(),89 "90 local a = curryAdd(1);91 local b = curryAdd(4);9293 assert a(2) == 3;94 assert a(200) == 201;9596 assert b(2) == 6;97 assert b(200) == 204;98 null99 "100 .into(),101 )?;102 ensure_val_eq!(s.clone(), v, Val::Null);103 Ok(())104}