#[cfg(test)]
mod test {
    use crate::{DiagnosticCode, Emmyrc, VirtualWorkspace};

    #[test]
    fn test_1() {
        let mut ws = VirtualWorkspace::new();
        let mut config = Emmyrc::default();
        config.strict.array_index = true;
        ws.analysis.update_config(config.into());

        assert!(ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            ---@type boolean
            local b
            assert(b)

            ---@type any
            local c
            assert(c)

            ---@type unknown
            local d
            assert(d)

            ---@type boolean
            local e
            assert(e)

            ---@type number?
            local f
            assert(f)

            ---@type integer[]
            local ints = {1, 2}
            assert(ints[3])

            ---@type [integer, integer]
            local enum = {1, 2}
            assert(enum[3])
        "#
        ));
    }

    #[test]
    fn test_2() {
        let mut ws = VirtualWorkspace::new();

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            assert(true)
        "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            ---@return integer
            local function hi()
              return 1
            end
            assert(hi(1))
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            assert({}, 'hi')
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            ---@type [integer, integer]
            local enum = {1, 2}
            assert(enum[2])
            "#
        ));
    }

    #[test]
    fn test_impossible_assert() {
        let mut ws = VirtualWorkspace::new();

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            assert(false)
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            assert(nil)
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            assert(nil and 5)
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            local a = false ---@type false
            assert(a)
            "#
        ));

        assert!(!ws.check_code_for(
            DiagnosticCode::UnnecessaryAssert,
            r#"
            ---@type integer[]
            local a = {1,2,3}
            local b = a[2] ---@type integer|nil
            if not b then
              assert(b, "No second element!")
            end
            "#
        ));
    }
}
