vietc/engine/examples/gen_tests.rs

114 lines
3 KiB
Rust

use std::fs::File;
const INITIALS: &[&str] = &[
"", "b", "c", "ch", "d", "g", "gh", "h", "k", "kh", "l", "m", "n", "ng", "ngh", "nh", "p",
"ph", "q", "r", "s", "t", "th", "tr", "v", "x",
];
const FINALS: &[&str] = &["", "c", "ch", "m", "n", "ng", "nh", "p", "t"];
fn is_valid(init: &str, fin: &str) -> bool {
if init == "ngh" && !fin.is_empty() && fin != "n" && fin != "ng" && fin != "nh" {
return false;
}
if init == "gh" && !fin.is_empty() {
return false;
}
if init == "q" {
return false;
}
if init == "g" && !fin.is_empty() && fin != "n" && fin != "ng" {
return false;
}
if fin == "ch" && init.is_empty() {
return false;
}
if fin == "nh" && init.is_empty() {
return false;
}
true
}
fn main() {
// Telex
let telex_vowels: Vec<(&str, &str)> = vec![
("a", "af"),
("a", "as"),
("a", "aj"),
("a", "ar"),
("a", "ax"),
("a", "aw"),
("a", "aa"),
("e", "ee"),
("o", "oo"),
("o", "ow"),
("u", "uw"),
];
let mut telex_inputs = Vec::new();
for &init in INITIALS {
for &fin in FINALS {
if !is_valid(init, fin) {
continue;
}
for &(base, mod_str) in &telex_vowels {
let plain = format!("{}{}{}", init, base, fin);
let full = format!("{}{}", plain, mod_str);
if plain.len() > 10 {
continue;
}
telex_inputs.push(full);
}
}
}
// Limit to 500 cases to keep snapshot size reasonable but comprehensive
telex_inputs.truncate(500);
// VNI
let vni_vowels: Vec<(&str, &str)> = vec![
("a", "1"),
("a", "2"),
("a", "3"),
("a", "4"),
("a", "5"),
("a", "6"),
("a", "8"),
("e", "6"),
("o", "6"),
("o", "7"),
("u", "7"),
];
let mut vni_inputs = Vec::new();
for &init in INITIALS {
for &fin in FINALS {
if !is_valid(init, fin) {
continue;
}
for &(base, mod_str) in &vni_vowels {
let plain = format!("{}{}{}", init, base, fin);
let full = format!("{}{}", plain, mod_str);
if plain.len() > 10 {
continue;
}
vni_inputs.push(full);
}
}
}
vni_inputs.truncate(500);
// Ensure output directory exists
std::fs::create_dir_all("tests/testdata").unwrap();
let mut f_telex = File::create("tests/testdata/telex_inputs.json").unwrap();
serde_json::to_writer_pretty(&mut f_telex, &telex_inputs).unwrap();
let mut f_vni = File::create("tests/testdata/vni_inputs.json").unwrap();
serde_json::to_writer_pretty(&mut f_vni, &vni_inputs).unwrap();
println!(
"Generated {} Telex and {} VNI test inputs under tests/testdata/",
telex_inputs.len(),
vni_inputs.len()
);
}