git.delta.rocks / jrsonnet / refs/commits / e9f8bf6a88b9

difftreelog

source

tests/tests/builtin.rs2.5 KiBsourcehistory
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}