use crate::is_katakana::is_mixed_halfwidth_katakana;
use crate::is_mixed::*;
use crate::is_romaji::*;
use crate::options::Options;
use crate::utils::halfwidth_katakana_to_hiragana::halfwidth_katakana_to_hiragana;
use crate::utils::hiragana_to_katakana::*;
use crate::utils::romaji_to_hiragana::*;
pub fn to_katakana(input: &str) -> String {
to_katakana_with_opt(input, Options::default())
}
pub fn to_katakana_with_opt(input: &str, options: Options) -> String {
let config = options;
let input = if is_mixed_halfwidth_katakana(input) {
&halfwidth_katakana_to_hiragana(input)
} else {
input
};
if config.pass_romaji {
hiragana_to_katakana(input)
} else if is_romaji(input) || is_mixed(input) {
let romaji = romaji_to_hiragana(input, config);
hiragana_to_katakana(&romaji)
} else {
hiragana_to_katakana(input)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn with_obsolete_kana() -> Options {
Options {
use_obsolete_kana: true,
..Default::default()
}
}
#[test]
fn sane_defaults() {
assert_eq!(to_katakana(""), "");
}
#[test]
fn quick_brown_fox_romaji_to_katakana() {
assert_eq!(
to_katakana_with_opt("IROHANIHOHETO", with_obsolete_kana()),
"イロハニホヘト"
);
assert_eq!(
to_katakana_with_opt("CHIRINURUWO", with_obsolete_kana()),
"チリヌルヲ"
);
assert_eq!(
to_katakana_with_opt("WAKAYOTARESO", with_obsolete_kana()),
"ワカヨタレソ"
);
assert_eq!(
to_katakana_with_opt("TSUNENARAMU", with_obsolete_kana()),
"ツネナラム"
);
assert_eq!(
to_katakana_with_opt("UWINOOKUYAMA", with_obsolete_kana()),
"ウヰノオクヤマ"
);
assert_eq!(
to_katakana_with_opt("KEFUKOETE", with_obsolete_kana()),
"ケフコエテ"
);
assert_eq!(
to_katakana_with_opt("ASAKIYUMEMISHI", with_obsolete_kana()),
"アサキユメミシ"
);
assert_eq!(
to_katakana_with_opt("WEHIMOSESU", with_obsolete_kana()),
"ヱヒモセス"
);
assert_eq!(to_katakana("NLTU"), "ンッ");
}
mod use_obsolete_kana {
use super::*;
#[test]
fn use_obsolete_kana_is_false_by_default() {
assert_eq!(to_katakana("wi"), "ウィ");
}
#[test]
fn wi_ゐ_when_use_obsolete_kana_is_true() {
assert_eq!(to_katakana_with_opt("wi", with_obsolete_kana()), "ヰ");
}
#[test]
fn we_ゑ_when_use_obsolete_kana_is_true() {
assert_eq!(to_katakana_with_opt("we", with_obsolete_kana()), "ヱ");
}
}
mod pass_romaji {
use super::*;
#[test]
fn false_by_default() {
assert_eq!(to_katakana("only かな"), "オンly カナ");
assert_eq!(
to_katakana_with_opt(
"only かな",
Options {
pass_romaji: true,
..Default::default()
}
),
"only カナ"
);
}
}
mod hankaku_katakana {
use super::*;
#[test]
fn converts_to_hiragana() {
assert_eq!(to_katakana("アイウエオカキクケコ"), "アイウエオカキクケコ");
assert_eq!(to_katakana("サシスセソタチツテト"), "サシスセソタチツテト");
assert_eq!(to_katakana("ナニヌネノハヒフヘホ"), "ナニヌネノハヒフヘホ");
assert_eq!(to_katakana("マミムメモヤユヨ"), "マミムメモヤユヨ");
assert_eq!(to_katakana("ラリルレロワヲン"), "ラリルレロワヲン");
assert_eq!(to_katakana("ァィゥェォャュョッー・「」"), "ァィゥェォャュョッー・「」");
assert_eq!(to_katakana("ガギグゲゴ"), "ガギグゲゴ");
assert_eq!(to_katakana("ザジズゼゾ"), "ザジズゼゾ");
assert_eq!(to_katakana("ダヂヅデド"), "ダヂヅデド");
assert_eq!(to_katakana("バビブベボ"), "バビブベボ");
assert_eq!(to_katakana("パピプペポ"), "パピプペポ");
assert_eq!(to_katakana("ヴ"), "ヴ");
}
}
}