#[cfg(test)]
mod test {
use crate::{DiagnosticCode, VirtualWorkspace};
#[test]
fn test_issue_245() {
let mut ws = VirtualWorkspace::new();
assert!(ws.check_code_for(
DiagnosticCode::NeedCheckNil,
r#"
local a --- @type table?
local _ = (a and a.type == 'change') and a.field
"#
));
}
#[test]
fn test_issue_402() {
let mut ws = VirtualWorkspace::new();
assert!(ws.check_code_for(
DiagnosticCode::NeedCheckNil,
r#"
---@class A
local a = {}
---@param self table?
function a.new(self)
if self then
self.a = 1
end
end
"#
));
}
#[test]
fn test_issue_474() {
let mut ws = VirtualWorkspace::new_with_init_std_lib();
assert!(ws.check_code_for(
DiagnosticCode::NeedCheckNil,
r#"
---@class Range4
---@class TSNode: userdata
---@field range fun(self: TSNode): Range4
---@param node_or_range TSNode|Range4
---@return Range4
function foo(node_or_range)
if type(node_or_range) == 'table' then
return node_or_range
else
return node_or_range:range()
end
end
"#
));
}
#[test]
fn test_cast() {
let mut ws = VirtualWorkspace::new();
ws.def(
r#"
---@class Cast1
---@field get fun(self: self, a: number): Cast1?
---@field get2 fun(self: self, a: number): Cast1?
"#,
);
assert!(ws.check_code_for(
DiagnosticCode::NeedCheckNil,
r#"
---@type Cast1
local A
local a = A:get(1) --[[@cast -?]]
:get2(2)
"#
));
}
#[test]
fn test_issue_895_891() {
let mut ws = VirtualWorkspace::new();
assert!(ws.check_code_for(
DiagnosticCode::NeedCheckNil,
r#"
local t = {
123,
234,
345,
}
---@param id number
function test(id) end
for i = 1, #t do
test(t[i]) -- expected 'number' but found (123|234|345)?
end
"#,
));
}
#[test]
fn test_issue_886() {
let mut ws = VirtualWorkspace::new();
assert!(ws.check_code_for(
DiagnosticCode::AssignTypeMismatch,
r#"
---@type string[]
local a = {}
-- if #a == 0 then return end
if not a[1] then return end
-- ---@type string
-- local s = a[1]
---@type string
local s = a[#a]
"#,
));
}
}