use super::*;
#[test]
fn parse_error_table_literal() {
parse_errors(r#"
function stringifyTable(t)
local foo = (name = t)
return foo
end
"#)
.assert_first_message(
"Expected ')' (to close '(' at column 17), got '='; did you mean to use '{' when defining a table?",
);
}
#[test]
fn get_a_nice_error_when_there_is_no_comma_between_table_members() {
with_parse(
r#"
local t = {
first = 1
second = 2,
third = 3,
fouth = 4,
}
"#,
ParseOptions::default(),
|result| {
let result = result.unwrap();
assert_eq!(result.metadata.errors.len(), 1);
assert_eq!(
result.metadata.errors[0].location,
loc!(pos!(3, 4), pos!(3, 10))
);
assert_eq!(
result.metadata.errors[0].message,
"Expected ',' after table constructor element"
);
assert_eq!(result.root.len(), 1);
let [statement] = statement_kinds(result.root.as_slice()).exact();
let local = statement.as_local().expect("expected local statement");
let [table] = local.values else {
panic!("expected one local value");
};
let ExpressionKind::Table { items } = table.kind() else {
panic!("expected table expression");
};
assert_eq!(items.len(), 4);
},
);
}
#[test]
fn type_indexer_recovery_keeps_later_table_props() {
with_parse(
r#"
local a : { [string] : number, [number] : string, count: number }
"#,
ParseOptions::default(),
|result| {
let result = result.unwrap();
assert_eq!(result.metadata.errors.len(), 1);
},
);
}