unic_ucd_ident/
xid.rs

1// Copyright 2017-2019 The UNIC Project Developers.
2//
3// See the COPYRIGHT file at the top-level directory of this distribution.
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
11char_property! {
12    /// A character that can start an identifier, stable under NFKC.
13    pub struct XidStart(bool) {
14        abbr => "XIDS";
15        long => "XID_Start";
16        human => "XID Start";
17
18        data_table_path => "../tables/xid_start.rsv";
19    }
20
21    /// Is this a NFKC-safe identifier starting character?
22    pub fn is_xid_start(char) -> bool;
23}
24
25char_property! {
26    /// A character that can continue an identifier, stable under NFKC.
27    pub struct XidContinue(bool) {
28        abbr => "XIDC";
29        long => "XID_Continue";
30        human => "XID Continue";
31
32        data_table_path => "../tables/xid_continue.rsv";
33    }
34
35    /// Is this a NFKC-safe identifier continuing character?
36    pub fn is_xid_continue(char) -> bool;
37}
38
39#[cfg(test)]
40mod tests {
41    #[test]
42    fn test_is_xid_start() {
43        use super::is_xid_start;
44
45        // ASCII
46        assert_eq!(is_xid_start('\u{0000}'), false);
47        assert_eq!(is_xid_start('\u{0020}'), false);
48        assert_eq!(is_xid_start('\u{0021}'), false);
49
50        assert_eq!(is_xid_start('\u{0027}'), false);
51        assert_eq!(is_xid_start('\u{0028}'), false);
52        assert_eq!(is_xid_start('\u{0029}'), false);
53        assert_eq!(is_xid_start('\u{002a}'), false);
54
55        assert_eq!(is_xid_start('\u{0030}'), false);
56        assert_eq!(is_xid_start('\u{0039}'), false);
57        assert_eq!(is_xid_start('\u{003a}'), false);
58        assert_eq!(is_xid_start('\u{003b}'), false);
59        assert_eq!(is_xid_start('\u{003c}'), false);
60        assert_eq!(is_xid_start('\u{003d}'), false);
61
62        assert_eq!(is_xid_start('\u{004a}'), true);
63        assert_eq!(is_xid_start('\u{004b}'), true);
64        assert_eq!(is_xid_start('\u{004c}'), true);
65        assert_eq!(is_xid_start('\u{004d}'), true);
66        assert_eq!(is_xid_start('\u{004e}'), true);
67
68        assert_eq!(is_xid_start('\u{006a}'), true);
69        assert_eq!(is_xid_start('\u{006b}'), true);
70        assert_eq!(is_xid_start('\u{006c}'), true);
71        assert_eq!(is_xid_start('\u{006d}'), true);
72        assert_eq!(is_xid_start('\u{006e}'), true);
73
74        assert_eq!(is_xid_start('\u{007a}'), true);
75        assert_eq!(is_xid_start('\u{007b}'), false);
76        assert_eq!(is_xid_start('\u{007c}'), false);
77        assert_eq!(is_xid_start('\u{007d}'), false);
78        assert_eq!(is_xid_start('\u{007e}'), false);
79
80        assert_eq!(is_xid_start('\u{00c0}'), true);
81        assert_eq!(is_xid_start('\u{00c1}'), true);
82        assert_eq!(is_xid_start('\u{00c2}'), true);
83        assert_eq!(is_xid_start('\u{00c3}'), true);
84        assert_eq!(is_xid_start('\u{00c4}'), true);
85
86        // Other BMP
87        assert_eq!(is_xid_start('\u{061b}'), false);
88        assert_eq!(is_xid_start('\u{061c}'), false);
89        assert_eq!(is_xid_start('\u{061d}'), false);
90
91        assert_eq!(is_xid_start('\u{200d}'), false);
92        assert_eq!(is_xid_start('\u{200e}'), false);
93        assert_eq!(is_xid_start('\u{200f}'), false);
94        assert_eq!(is_xid_start('\u{2010}'), false);
95
96        assert_eq!(is_xid_start('\u{2029}'), false);
97        assert_eq!(is_xid_start('\u{202a}'), false);
98        assert_eq!(is_xid_start('\u{202e}'), false);
99        assert_eq!(is_xid_start('\u{202f}'), false);
100
101        // Other Planes
102        assert_eq!(is_xid_start('\u{10000}'), true);
103        assert_eq!(is_xid_start('\u{10001}'), true);
104
105        assert_eq!(is_xid_start('\u{20000}'), true);
106        assert_eq!(is_xid_start('\u{30000}'), false);
107        assert_eq!(is_xid_start('\u{40000}'), false);
108        assert_eq!(is_xid_start('\u{50000}'), false);
109        assert_eq!(is_xid_start('\u{60000}'), false);
110        assert_eq!(is_xid_start('\u{70000}'), false);
111        assert_eq!(is_xid_start('\u{80000}'), false);
112        assert_eq!(is_xid_start('\u{90000}'), false);
113        assert_eq!(is_xid_start('\u{a0000}'), false);
114        assert_eq!(is_xid_start('\u{b0000}'), false);
115        assert_eq!(is_xid_start('\u{c0000}'), false);
116        assert_eq!(is_xid_start('\u{d0000}'), false);
117        assert_eq!(is_xid_start('\u{e0000}'), false);
118
119        assert_eq!(is_xid_start('\u{efffe}'), false);
120        assert_eq!(is_xid_start('\u{effff}'), false);
121
122        // Priavte-Use Area
123        assert_eq!(is_xid_start('\u{f0000}'), false);
124        assert_eq!(is_xid_start('\u{f0001}'), false);
125        assert_eq!(is_xid_start('\u{ffffe}'), false);
126        assert_eq!(is_xid_start('\u{fffff}'), false);
127        assert_eq!(is_xid_start('\u{100000}'), false);
128        assert_eq!(is_xid_start('\u{100001}'), false);
129        assert_eq!(is_xid_start('\u{10fffe}'), false);
130        assert_eq!(is_xid_start('\u{10ffff}'), false);
131    }
132
133    #[test]
134    fn test_is_xid_continue() {
135        use super::is_xid_continue;
136
137        // ASCII
138        assert_eq!(is_xid_continue('\u{0000}'), false);
139        assert_eq!(is_xid_continue('\u{0020}'), false);
140        assert_eq!(is_xid_continue('\u{0021}'), false);
141
142        assert_eq!(is_xid_continue('\u{0027}'), false);
143        assert_eq!(is_xid_continue('\u{0028}'), false);
144        assert_eq!(is_xid_continue('\u{0029}'), false);
145        assert_eq!(is_xid_continue('\u{002a}'), false);
146
147        assert_eq!(is_xid_continue('\u{0030}'), true);
148        assert_eq!(is_xid_continue('\u{0039}'), true);
149        assert_eq!(is_xid_continue('\u{003a}'), false);
150        assert_eq!(is_xid_continue('\u{003b}'), false);
151        assert_eq!(is_xid_continue('\u{003c}'), false);
152        assert_eq!(is_xid_continue('\u{003d}'), false);
153
154        assert_eq!(is_xid_continue('\u{004a}'), true);
155        assert_eq!(is_xid_continue('\u{004b}'), true);
156        assert_eq!(is_xid_continue('\u{004c}'), true);
157        assert_eq!(is_xid_continue('\u{004d}'), true);
158        assert_eq!(is_xid_continue('\u{004e}'), true);
159
160        assert_eq!(is_xid_continue('\u{006a}'), true);
161        assert_eq!(is_xid_continue('\u{006b}'), true);
162        assert_eq!(is_xid_continue('\u{006c}'), true);
163        assert_eq!(is_xid_continue('\u{006d}'), true);
164        assert_eq!(is_xid_continue('\u{006e}'), true);
165
166        assert_eq!(is_xid_continue('\u{007a}'), true);
167        assert_eq!(is_xid_continue('\u{007b}'), false);
168        assert_eq!(is_xid_continue('\u{007c}'), false);
169        assert_eq!(is_xid_continue('\u{007d}'), false);
170        assert_eq!(is_xid_continue('\u{007e}'), false);
171
172        assert_eq!(is_xid_continue('\u{00c0}'), true);
173        assert_eq!(is_xid_continue('\u{00c1}'), true);
174        assert_eq!(is_xid_continue('\u{00c2}'), true);
175        assert_eq!(is_xid_continue('\u{00c3}'), true);
176        assert_eq!(is_xid_continue('\u{00c4}'), true);
177
178        // Other BMP
179        assert_eq!(is_xid_continue('\u{061b}'), false);
180        assert_eq!(is_xid_continue('\u{061c}'), false);
181        assert_eq!(is_xid_continue('\u{061d}'), false);
182
183        assert_eq!(is_xid_continue('\u{200d}'), false);
184        assert_eq!(is_xid_continue('\u{200e}'), false);
185        assert_eq!(is_xid_continue('\u{200f}'), false);
186        assert_eq!(is_xid_continue('\u{2010}'), false);
187
188        assert_eq!(is_xid_continue('\u{2029}'), false);
189        assert_eq!(is_xid_continue('\u{202a}'), false);
190        assert_eq!(is_xid_continue('\u{202e}'), false);
191        assert_eq!(is_xid_continue('\u{202f}'), false);
192
193        // Other Planes
194        assert_eq!(is_xid_continue('\u{10000}'), true);
195        assert_eq!(is_xid_continue('\u{10001}'), true);
196
197        assert_eq!(is_xid_continue('\u{20000}'), true);
198        assert_eq!(is_xid_continue('\u{30000}'), false);
199        assert_eq!(is_xid_continue('\u{40000}'), false);
200        assert_eq!(is_xid_continue('\u{50000}'), false);
201        assert_eq!(is_xid_continue('\u{60000}'), false);
202        assert_eq!(is_xid_continue('\u{70000}'), false);
203        assert_eq!(is_xid_continue('\u{80000}'), false);
204        assert_eq!(is_xid_continue('\u{90000}'), false);
205        assert_eq!(is_xid_continue('\u{a0000}'), false);
206        assert_eq!(is_xid_continue('\u{b0000}'), false);
207        assert_eq!(is_xid_continue('\u{c0000}'), false);
208        assert_eq!(is_xid_continue('\u{d0000}'), false);
209        assert_eq!(is_xid_continue('\u{e0000}'), false);
210
211        assert_eq!(is_xid_continue('\u{efffe}'), false);
212        assert_eq!(is_xid_continue('\u{effff}'), false);
213
214        // Priavte-Use Area
215        assert_eq!(is_xid_continue('\u{f0000}'), false);
216        assert_eq!(is_xid_continue('\u{f0001}'), false);
217        assert_eq!(is_xid_continue('\u{ffffe}'), false);
218        assert_eq!(is_xid_continue('\u{fffff}'), false);
219        assert_eq!(is_xid_continue('\u{100000}'), false);
220        assert_eq!(is_xid_continue('\u{100001}'), false);
221        assert_eq!(is_xid_continue('\u{10fffe}'), false);
222        assert_eq!(is_xid_continue('\u{10ffff}'), false);
223    }
224}