pub(crate) fn options_per_data_declaration(count: usize) -> String {
let mut source = String::from("spec scale_test\n\ndata code: text\n");
for i in 0..count {
source.push_str(&format!(" -> option \"{}\"\n", nth_code(i)));
}
source.push_str("\nrule output: code\n");
source
}
pub(crate) fn unless_arms_on_shared_path(count: usize) -> String {
let mut source =
String::from("spec scale_test\n\ndata code: text\n\nrule output: veto \"no match\"\n");
for i in 0..count {
let code = nth_code(i);
source.push_str(&format!(" unless code is \"{code}\" then \"{code}\"\n"));
}
source
}
pub(crate) fn unless_arms_on_distinct_paths(count: usize) -> String {
let mut source = String::from("spec scale_test\n\n");
for i in 0..count {
source.push_str(&format!("data code_{i}: text\n"));
}
source.push_str("\nrule output: veto \"no match\"\n");
for i in 0..count {
let code = nth_code(i);
source.push_str(&format!(
" unless code_{i} is \"{code}\" then \"{code}\"\n"
));
}
source
}
pub(crate) fn conjunction_chain(length: usize) -> String {
let mut source = String::from("spec scale_test\n\n");
for i in 0..length {
source.push_str(&format!("data code_{i}: text\n"));
}
source.push_str("\nrule output: veto \"no match\"\n unless ");
for i in 0..length {
if i > 0 {
source.push_str(" and ");
}
source.push_str(&format!("code_{i} is \"X\""));
}
source.push_str(" then \"hit\"\n");
source
}
pub(crate) fn temporal_versions_of_one_spec(count: usize) -> String {
assert!(
count >= 1,
"temporal_versions_of_one_spec requires at least one version"
);
let mut source = String::from("spec scale_test\n\ndata code: text\n\nrule output: code\n");
for i in 1..count {
let year = 2000 + i as u32;
source.push_str(&format!(
"\nspec scale_test {year}-01-01\n\ndata code: text\n\nrule output: code\n"
));
}
source
}
pub(crate) fn specs_at_distinct_effective_dates(count: usize) -> String {
let mut source = String::new();
for i in 0..count {
let year = 2001 + i as u32;
source.push_str(&format!(
"spec scale_test_{i} {year}-01-01\n\ndata code: text\n\nrule output: code\n\n"
));
}
source
}
pub(crate) fn specs_all_undated(count: usize) -> String {
let mut source = String::new();
for i in 0..count {
source.push_str(&format!(
"spec scale_test_{i}\n\ndata code: text\n\nrule output: code\n\n"
));
}
source
}
fn nth_code(n: usize) -> String {
let a = (n / (26 * 26)) % 26;
let b = (n / 26) % 26;
let c = n % 26;
format!(
"{}{}{}",
(b'A' + a as u8) as char,
(b'A' + b as u8) as char,
(b'A' + c as u8) as char
)
}