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 = u32::from_untyped(a.call(CallLocation::native(), &[])?)?;2223 ensure_eq!(v, 1);24 Ok(())25}2627#[builtin]28fn native_add(a: u32, b: u32) -> u32 {29 a + b30}31#[derive(Trace)]32struct NativeAddContextInitializer;33impl ContextInitializer for NativeAddContextInitializer {34 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {35 builder.bind(36 "nativeAdd",37 Thunk::evaluated(Val::function(native_add::INST)),38 );39 }4041 fn as_any(&self) -> &dyn std::any::Any {42 self43 }44}4546#[test]47fn call_from_code() -> Result<()> {48 let mut s = State::builder();49 s.context_initializer((50 StdContextInitializer::new(PathResolver::new_cwd_fallback()),51 NativeAddContextInitializer,52 ))53 .import_resolver(FileImportResolver::default());54 let s = s.build();5556 let v = s.evaluate_snippet(57 "snip".to_owned(),58 "59 assert nativeAdd(1, 2) == 3;60 assert nativeAdd(100, 200) == 300;61 null62 ",63 )?;64 ensure_val_eq!(v, Val::Null);65 Ok(())66}6768#[builtin(fields(69 a: u3270))]71fn curried_add(this: &curried_add, b: u32) -> u32 {72 this.a + b73}7475#[builtin]76fn curry_add(a: u32) -> FuncVal {77 FuncVal::builtin(curried_add { a })78}79#[derive(Trace)]80struct CurryAddContextInitializer;81impl ContextInitializer for CurryAddContextInitializer {82 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {83 builder.bind("curryAdd", Thunk::evaluated(Val::function(curry_add::INST)));84 }8586 fn as_any(&self) -> &dyn std::any::Any {87 self88 }89}9091#[test]92fn nonstatic_builtin() -> Result<()> {93 let mut s = State::builder();94 s.context_initializer((95 StdContextInitializer::new(PathResolver::new_cwd_fallback()),96 CurryAddContextInitializer,97 ))98 .import_resolver(FileImportResolver::default());99 let s = s.build();100101 let v = s.evaluate_snippet(102 "snip".to_owned(),103 "104 local a = curryAdd(1);105 local b = curryAdd(4);106107 assert a(2) == 3;108 assert a(200) == 201;109110 assert b(2) == 6;111 assert b(200) == 204;112 null113 ",114 )?;115 ensure_val_eq!(v, Val::Null);116 Ok(())117}