use icu_segmenter::LineBreakOptions;
use icu_segmenter::LineBreakRule;
use icu_segmenter::LineBreakSegmenter;
use icu_segmenter::WordBreakRule;
fn check_with_options(
s: &str,
expect_utf8: Vec<usize>,
expect_utf16: Vec<usize>,
options: LineBreakOptions,
) {
let segmenter =
LineBreakSegmenter::try_new_with_options_unstable(&icu_testdata::unstable(), options)
.expect("Data exists");
let iter = segmenter.segment_str(s);
let result: Vec<usize> = iter.collect();
assert_eq!(expect_utf8, result, "{}", s);
let s_utf16: Vec<u16> = s.encode_utf16().collect();
let iter = segmenter.segment_utf16(&s_utf16);
let result: Vec<usize> = iter.collect();
assert_eq!(expect_utf16, result, "{}", s);
}
fn break_all(s: &str, expect_utf8: Vec<usize>, expect_utf16: Vec<usize>) {
let mut options = LineBreakOptions::default();
options.line_break_rule = LineBreakRule::Strict;
options.word_break_rule = WordBreakRule::BreakAll;
options.ja_zh = false;
check_with_options(s, expect_utf8, expect_utf16, options);
}
fn keep_all(s: &str, expect_utf8: Vec<usize>, expect_utf16: Vec<usize>) {
let mut options = LineBreakOptions::default();
options.line_break_rule = LineBreakRule::Strict;
options.word_break_rule = WordBreakRule::KeepAll;
options.ja_zh = false;
check_with_options(s, expect_utf8, expect_utf16, options);
}
fn normal(s: &str, expect_utf8: Vec<usize>, expect_utf16: Vec<usize>) {
let mut options = LineBreakOptions::default();
options.line_break_rule = LineBreakRule::Strict;
options.word_break_rule = WordBreakRule::Normal;
options.ja_zh = false;
check_with_options(s, expect_utf8, expect_utf16, options);
}
#[test]
fn wordbreak_breakall() {
let s = "\u{65e5}\u{672c}\u{8a9e}";
break_all(s, vec![3, 6, 9], vec![1, 2, 3]);
let s = "latin";
break_all(s, vec![1, 2, 3, 4, 5], vec![1, 2, 3, 4, 5]);
let s = "\u{d55c}\u{ae00}\u{c77e}";
break_all(s, vec![3, 6, 9], vec![1, 2, 3]);
let s = "ภาษาไทยภาษาไทย";
break_all(
s,
vec![3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42],
vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
);
let s = "التدويل نشاط التدويل";
break_all(
s,
vec![
2, 4, 6, 8, 10, 12, 15, 17, 19, 21, 24, 26, 28, 30, 32, 34, 36, 38,
],
vec![
1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20,
],
);
let s = "हिन्दी हिन्दी हिन्दी";
break_all(
s,
vec![6, 12, 19, 25, 31, 38, 44, 50, 56],
vec![2, 4, 7, 9, 11, 14, 16, 18, 20],
);
let s = "\u{1f496}\u{1f494}";
break_all(s, vec![4, 8], vec![2, 4]);
let s = "XX XX\u{005C}\u{005C}\u{005C}";
break_all(s, vec![1, 3, 4, 5, 6, 7, 8], vec![1, 3, 4, 5, 6, 7, 8]);
let s = "XX XXX///";
break_all(s, vec![1, 3, 4, 5, 9], vec![1, 3, 4, 5, 9]);
let s = "X.";
break_all(s, vec![2], vec![2]);
let s = "フォ";
break_all(s, vec![3, 6], vec![1, 2]);
}
#[test]
fn wordbreak_keepall() {
let s = "latin";
keep_all(s, vec![5], vec![5]);
let s = "\u{65e5}\u{672c}\u{8a9e}";
keep_all(s, vec![9], vec![3]);
let s = "한글이";
keep_all(s, vec![9], vec![3]);
let s = "字\u{3000}字";
keep_all(s, vec![6, 9], vec![2, 3]);
let s = "字\u{3001}字";
keep_all(s, vec![6, 9], vec![2, 3]);
let s = "しょう。";
keep_all(s, vec![12], vec![4]);
let s = "\u{110B}\u{1162}\u{1100}\u{1175}\u{1111}\u{1161}\u{11AB}\u{1103}\u{1161}";
keep_all(s, vec![27], vec![9]);
}
#[test]
#[cfg_attr(not(feature = "lstm"), ignore)]
fn wordbreak_keepall_lstm() {
let s = "และและ";
keep_all(s, vec![9, 18], vec![3, 6]);
}
#[test]
fn wordbreak_normal() {
let s = "ภาษาไทยภาษาไทย";
normal(s, vec![12, 21, 33, 42], vec![4, 7, 11, 14]);
}
#[test]
#[ignore = "We don't have km breaking rule yet"]
fn wordbreak_normal_km() {
let _s = "ភាសាខ្មែរភាសាខ្មែរភាសាខ្មែរ";
normal(_s, vec![27, 54, 81], vec![9, 18, 27]);
}
#[test]
#[ignore = "We don't have lo breaking rule yet"]
fn wordbreak_normal_lo() {
let _s = "ພາສາລາວພາສາລາວພາສາລາວ";
normal(_s, vec![12, 21, 33, 42, 54, 63], vec![4, 7, 11, 14, 18, 21]);
}