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

    #[test]
    fn test_issue_231() {
        let mut ws = VirtualWorkspace::new_with_init_std_lib();
        assert!(ws.check_code_for(
            DiagnosticCode::AssignTypeMismatch,
            r#"

            --- @type [boolean, string]
            local ret = { coroutine.resume(coroutine.create(function () end), ...) }
            "#
        ));
    }

    #[test]
    fn test_union_tuple() {
        let mut ws = VirtualWorkspace::new();
        ws.def(
            r#"
                local Pos = {
                    [1] = {
                        { 36,  777 },
                    },
                    [2] = {
                        { 826, 244 },
                    },
                }
                ---@type int
                local cur
                ---@type int
                local index

                local points = Pos[cur]
                ---@cast points -?
                local point = points[index] ---@cast point -?
                A = point[1]

            "#,
        );
        let ty = ws.expr_ty("A");
        let expected_ty = LuaType::Union(
            LuaUnionType::from_vec(vec![LuaType::IntegerConst(36), LuaType::IntegerConst(826)])
                .into(),
        );
        assert_eq!(ty, expected_ty);
    }

    #[test]
    fn test_issue_595() {
        let mut ws = VirtualWorkspace::new();
        ws.check_code_for(
            DiagnosticCode::AssignTypeMismatch,
            r#"
                local ret           --- @type [integer?]
                local h = ret[#ret] -- type is integer??
                if h then
                    --- @type integer
                    local _ = h
                end
            "#,
        );
    }
}
