dent-parse 0.1.0

Duck's Extensible Notation for Things (DENT) parser
Documentation
mod parser;
mod tokenizer;

use super::*;

#[test]
fn access() {
    let parser = Dent::new(HashMap::new());

    assert_eq!(parser.parse("{ foo: 1 }").unwrap()["foo"], Value::Int(1));
}

#[test]
fn access_nested() {
    let parser = Dent::new(HashMap::new());

    assert_eq!(
        parser.parse("{ foo: { bar: 1 } }").unwrap()["foo"]["bar"],
        Value::Int(1)
    );
}

#[test]
fn index() {
    let parser = Dent::new(HashMap::new());

    assert_eq!(parser.parse("[ 1 2 3 ]").unwrap()[1], Value::Int(2));
}

#[test]
fn index_nested() {
    let parser = Dent::new(HashMap::new());

    assert_eq!(parser.parse("[ [ 1 2 3 ] ]").unwrap()[0][1], Value::Int(2));
}

#[test]
fn index_access_mixed() {
    let parser = Dent::new(HashMap::new());

    assert_eq!(
        parser.parse("{ foo: [ 1 2 3 ] }").unwrap()["foo"][1],
        Value::Int(2)
    );
}

#[test]
fn import() {
    let parser = Dent::default();

    assert_eq!(
        parser.parse("@import \"examples/dent/dict.dent\""),
        Ok(Value::Dict(
            vec![
                ("name", Value::Str("Mario")),
                (
                    "skills",
                    Value::List(vec![Value::Str("jumps"), Value::Str("grows")])
                ),
                ("age", Value::Int(35)),
                ("alive", Value::Bool(true)),
            ]
            .into_iter()
            .collect()
        ))
    );
}

#[test]
fn import_mutability() {
    let parser = Dent::default();

    let mut v = parser.parse("@import \"examples/dent/dict.dent\"").unwrap();

    assert_eq!(
        v,
        Value::Dict(
            vec![
                ("name", Value::Str("Mario")),
                (
                    "skills",
                    Value::List(vec![Value::Str("jumps"), Value::Str("grows")])
                ),
                ("age", Value::Int(35)),
                ("alive", Value::Bool(true)),
            ]
            .into_iter()
            .collect()
        )
    );

    v["name"] = Value::Str("Luigi");

    assert_eq!(
        parser.parse("@import \"examples/dent/dict.dent\""),
        Ok(Value::Dict(
            vec![
                ("name", Value::Str("Mario")),
                (
                    "skills",
                    Value::List(vec![Value::Str("jumps"), Value::Str("grows")])
                ),
                ("age", Value::Int(35)),
                ("alive", Value::Bool(true)),
            ]
            .into_iter()
            .collect()
        ))
    );
}

#[test]
fn import_nested() {
    let parser = Dent::default();

    assert_eq!(
        parser.parse("{ characters: [ @import \"examples/dent/dict.dent\" ] }"),
        Ok(Value::Dict(
            vec![(
                "characters",
                Value::List(vec![Value::Dict(
                    vec![
                        ("name", Value::Str("Mario")),
                        (
                            "skills",
                            Value::List(vec![Value::Str("jumps"), Value::Str("grows")])
                        ),
                        ("age", Value::Int(35)),
                        ("alive", Value::Bool(true)),
                    ]
                    .into_iter()
                    .collect()
                )])
            )]
            .into_iter()
            .collect()
        ))
    );
}

#[test]
fn merge_dicts() {
    let parser = Dent::default();

    assert_eq!(
        parser.parse("@merge [ { a: 1 b: 2 } { b: 3 c: 4 } ]"),
        Ok(Value::Dict(
            vec![
                ("a", Value::Int(1)),
                ("b", Value::Int(3)),
                ("c", Value::Int(4)),
            ]
            .into_iter()
            .collect()
        ))
    );
}

#[test]
fn merge_lists() {
    let parser = Dent::default();

    assert_eq!(
        parser.parse("@merge [ [ 1 2 3 ] [ 4 5 6 ] ]"),
        Ok(Value::List(vec![
            Value::Int(1),
            Value::Int(2),
            Value::Int(3),
            Value::Int(4),
            Value::Int(5),
            Value::Int(6),
        ]))
    );
}

#[test]
fn recursive() {
    let parser = Dent::default();

    assert_eq!(
        parser.parse_file("examples/dent/recursive.dent"),
        Ok(Value::Dict(
            vec![("self", Value::None)].into_iter().collect()
        ))
    );
}