#[test]
fn valid_rules_should_pass_validation() {
let cases = [
"t01_csv_basic",
"t02_csv_no_header",
"t03_json_out_context",
"t04_json_root_coalesce_default",
"t05_expr_transforms",
"t06_lookup_context",
"t07_array_index_paths",
"t08_escaped_keys",
"t09_when_mapping",
"t10_when_compare",
"t11_when_logical_ops",
"t13_expr_extended",
"t14_expr_chain",
"t15_record_when",
"t16_array_ops",
"t17_json_ops_merge",
"t18_json_ops_deep_merge",
"t19_json_ops_pick",
"t20_json_ops_omit",
"t21_json_ops_keys_values_entries",
"t22_json_ops_object_flatten",
"t23_json_ops_object_unflatten",
"t24_json_ops_missing",
"t25_json_ops_get_chain",
"t26_chain_all_ops",
"t27_json_ops_from_entries",
"t28_expr_chain_nested",
"t29_json_ops_len",
"t31_yaml_input",
"t32_toml_input",
"t33_xml_input",
"t34_excel_input",
"t35_html_input",
];
for case in cases {
let rule = load_rule(case);
if let Err(errors) = validate_rule_file(&rule) {
let codes: Vec<&'static str> = errors.iter().map(|e| e.code.as_str()).collect();
panic!("expected valid rules for {}, got {:?}", case, codes);
}
}
}
#[test]
fn invalid_rules_should_match_expected_errors() {
let cases = [
"v01_missing_mapping_value",
"v02_duplicate_target",
"v03_invalid_ref_namespace",
"v04_forward_out_reference",
"v05_unknown_op",
"v06_invalid_delimiter_length",
"v07_invalid_lookup_args",
"v08_invalid_path",
"v09_invalid_when_type",
"v10_invalid_record_when_type",
"v11_invalid_item_ref",
];
for case in cases {
let rule = load_rule(case);
let expected = load_expected_errors(case);
let errors = validate_rule_file(&rule).unwrap_err();
let actual = normalize_errors(errors);
assert_eq!(actual, expected, "error mismatch for fixture {}", case);
}
}
#[test]
fn invalid_rules_report_error_codes() {
let rule = load_rule("v01_missing_mapping_value");
let errors = validate_rule_file(&rule).unwrap_err();
let codes: Vec<ErrorCode> = errors.iter().map(|e| e.code.clone()).collect();
assert!(codes.contains(&ErrorCode::MissingMappingValue));
}