114 lines
3 KiB
Rust
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()
|
|
);
|
|
}
|