nyavascript 0.1.0

Lisp implementation. Called NyavaScript because I'm a monster
Documentation
use super::*;

fn or() -> Function {
    Function::try_from(OR).unwrap()
}

#[test]
fn or_is_valid_code() {
    or();
}

#[test]
fn or_returns_nil_when_passed_no_args() {
    let or = or();

    let args: Vec<SXRef> = vec![];

    let expected = SXRef::nil();

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_returns_nil_when_passed_1_nil_args() {
    let or = or();

    let args = vec![
        SXRef::nil(),
    ];

    let expected = SXRef::nil();

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_returns_arg_when_passed_non_nil_arg() {
    let or = or();

    let args = vec![
        SXRef::number(2),
    ];

    let expected = SXRef::number(2);

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_returns_first_arg_when_passed_2_non_nil_args() {
    let or = or();

    let args = vec![
        SXRef::number(2),
        SXRef::string("foo".into()),
    ];

    let expected = SXRef::number(2);

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);

    let args = vec![
        SXRef::string("foo".into()),
        SXRef::number(2),
    ];

    let expected = SXRef::string("foo".into());

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_returns_first_arg_when_passed_1_non_nil_arg_and_1_nil() {
    let or = or();

    let args = vec![
        SXRef::number(2),
        SXRef::nil(),
    ];

    let expected = SXRef::number(2);

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_returns_2nd_arg_when_passed_1_nil_arg_and_1_non_nil() {
    let or = or();

    let args = vec![
        SXRef::nil(),
        SXRef::string("foo".into()),
    ];

    let expected = SXRef::string("foo".into());

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}

#[test]
fn or_ignores_extra_args() {
    let or = or();

    let args = vec![
        SXRef::nil(),
        SXRef::nil(),
        SXRef::number(1),
    ];

    let expected = SXRef::nil();

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);

    let args = vec![
        SXRef::nil(),
        SXRef::number(1),
        SXRef::number(2),
    ];

    let expected = SXRef::number(1);

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);

    let args = vec![
        SXRef::number(2),
        SXRef::number(1),
        SXRef::nil(),
    ];

    let expected = SXRef::number(2);

    let actual = or.execute(args, &mut mc_env()).unwrap();

    assert_eq!(expected, actual);
}