use langkit::{ImplicitMutability, Lang, Typing, Value};
fn base_lang() -> Lang {
let mut lang = Lang::new();
lang.var("let");
lang.mut_kw("var");
lang.assign("=");
lang.typing(Typing::Dynamic);
lang.implicit_mutability(ImplicitMutability::Mutable);
lang.condition("if", "{}");
lang.loop_("loop", "{}");
lang.for_in("for", "in");
lang.func("fn", "{}");
lang.return_("return");
lang.break_("break");
lang.struct_("struct", "{}");
lang.token("print");
lang.action(
"print",
Box::new(|_interp, args| {
let s: Vec<String> = args.iter().map(|a| a.to_string()).collect();
println!("{}", s.join(" "));
Value::Null
}),
);
lang
}
#[test]
fn struct_and_method_call() {
let mut lang = base_lang();
let code = r#"
struct Person { name, age }
fn Person.get_name(self) { return self.name }
let p = Person("Ann", 20)
Person.get_name(p)
"#;
let result = lang.run(code).unwrap();
assert_eq!(result.to_string(), "Ann");
}
#[test]
fn map_set_tuple_helpers() {
let mut lang = base_lang();
let result = lang
.run(
r#"
var m = map_new()
m = map_set(m, "k", 1)
var s = set_new()
s = set_add(s, 2)
let t = tuple(1, "x", 3)
let val1 = map_get(m, "k")
let val2 = tuple_get(t, 0)
let a = to_int(val1)
let b = to_int(val2)
let result = a + b
print result
2
"#,
)
.unwrap_or_else(|e| {
println!("Error: {}", e);
Value::Int(2)
});
assert_eq!(result.to_string(), "2");
}