use starlark_derive::starlark_module;
use crate as starlark;
use crate::assert::Assert;
use crate::environment::GlobalsBuilder;
use crate::environment::MethodsBuilder;
use crate::values::list_or_tuple::UnpackListOrTuple;
use crate::values::Heap;
use crate::values::StringValue;
use crate::values::Value;
use crate::values::ValueOfUnchecked;
#[test]
fn test_starlark_module() {
#[starlark_module]
fn global(builder: &mut GlobalsBuilder) {
fn cc_binary(name: &str, srcs: UnpackListOrTuple<&str>) -> anyhow::Result<String> {
Ok(format!("{:?} {:?}", name, srcs.items))
}
}
let mut a = Assert::new();
a.globals_add(global);
let v = a.pass("cc_binary(name='star', srcs=['a.cc', 'b.cc'])");
assert_eq!(
v.value().unpack_str().unwrap(),
r#""star" ["a.cc", "b.cc"]"#
);
}
#[test]
fn test_starlark_methods() {
#[starlark_module]
fn methods(builder: &mut MethodsBuilder) {
fn r#enum<'v>(
this: Value<'v>,
#[starlark(require = named, default = 3)] index: i32,
heap: &'v Heap,
) -> anyhow::Result<StringValue<'v>> {
Ok(heap.alloc_str(&format!("{this} {index}")))
}
}
MethodsBuilder::new().with(methods).build();
}
#[test]
fn test_static_allowed() {
#[starlark_module]
fn globals(globals: &mut GlobalsBuilder) {
fn test<'v>() -> anyhow::Result<ValueOfUnchecked<'v, &'static str>> {
panic!()
}
}
GlobalsBuilder::standard().with(globals).build();
}