evalit 0.2.0-beta.0

a toy interpreter
Documentation
mod utils;
use evalit::{Environment, Interpreter};
use utils::init_logger;

#[test]
fn test_struct_type_simple() {
    init_logger();

    let script = r#"
    struct Person {
        name: string,
        age: int,
    }

    let person = Person {
        name: "Alice",
        age: 18,
    };

    return person.name == "Alice" && person.age == 18;
    "#;

    let result = Interpreter::eval(script, Environment::new())
        .unwrap()
        .unwrap();

    assert_eq!(result, true);
}

#[test]
fn test_struct_decl() {
    init_logger();

    let script = r#"
    struct Point {
        x: int,
        y: int,
    }

    struct Rectangle {
        point: Point,
        width: int,
        height: int,
        un_init: any,
    }

    let a = Rectangle {
        point: Point {
            x: 1,
            y: 2,
        },
        width: 3,
        height: 4,
    };


    return a.point.x == 1 && a.point.y == 2 && a.width == 3 && a.height == 4 && a.un_init == null;
    "#;

    let result = Interpreter::eval(script, Environment::new())
        .unwrap()
        .unwrap();

    assert_eq!(result, true);
}

#[test]
fn test_nested_struct() {
    init_logger();

    let script = r#"
    struct Address {
        street: string,
        city: string,
        zip: int,
    }

    struct Person {
        name: string,
        age: int,
        address: Address,
    }

    let person = Person {
        name: "Bob",
        age: 25,
        address: Address {
            street: "123 Main St",
            city: "Anytown",
            zip: 12345,
        },
    };

    return person.name == "Bob" && person.age == 25 && person.address.street == "123 Main St" && person.address.city == "Anytown" && person.address.zip == 12345;
    "#;

    let result = Interpreter::eval(script, Environment::new())
        .unwrap()
        .unwrap();

    assert_eq!(result, true);
}

#[test]
fn test_struct_array() {
    init_logger();

    let script = r#"
    struct Point {
        x: int,
        y: int,
    }

    let points = [
        Point { x: 1, y: 2 },
        Point { x: 3, y: 4 },
        Point { x: 5, y: 6 },
    ];

    return points[0].x == 1 && points[0].y == 2 && points[1].x == 3 && points[1].y == 4 && points[2].x == 5 && points[2].y == 6;
    "#;

    let result = Interpreter::eval(script, Environment::new())
        .unwrap()
        .unwrap();

    assert_eq!(result, true);
}

#[test]
fn test_struct_mutual_reference() {
    init_logger();

    let script = r#"
    struct Person {
        name: string,
        address: Address,
    }

    struct Address {
        street: string,
        city: string,
        owner: Person,
    }

    let person = Person {
        name: "Alice",
        address: Address {
            street: "123 Main St",
            city: "Anytown",
            owner: Person {
                name: "Bob",
                address: Address {
                    street: "456 Elm St",
                    city: "Othertown",
                    owner: Person {
                        name: "Charlie",
                        address: null,
                    },
                },
            },
        },
    };

    return person.name == "Alice" && person.address.street == "123 Main St" && person.address.city == "Anytown" && person.address.owner.name == "Bob" && person.address.owner.address.street == "456 Elm St" && person.address.owner.address.city == "Othertown" && person.address.owner.address.owner.name == "Charlie";
    "#;

    let result = Interpreter::eval(script, Environment::new())
        .unwrap()
        .unwrap();

    assert_eq!(result, true);
}