1mod common;23use jrsonnet_evaluator::{4 ContextBuilder, ContextInitializer, FileImportResolver, Result, State, Thunk, Val,5 function::{CallLocation, FuncVal, builtin, builtin::Builtin},6 parser::Source,7 trace::PathResolver,8 typed::Typed,9};10use jrsonnet_gcmodule::Trace;11use jrsonnet_stdlib::ContextInitializer as StdContextInitializer;1213#[builtin]14fn a() -> u32 {15 116}1718#[test]19fn basic_function() -> Result<()> {20 let a: a = a {};21 let v =22 u32::from_untyped(a.call(ContextBuilder::new().build(), CallLocation::native(), &())?)?;2324 ensure_eq!(v, 1);25 Ok(())26}2728#[builtin]29fn native_add(a: u32, b: u32) -> u32 {30 a + b31}32#[derive(Trace)]33struct NativeAddContextInitializer;34impl ContextInitializer for NativeAddContextInitializer {35 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {36 builder.bind(37 "nativeAdd",38 Thunk::evaluated(Val::function(native_add::INST)),39 );40 }4142 fn as_any(&self) -> &dyn std::any::Any {43 self44 }45}4647#[test]48fn call_from_code() -> Result<()> {49 let mut s = State::builder();50 s.context_initializer((51 StdContextInitializer::new(PathResolver::new_cwd_fallback()),52 NativeAddContextInitializer,53 ))54 .import_resolver(FileImportResolver::default());55 let s = s.build();5657 let v = s.evaluate_snippet(58 "snip".to_owned(),59 "60 assert nativeAdd(1, 2) == 3;61 assert nativeAdd(100, 200) == 300;62 null63 ",64 )?;65 ensure_val_eq!(v, Val::Null);66 Ok(())67}6869#[builtin(fields(70 a: u3271))]72fn curried_add(this: &curried_add, b: u32) -> u32 {73 this.a + b74}7576#[builtin]77fn curry_add(a: u32) -> FuncVal {78 FuncVal::builtin(curried_add { a })79}80#[derive(Trace)]81struct CurryAddContextInitializer;82impl ContextInitializer for CurryAddContextInitializer {83 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {84 builder.bind("curryAdd", Thunk::evaluated(Val::function(curry_add::INST)));85 }8687 fn as_any(&self) -> &dyn std::any::Any {88 self89 }90}9192#[test]93fn nonstatic_builtin() -> Result<()> {94 let mut s = State::builder();95 s.context_initializer((96 StdContextInitializer::new(PathResolver::new_cwd_fallback()),97 CurryAddContextInitializer,98 ))99 .import_resolver(FileImportResolver::default());100 let s = s.build();101102 let v = s.evaluate_snippet(103 "snip".to_owned(),104 "105 local a = curryAdd(1);106 local b = curryAdd(4);107108 assert a(2) == 3;109 assert a(200) == 201;110111 assert b(2) == 6;112 assert b(200) == 204;113 null114 ",115 )?;116 ensure_val_eq!(v, Val::Null);117 Ok(())118}