git.delta.rocks / jrsonnet / refs/commits / 864d125a72a2

difftreelog

source

tests/tests/builtin.rs2.4 KiBsourcehistory
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::FromUntyped,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("nativeAdd", Thunk::evaluated(Val::function(native_add {})));36	}3738	fn as_any(&self) -> &dyn std::any::Any {39		self40	}41}4243#[test]44fn call_from_code() -> Result<()> {45	let mut s = State::builder();46	s.context_initializer((47		StdContextInitializer::new(PathResolver::new_cwd_fallback()),48		NativeAddContextInitializer,49	))50	.import_resolver(FileImportResolver::default());51	let s = s.build();5253	let v = s.evaluate_snippet(54		"snip".to_owned(),55		"56            assert nativeAdd(1, 2) == 3;57            assert nativeAdd(100, 200) == 300;58            null59        ",60	)?;61	ensure_val_eq!(v, Val::Null);62	Ok(())63}6465#[builtin(fields(66    a: u3267))]68fn curried_add(this: &curried_add, b: u32) -> u32 {69	this.a + b70}7172#[builtin]73fn curry_add(a: u32) -> FuncVal {74	FuncVal::builtin(curried_add { a })75}76#[derive(Trace)]77struct CurryAddContextInitializer;78impl ContextInitializer for CurryAddContextInitializer {79	fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {80		builder.bind("curryAdd", Thunk::evaluated(Val::function(curry_add {})));81	}8283	fn as_any(&self) -> &dyn std::any::Any {84		self85	}86}8788#[test]89fn nonstatic_builtin() -> Result<()> {90	let mut s = State::builder();91	s.context_initializer((92		StdContextInitializer::new(PathResolver::new_cwd_fallback()),93		CurryAddContextInitializer,94	))95	.import_resolver(FileImportResolver::default());96	let s = s.build();9798	let v = s.evaluate_snippet(99		"snip".to_owned(),100		"101            local a = curryAdd(1);102            local b = curryAdd(4);103104            assert a(2) == 3;105            assert a(200) == 201;106107            assert b(2) == 6;108            assert b(200) == 204;109            null110        ",111	)?;112	ensure_val_eq!(v, Val::Null);113	Ok(())114}