pub fn requires_grade1_indicator(uppercase_word: &str) -> bool {
super::english_ueb::rule_10_9::requires_grade1_at_word_start(uppercase_word)
}
pub fn permits_grade1_boundary_after_run(suffix: &[char]) -> bool {
if matches!(suffix.first(), Some('(' | '[' | '{')) {
return true;
}
for &ch in suffix {
if matches!(
ch,
'-' | '\u{2010}' | '\u{2011}' | '\u{2012}' | '\u{2013}' | '\u{2014}'
) {
return true;
}
if matches!(ch as u32, 0x3131..=0x3163 | 0xAC00..=0xD7A3)
|| matches!(ch, '\u{00b7}' | '\u{30fb}')
{
return true;
}
if !matches!(
ch,
',' | ';'
| ':'
| '.'
| '\u{2026}'
| '!'
| '?'
| ')'
| ']'
| '}'
| '\''
| '"'
| '\u{2019}'
| '\u{201d}'
) {
return false;
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
#[rstest::rstest]
#[case::empty_boundary("", true)]
#[case::official_cd_rom_boundary("-ROM", true)]
#[case::closing_then_korean(")은", true)]
#[case::adjacent_digit("47", false)]
#[case::slash_continuation("/ATM", false)]
#[case::plus_continuation("+", false)]
#[case::opening_group("(SLM)", true)]
#[case::comma_before_attached_letters(",ABC", false)]
fn grade1_boundary_follows_ueb_standing_alone_rules(
#[case] suffix: &str,
#[case] expected: bool,
) {
assert_eq!(
permits_grade1_boundary_after_run(&suffix.chars().collect::<Vec<_>>()),
expected
);
}
#[rstest::rstest]
#[case::complete_cd("CD", true)]
#[case::complete_hm("HM", true)]
#[case::groupsign_fst("FST", true)]
#[case::groupsign_shd("SHD", true)]
#[case::official_llc_prefix("LLC", true)]
#[case::good_prefix("GDP", true)]
#[case::added_s("SDS", true)]
#[case::because_needs_be("BC", false)]
#[case::about_unlisted_suffix("ABBA", false)]
#[case::little_before_vowel("LLAMA", false)]
#[case::plain_initialism("KBS", false)]
#[case::single_letter("C", false)]
#[case::non_ascii("É", false)]
#[case::alphanumeric("C1", false)]
fn detects_complete_and_word_initial_shortform_confusion(
#[case] input: &str,
#[case] expected: bool,
) {
assert_eq!(requires_grade1_indicator(input), expected);
}
#[test]
fn case_insensitive_runtime_input() {
let word = std::hint::black_box("cd");
assert!(requires_grade1_indicator(word));
}
#[rstest::rstest]
#[case::complete_cd("CD", true)]
#[case::official_llc_prefix("LLC", true)]
#[case::groupsign_reading_mst("MST", false)]
#[case::groupsign_reading_fst("FST", false)]
#[case::tomorrow_plus_s("TMS", true)]
#[case::plain_initialism("KBS", false)]
fn spelled_letters_collide_only_literally(#[case] input: &str, #[case] expected: bool) {
assert_eq!(
super::super::english_ueb::rule_10_9::requires_grade1_before_spelled_letters(input),
expected
);
}
}