1mod common;23use jrsonnet_evaluator::{4 function::{builtin, builtin::Builtin, CallLocation, FuncVal},5 parser::Source,6 trace::PathResolver,7 typed::Typed,8 ContextBuilder, ContextInitializer, FileImportResolver, Result, State, Thunk, Val,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 = u32::from_untyped(a.call(22 ContextBuilder::dangerous_empty_state().build(),23 CallLocation::native(),24 &(),25 )?)?;2627 ensure_eq!(v, 1);28 Ok(())29}3031#[builtin]32fn native_add(a: u32, b: u32) -> u32 {33 a + b34}35#[derive(Trace)]36struct NativeAddContextInitializer;37impl ContextInitializer for NativeAddContextInitializer {38 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {39 builder.bind(40 "nativeAdd",41 Thunk::evaluated(Val::function(native_add::INST)),42 );43 }4445 fn as_any(&self) -> &dyn std::any::Any {46 self47 }48}4950#[test]51fn call_from_code() -> Result<()> {52 let mut s = State::builder();53 s.context_initializer((54 StdContextInitializer::new(PathResolver::new_cwd_fallback()),55 NativeAddContextInitializer,56 ))57 .import_resolver(FileImportResolver::default());58 let s = s.build();5960 let v = s.evaluate_snippet(61 "snip".to_owned(),62 "63 assert nativeAdd(1, 2) == 3;64 assert nativeAdd(100, 200) == 300;65 null66 ",67 )?;68 ensure_val_eq!(v, Val::Null);69 Ok(())70}7172#[builtin(fields(73 a: u3274))]75fn curried_add(this: &curried_add, b: u32) -> u32 {76 this.a + b77}7879#[builtin]80fn curry_add(a: u32) -> FuncVal {81 FuncVal::builtin(curried_add { a })82}83#[derive(Trace)]84struct CurryAddContextInitializer;85impl ContextInitializer for CurryAddContextInitializer {86 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {87 builder.bind("curryAdd", Thunk::evaluated(Val::function(curry_add::INST)));88 }8990 fn as_any(&self) -> &dyn std::any::Any {91 self92 }93}9495#[test]96fn nonstatic_builtin() -> Result<()> {97 let mut s = State::builder();98 s.context_initializer((99 StdContextInitializer::new(PathResolver::new_cwd_fallback()),100 CurryAddContextInitializer,101 ))102 .import_resolver(FileImportResolver::default());103 let s = s.build();104105 let v = s.evaluate_snippet(106 "snip".to_owned(),107 "108 local a = curryAdd(1);109 local b = curryAdd(4);110111 assert a(2) == 3;112 assert a(200) == 201;113114 assert b(2) == 6;115 assert b(200) == 204;116 null117 ",118 )?;119 ensure_val_eq!(v, Val::Null);120 Ok(())121}