Lines
100 %
Functions
Branches
use nms::interpreter::Interpreter;
use scripting::nomiscript::{Fraction, Value};
// LET
#[test]
fn test_eval_let_basic() {
let mut interp = Interpreter::new(false).unwrap();
assert_eq!(
interp.eval("(let ((x 1)) x)").unwrap(),
vec![Value::Number(Fraction::from_integer(1))]
);
}
fn test_eval_let_multiple_bindings() {
interp.eval("(let ((x 1) (y 2)) (+ x y))").unwrap(),
vec![Value::Number(Fraction::from_integer(3))]
fn test_eval_let_parallel_semantics() {
interp.eval("(let ((x 1)) (let ((x 10) (y x)) y))").unwrap(),
fn test_eval_let_bare_variable() {
interp.eval("(let ((x 1) (y)) y)").unwrap(),
vec![Value::Nil]
fn test_eval_let_multiple_body() {
interp.eval("(let ((x 1)) (+ x 1) (+ x 2))").unwrap(),
fn test_eval_let_nested() {
interp
.eval("(let ((x 1)) (let ((y (+ x 10))) (+ x y)))")
.unwrap(),
vec![Value::Number(Fraction::from_integer(12))]
fn test_eval_let_no_body_error() {
assert!(interp.eval("(let ((x 1)))").is_err());
fn test_eval_let_malformed_binding_error() {
assert!(interp.eval("(let ((1 2)) x)").is_err());
// LET*
fn test_eval_let_star_sequential() {
interp.eval("(let* ((a 1) (b (+ a 1))) b)").unwrap(),
vec![Value::Number(Fraction::from_integer(2))]
fn test_eval_let_star_chain() {
.eval("(let* ((a 1) (b (+ a 1)) (c (+ a b))) c)")
fn test_eval_let_star_multiple_body() {
assert!(
.eval("(let* ((a 1) (b (+ a 1))) (+ a b) (* a b c))")
.is_err()
.eval("(let* ((a 1) (b (+ a 1))) (+ a b) (* a b))")
fn test_eval_let_star_no_body_error() {
assert!(interp.eval("(let* ((x 1)))").is_err());
fn test_eval_let_in_defun() {
.eval("(defun dist (x1 y1 x2 y2) (let ((dx (- x2 x1)) (dy (- y2 y1))) (+ (* dx dx) (* dy dy)))) (dist 0 0 3 4)")
vec![Value::Number(Fraction::from_integer(25))]
// DEFVAR
fn test_eval_defvar() {
let results = interp.eval("(defvar *x* 42) *x*").unwrap();
assert_eq!(results, vec![Value::Number(Fraction::from_integer(42))]);
fn test_eval_defvar_no_reassign() {
let results = interp.eval("(defvar *x* 42) (defvar *x* 99) *x*").unwrap();
// DEFPARAMETER
fn test_eval_defparameter_reassigns() {
let results = interp
.eval("(defparameter *y* 42) (defparameter *y* 99) *y*")
.unwrap();
assert_eq!(results, vec![Value::Number(Fraction::from_integer(99))]);