• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10 
11 use super::char::is_combining_mark;
12 use super::UnicodeNormalization;
13 use core::char;
14 
15 #[cfg(not(feature = "std"))]
16 use crate::no_std_prelude::*;
17 
18 #[test]
test_nfd()19 fn test_nfd() {
20     macro_rules! t {
21         ($input: expr, $expected: expr) => {
22             assert_eq!($input.nfd().to_string(), $expected);
23             // A dummy iterator that is not std::str::Chars directly;
24             // note that `id_func` is used to ensure `Clone` implementation
25             assert_eq!(
26                 $input.chars().map(|c| c).nfd().collect::<String>(),
27                 $expected
28             );
29         };
30     }
31     t!("abc", "abc");
32     t!("\u{1e0b}\u{1c4}", "d\u{307}\u{1c4}");
33     t!("\u{2026}", "\u{2026}");
34     t!("\u{2126}", "\u{3a9}");
35     t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
36     t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
37     t!("a\u{301}", "a\u{301}");
38     t!("\u{301}a", "\u{301}a");
39     t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
40     t!("\u{ac1c}", "\u{1100}\u{1162}");
41 }
42 
43 #[test]
test_nfkd()44 fn test_nfkd() {
45     macro_rules! t {
46         ($input: expr, $expected: expr) => {
47             assert_eq!($input.nfkd().to_string(), $expected);
48         };
49     }
50     t!("abc", "abc");
51     t!("\u{1e0b}\u{1c4}", "d\u{307}DZ\u{30c}");
52     t!("\u{2026}", "...");
53     t!("\u{2126}", "\u{3a9}");
54     t!("\u{1e0b}\u{323}", "d\u{323}\u{307}");
55     t!("\u{1e0d}\u{307}", "d\u{323}\u{307}");
56     t!("a\u{301}", "a\u{301}");
57     t!("\u{301}a", "\u{301}a");
58     t!("\u{d4db}", "\u{1111}\u{1171}\u{11b6}");
59     t!("\u{ac1c}", "\u{1100}\u{1162}");
60 }
61 
62 #[test]
test_nfc()63 fn test_nfc() {
64     macro_rules! t {
65         ($input: expr, $expected: expr) => {
66             assert_eq!($input.nfc().to_string(), $expected);
67         };
68     }
69     t!("abc", "abc");
70     t!("\u{1e0b}\u{1c4}", "\u{1e0b}\u{1c4}");
71     t!("\u{2026}", "\u{2026}");
72     t!("\u{2126}", "\u{3a9}");
73     t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
74     t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
75     t!("a\u{301}", "\u{e1}");
76     t!("\u{301}a", "\u{301}a");
77     t!("\u{d4db}", "\u{d4db}");
78     t!("\u{ac1c}", "\u{ac1c}");
79     t!(
80         "a\u{300}\u{305}\u{315}\u{5ae}b",
81         "\u{e0}\u{5ae}\u{305}\u{315}b"
82     );
83 }
84 
85 #[test]
test_nfkc()86 fn test_nfkc() {
87     macro_rules! t {
88         ($input: expr, $expected: expr) => {
89             assert_eq!($input.nfkc().to_string(), $expected);
90         };
91     }
92     t!("abc", "abc");
93     t!("\u{1e0b}\u{1c4}", "\u{1e0b}D\u{17d}");
94     t!("\u{2026}", "...");
95     t!("\u{2126}", "\u{3a9}");
96     t!("\u{1e0b}\u{323}", "\u{1e0d}\u{307}");
97     t!("\u{1e0d}\u{307}", "\u{1e0d}\u{307}");
98     t!("a\u{301}", "\u{e1}");
99     t!("\u{301}a", "\u{301}a");
100     t!("\u{d4db}", "\u{d4db}");
101     t!("\u{ac1c}", "\u{ac1c}");
102     t!(
103         "a\u{300}\u{305}\u{315}\u{5ae}b",
104         "\u{e0}\u{5ae}\u{305}\u{315}b"
105     );
106 }
107 
108 #[test]
test_normalize_char()109 fn test_normalize_char() {
110     assert_eq!('\u{2126}'.nfd().to_string(), "\u{3a9}")
111 }
112 
113 #[test]
test_is_combining_mark_ascii()114 fn test_is_combining_mark_ascii() {
115     for cp in 0..0x7f {
116         assert!(!is_combining_mark(char::from_u32(cp).unwrap()));
117     }
118 }
119 
120 #[test]
test_is_combining_mark_misc()121 fn test_is_combining_mark_misc() {
122     // https://github.com/unicode-rs/unicode-normalization/issues/16
123     // U+11C3A BHAIKSUKI VOWEL SIGN O
124     // Category: Mark, Nonspacing [Mn]
125     assert!(is_combining_mark('\u{11C3A}'));
126 
127     // U+11C3F BHAIKSUKI SIGN VIRAMA
128     // Category: Mark, Nonspacing [Mn]
129     assert!(is_combining_mark('\u{11C3F}'));
130 }
131