git.delta.rocks / jrsonnet / refs/commits / 0111266c91b4

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 = 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}