git.delta.rocks / jrsonnet / refs/commits / 9b1cb43cbd7b

difftreelog

source

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