Files @ f2d5af9349ae
Branch filter:

Location: CSY/reowolf/src/protocol/tests/parser_imports.rs

f2d5af9349ae 3.4 KiB application/rls-services+xml Show Annotation Show as Raw Download as Raw
MH
initial namespaced identifier refactoring pass
/// parser_imports.rs
///
/// Simple import tests

use super::*;

#[test]
fn test_module_import() {
    Tester::new("single domain name")
        .with_source("
        #module external
        struct Foo { int field }
        ")
        .with_source("
        import external;
        int caller() {
            auto a = external::Foo{ field: 0 };
            return a.field;
        }
        ")
        .compile()
        .expect_ok();

    Tester::new("multi domain name")
        .with_source("
        #module external.domain
        struct Foo { int field }
        ")
        .with_source("
        import external.domain;
        int caller() {
            auto a = domain::Foo{ field: 0 };
            return a.field;
        }
        ")
        .compile()
        .expect_ok();

    Tester::new("aliased domain name")
        .with_source("
        #module external
        struct Foo { int field }
        ")
        .with_source("
        import external as aliased;
        int caller() {
            auto a = aliased::Foo{ field: 0 };
            return a.field;
        }
        ")
        .compile()
        .expect_ok();
}

#[test]
fn test_single_symbol_import() {
    Tester::new("specific symbol")
        .with_source("
        #module external
        struct Foo { int field }
        ")
        .with_source("
        import external::Foo;
        int caller() {
            auto a = Foo{ field: 1 };
            auto b = Foo{ field: 2 };
            return a.field + b.field;
        }")
        .compile()
        .expect_ok();

    Tester::new("specific aliased symbol")
        .with_source("
        #module external
        struct Foo { int field }
        ")
        .with_source("
        import external::Foo as Bar;
        int caller() {
            return Bar{ field: 0 }.field;
        }
        ")
        .compile()
        .expect_ok();

    // TODO: Re-enable once std lib is properly implemented
    // Tester::new("import all")
    //     .with_source("
    //     #module external
    //     struct Foo { int field }
    //     ")
    //     .with_source("
    //     import external::*;
    //     int caller() { return Foo{field:0}.field; }
    //     ")
    //     .compile()
    //     .expect_ok();
}

#[test]
fn test_multi_symbol_import() {
    Tester::new("specific symbols")
        .with_source("
        #module external
        struct Foo { byte f }
        struct Bar { byte b }
        ")
        .with_source("
        import external::{Foo, Bar};
        byte caller() {
            return Foo{f:0}.f + Bar{b:1}.b;
        }
        ")
        .compile()
        .expect_ok();

    Tester::new("aliased symbols")
        .with_source("
        #module external
        struct Foo { byte in_foo }
        struct Bar { byte in_bar }
        ")
        .with_source("
        import external::{Foo as Bar, Bar as Foo};
        byte caller() {
            return Foo{in_bar:0}.in_bar + Bar{in_foo:0}.in_foo;    
        }")
        .compile()
        .expect_ok();

    // TODO: Re-enable once std lib is properly implemented
    // Tester::new("import all")
    //     .with_source("
    //     #module external
    //     struct Foo { byte f };
    //     struct Bar { byte b };
    //     ")
    //     .with_source("
    //     import external::*;
    //     byte caller() {
    //         auto f = Foo{f:0};
    //         auto b = Bar{b:0};
    //         return f.f + b.b;
    //     }
    //     ")
    //     .compile()
    //     .expect_ok();
}