in components/support/nimbus-fml/src/client/inspector.rs [298:452]
fn test_semantic_errors() -> Result<()> {
let client = client("./browser.yaml", "release")?;
let inspector = client
.get_feature_inspector("nimbus-validation".to_string())
.unwrap();
let do_test = |lines: &[&str], token: &str, expected: (u32, u32)| {
let input = lines.join("\n");
let err = inspector
.get_first_error(input.clone())
.unwrap_or_else(|| unreachable!("No error for \"{input}\""));
assert_eq!(
err.highlight,
Some(token.to_string()),
"Token {token} not detected in error in {input}"
);
let observed = (err.error_span.from.line, err.error_span.from.col);
assert_eq!(
expected, observed,
"Error at {token} in the wrong place in {input}"
);
};
// invalid property name.
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "invalid": 1"#, // 1
r#"}"#, // 2
],
"\"invalid\"",
(1, 2),
);
// simple type mismatch
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "icon-type": 1"#, // 1
r#"}"#, // 2
],
"1",
(1, 15),
);
// enum mismatch
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "icon-type": "invalid""#, // 1
r#"}"#, // 2
],
"\"invalid\"",
(1, 15),
);
// invalid field within object
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "nested": {"#, // 1
r#" "invalid": true"#, // 2
r#" }"#, // 3
r#"}"#, // 4
],
"\"invalid\"",
(2, 4),
);
// nested in an object type mismatch
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "nested": {"#, // 1
r#" "is-useful": 256"#, // 2
r#" }"#, // 3
r#"}"#, // 4
],
"256",
(2, 17),
);
// nested in a map type mismatch
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "string-int-map": {"#, // 1
r#" "valid": "invalid""#, // 2
r#" }"#, // 3
r#"}"#, // 4
],
"\"invalid\"",
(2, 13),
);
// invalid key in enum map
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "enum-map": {"#, // 1
r#" "invalid": 42"#, // 2
r#" }"#, // 3
r#"}"#, // 4
],
"\"invalid\"",
(2, 4),
);
// type mismatch in list
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "nested-list": ["#, // 1
r#" {"#, // 2
r#" "is-useful": true"#, // 3
r#" },"#, // 4
r#" false"#, // 5
r#" ]"#, // 6
r#"}"#, // 7
],
"false",
(5, 5),
);
// Difficult!
do_test(
&[
// 012345678901234567890
r#"{"#, // 0
r#" "string-int-map": {"#, // 1
r#" "nested": 1,"#, // 2
r#" "is-useful": 2,"#, // 3
r#" "invalid": 3"#, // 4 error is not here!
r#" },"#, // 5
r#" "nested": {"#, // 6
r#" "is-useful": "invalid""#, // 7 error is here!
r#" }"#, // 8
r#"}"#, // 9
],
"\"invalid\"",
(7, 17),
);
Ok(())
}