prelude!();

use ErrorKind::*;

#[test]
fn test_super_self_crate_mod() {
    let out: i64 = rune! {
        struct Foo;

        impl Foo {
            fn foo() { Self::bar() ^ 0b100000 }

            fn bar() { self::a::foo() ^ 0b10000 }
        }

        pub mod a {
            pub fn foo() { self::b::foo() ^ 0b1000 }

            pub mod b {
                pub fn foo() { super::c::foo() ^ 0b100 }
            }

            pub mod c {
                pub fn foo() { crate::root() ^ 0b10 }
            }
        }

        fn root() { 0b1 }

        Foo::foo()
    };
    assert_eq!(out, 0b111111);
}

#[test]
fn test_super_use() {
    let out: i64 = rune! {
        pub mod x {
            pub mod y {
                pub fn foo() {
                    use crate::VALUE as A;
                    use super::VALUE as B;
                    A + B
                }
            }

            const VALUE = 2;
        }

        const VALUE = 1;

        x::y::foo()
    };
    assert_eq!(out, 3);
}

#[test]
fn test_unsupported_leading_path() {
    assert_errors! {
        r#"use foo::crate::bar;"#,
        span!(9, 14), ExpectedLeadingPathSegment
    };

    assert_errors! {
        r#"use foo::{bar::crate, baz};"#,
        span!(15, 20), ExpectedLeadingPathSegment
    };
}

#[test]
fn test_import_conflict() {
    assert_errors! {
        r#"use std::{option, option};"#,
        span!(10, 16), AmbiguousItem { .. }
    };
}
