nyavascript 0.1.0

Lisp implementation. Called NyavaScript because I'm a monster
Documentation
use super::*;
use crate::s_expression::SExpressionRef as SXRef;

#[test]
fn iter_works() {
    let subject = ConsCell::new(
        SXRef::number(1),
        SXRef::cons_cell(ConsCell::new(
            SXRef::number(2),
            SXRef::cons_cell(ConsCell::new(
                SXRef::number(3),
                SXRef::nil(),
            )),
        )),
    );

    let mut iter = subject.iter();

    assert_eq!(
        Some(SXRef::number(1)),
        iter.next(),
    );

    assert_eq!(
        Some(SXRef::number(2)),
        iter.next(),
    );

    assert_eq!(
        Some(SXRef::number(3)),
        iter.next(),
    );

    assert_eq!(
        None,
        iter.next(),
    );
}

#[test]
fn display_works() {
    let subject = ConsCell::new(
        SXRef::number(1),
        SXRef::cons_cell(ConsCell::new(
            SXRef::number(2),
            SXRef::cons_cell(ConsCell::new(
                SXRef::number(3),
                SXRef::nil(),
            )),
        )),
    );

    assert_eq!(
        "(1 2 3)",
        subject.to_string(),
    );
}

#[test]
fn display_on_cons_cell_with_non_list_cdr_uses_dot_infix_notation() {
    let subject = ConsCell::new(
        SXRef::number(1),
        SXRef::number(2),
    );

    let expected = "(1 . 2)";

    let actual = subject.to_string();

    assert_eq!(expected, actual);
}

#[test]
fn display_on_list_with_last_cons_cell_with_non_list_cdr_uses_dot_infix_notation() {
    let subject = ConsCell::new(
        SXRef::number(1),
        ConsCell::new(
            SXRef::number(2),
            SXRef::number(3),
        ).into(),
    );

    let expected = "(1 2 . 3)";

    let actual = subject.to_string();

    assert_eq!(expected, actual);
}