use super::*;
use crate::rules::compiler::compile_rule;
use crate::types::RuleOrigin;
#[test]
fn all_builtins_parse_without_error() {
use crate::types::JsonRule;
use std::collections::HashMap;
let mut id_count: HashMap<String, Vec<&str>> = HashMap::new();
let mut parse_failures: Vec<(&str, String)> = Vec::new();
for (id, json) in BUILTIN_RULE_JSONS {
match serde_json::from_str::<JsonRule>(json) {
Ok(rule) => {
id_count.entry(rule.id.clone()).or_default().push(id);
}
Err(e) => {
parse_failures.push((id, e.to_string()));
eprintln!("[tokenjuice/builtin] PARSE FAIL '{}': {}", id, e);
}
}
}
for (rule_id, ids) in &id_count {
if ids.len() > 1 {
eprintln!(
"[tokenjuice/builtin] DUPLICATE id '{}' in entries: {:?}",
rule_id, ids
);
}
}
let duplicates: Vec<_> = id_count
.iter()
.filter(|(_, v)| v.len() > 1)
.map(|(k, _)| k.as_str())
.collect();
assert!(
parse_failures.is_empty(),
"builtin rule parse failures: {:?}",
parse_failures
);
assert!(
duplicates.is_empty(),
"duplicate builtin rule ids (fix builtin.rs): {:?}",
duplicates
);
}
#[test]
fn all_builtins_compile() {
use crate::types::JsonRule;
let mut compile_issues: Vec<String> = Vec::new();
for (id, json) in BUILTIN_RULE_JSONS {
let rule: JsonRule = match serde_json::from_str(json) {
Ok(r) => r,
Err(e) => {
compile_issues.push(format!("PARSE '{}': {}", id, e));
continue;
}
};
let compiled = compile_rule(rule, RuleOrigin::Builtin, format!("builtin:{}", id));
let _ = compiled; }
if !compile_issues.is_empty() {
eprintln!(
"[tokenjuice/builtin] {} compile issues (lenient — not failing test):",
compile_issues.len()
);
for issue in &compile_issues {
eprintln!(" {}", issue);
}
}
}
#[test]
fn generic_fallback_is_present() {
let has_fallback = BUILTIN_RULE_JSONS
.iter()
.any(|(id, _)| *id == "generic/fallback");
assert!(
has_fallback,
"generic/fallback must be in BUILTIN_RULE_JSONS"
);
}
#[test]
fn total_builtin_count() {
assert_eq!(
BUILTIN_RULE_JSONS.len(),
100,
"expected 100 builtin rules; update this assertion if the vendor set changes"
);
}
#[test]
fn duplicate_id_reporting_logic_works() {
use crate::types::JsonRule;
use std::collections::HashMap;
let test_entries: &[(&str, &str)] = &[
("rule-a", r#"{"id":"dup","family":"test","match":{}}"#),
("rule-b", r#"{"id":"dup","family":"test","match":{}}"#),
("rule-c", r#"{"id":"unique","family":"test","match":{}}"#),
];
let mut id_count: HashMap<String, Vec<&str>> = HashMap::new();
for (entry_id, json) in test_entries {
if let Ok(rule) = serde_json::from_str::<JsonRule>(json) {
id_count.entry(rule.id.clone()).or_default().push(entry_id);
}
}
for (rule_id, ids) in &id_count {
if ids.len() > 1 {
eprintln!("TEST duplicate '{}' in {:?}", rule_id, ids);
}
}
let duplicates: Vec<_> = id_count
.iter()
.filter(|(_, v)| v.len() > 1)
.map(|(k, _)| k.as_str())
.collect();
assert_eq!(duplicates.len(), 1, "expected exactly one duplicate");
assert_eq!(duplicates[0], "dup");
}
#[test]
fn compile_issues_reporting_logic_works() {
let mut compile_issues: Vec<String> = Vec::new();
let bad_json = "{ not valid json at all }";
if let Err(e) = serde_json::from_str::<crate::types::JsonRule>(bad_json) {
compile_issues.push(format!("PARSE 'bad-entry': {}", e));
}
assert!(!compile_issues.is_empty());
eprintln!(
"[test] {} compile issues (expected in this test):",
compile_issues.len()
);
for issue in &compile_issues {
eprintln!(" {}", issue);
}
}