test(tazjin/rlox): Add a handful of interpreter tests
Change-Id: I32dd896d42cc73d68d73093e9cbb74b48d95e041 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2386 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
This commit is contained in:
parent
0c1c4584cb
commit
f4a6e9f133
2 changed files with 66 additions and 0 deletions
|
@ -8,6 +8,9 @@ use std::sync::RwLock;
|
|||
// Implementation of built-in functions.
|
||||
mod builtins;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
// Tree-walk interpreter
|
||||
|
||||
// Representation of all callables, including builtins & user-defined
|
||||
|
|
63
users/tazjin/rlox/src/interpreter/tests.rs
Normal file
63
users/tazjin/rlox/src/interpreter/tests.rs
Normal file
|
@ -0,0 +1,63 @@
|
|||
use super::*;
|
||||
|
||||
/// Evaluate a code snippet, returning a value.
|
||||
fn parse_eval(code: &str) -> Value {
|
||||
let chars: Vec<char> = code.chars().collect();
|
||||
let tokens = scanner::scan(&chars).expect("could not scan code");
|
||||
let program = parser::parse(tokens).expect("could not parse code");
|
||||
Interpreter::create()
|
||||
.interpret(&program)
|
||||
.expect("could not eval code")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_if() {
|
||||
let result = parse_eval(
|
||||
r#"
|
||||
if (42 > 23)
|
||||
"pass";
|
||||
else
|
||||
"fail";
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(Value::Literal(Literal::String("pass".into())), result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_scope() {
|
||||
let result = parse_eval(
|
||||
r#"
|
||||
var result = "";
|
||||
|
||||
var a = "global a, ";
|
||||
var b = "global b, ";
|
||||
var c = "global c";
|
||||
|
||||
{
|
||||
var a = "outer a, ";
|
||||
var b = "outer b, ";
|
||||
|
||||
{
|
||||
var a = "inner a, ";
|
||||
result = a + b + c;
|
||||
}
|
||||
}
|
||||
"#,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
Value::Literal(Literal::String("inner a, outer b, global c".into())),
|
||||
result
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_binary_operators() {
|
||||
assert_eq!(Value::Literal(Literal::Number(42.0)), parse_eval("40 + 2;"));
|
||||
|
||||
assert_eq!(
|
||||
Value::Literal(Literal::String("foobar".into())),
|
||||
parse_eval("\"foo\" + \"bar\";")
|
||||
);
|
||||
}
|
Loading…
Reference in a new issue