nyandere 0.1.2

i help with keeping track of purchases. meow
Documentation
use insta::assert_debug_snapshot as check;

use super::ast::*;

fn parse(src: &str) -> Script<'_> {
    Script::parse(src).unwrap()
}

#[test]
fn create_concept() {
    check!(
        parse("create concept C gtin=123456789 price=2.50€"),
        @r#"
    Script(
        [
            Stmt {
                cmd: Create(
                    Concept,
                ),
                args: Args(
                    [
                        Pos(
                            Name(
                                "C",
                            ),
                        ),
                        Named {
                            key: "gtin",
                            value: Gtin(
                                Gtin(
                                    123456789,
                                ),
                            ),
                        },
                        Named {
                            key: "price",
                            value: Money(
                                Money(
                                    250,
                                ),
                            ),
                        },
                    ],
                ),
            },
        ],
    )
    "#,
    );
}

#[test]
fn pay() {
    check!(
        parse("pay 30ct from=A to=B"),
        @r#"
    Script(
        [
            Stmt {
                cmd: Pay,
                args: Args(
                    [
                        Pos(
                            Money(
                                Money(
                                    30,
                                ),
                            ),
                        ),
                        Named {
                            key: "from",
                            value: Name(
                                "A",
                            ),
                        },
                        Named {
                            key: "to",
                            value: Name(
                                "B",
                            ),
                        },
                    ],
                ),
            },
        ],
    )
    "#,
    );
}

#[test]
fn deliver() {
    check!(
        parse("deliver 123456789 price=1€ from=A to=B"),
        @r#"
    Script(
        [
            Stmt {
                cmd: Deliver,
                args: Args(
                    [
                        Pos(
                            Gtin(
                                Gtin(
                                    123456789,
                                ),
                            ),
                        ),
                        Named {
                            key: "price",
                            value: Money(
                                Money(
                                    100,
                                ),
                            ),
                        },
                        Named {
                            key: "from",
                            value: Name(
                                "A",
                            ),
                        },
                        Named {
                            key: "to",
                            value: Name(
                                "B",
                            ),
                        },
                    ],
                ),
            },
        ],
    )
    "#,
    );
}

#[test]
fn two_of_them() {
    check!(
        parse(r#"
            create concept A
            create concept B
        "#),
        @r#"
    Script(
        [
            Stmt {
                cmd: Create(
                    Concept,
                ),
                args: Args(
                    [
                        Pos(
                            Name(
                                "A",
                            ),
                        ),
                    ],
                ),
            },
            Stmt {
                cmd: Create(
                    Concept,
                ),
                args: Args(
                    [
                        Pos(
                            Name(
                                "B",
                            ),
                        ),
                    ],
                ),
            },
        ],
    )
    "#,
    )
}