unic_ucd_common/
alphanumeric.rs

1// Copyright 2017 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
11//! *Alphanumeric* Character Property, equal to `General_Category = Nd | Nl | No or Alphabetic =
12//! Yes`.
13//!
14//! This is equivalent to `Alphabetic = true or Numeric = true`.
15//!
16//! NOTE: This property is not defined by UCD, but is used commonly enough in Unicode algorithms and
17//! applications to provide an optimized implementation.
18
19char_property! {
20    /// Represents Unicode characters with `General_Category = Nd | Nl | No`.
21    ///
22    /// This is equivalent to `Alphabetic = true or Numeric = true`.
23    ///
24    /// The value is `true` for characters that are alphabetic or have a numeric *General_Category*,
25    /// `false` otherwise.
26    pub struct Alphanumeric(bool) {
27        abbr => "Alphanumeric";
28        long => "Alphanumeric";
29        human => "Alphanumeric";
30
31        data_table_path => "../tables/alphanumeric.rsv";
32    }
33
34    /// Return `true` for alphanumeric characters, `false` otherwise.
35    ///
36    /// This is equivalent to `is_alphabetic(char) || is_numeric(char)`.
37    pub fn is_alphanumeric(char) -> bool;
38}
39
40#[cfg(test)]
41mod tests {
42    #[test]
43    fn test_values() {
44        use super::is_alphanumeric;
45
46        // ASCII
47        assert_eq!(is_alphanumeric('\u{0020}'), false);
48        assert_eq!(is_alphanumeric('\u{0021}'), false);
49        assert_eq!(is_alphanumeric('\u{0022}'), false);
50
51        assert_eq!(is_alphanumeric('\u{0030}'), true);
52        assert_eq!(is_alphanumeric('\u{0031}'), true);
53        assert_eq!(is_alphanumeric('\u{0032}'), true);
54
55        assert_eq!(is_alphanumeric('\u{0040}'), false);
56        assert_eq!(is_alphanumeric('\u{0041}'), true);
57        assert_eq!(is_alphanumeric('\u{0042}'), true);
58
59        assert_eq!(is_alphanumeric('\u{0060}'), false);
60        assert_eq!(is_alphanumeric('\u{0061}'), true);
61        assert_eq!(is_alphanumeric('\u{0062}'), true);
62
63        assert_eq!(is_alphanumeric('\u{007e}'), false);
64        assert_eq!(is_alphanumeric('\u{007f}'), false);
65
66        // Other BMP
67        assert_eq!(is_alphanumeric('\u{061b}'), false);
68        assert_eq!(is_alphanumeric('\u{061c}'), false);
69        assert_eq!(is_alphanumeric('\u{061d}'), false);
70
71        assert_eq!(is_alphanumeric('\u{200d}'), false);
72        assert_eq!(is_alphanumeric('\u{200e}'), false);
73        assert_eq!(is_alphanumeric('\u{200f}'), false);
74        assert_eq!(is_alphanumeric('\u{2010}'), false);
75
76        assert_eq!(is_alphanumeric('\u{2029}'), false);
77        assert_eq!(is_alphanumeric('\u{202a}'), false);
78        assert_eq!(is_alphanumeric('\u{202e}'), false);
79        assert_eq!(is_alphanumeric('\u{202f}'), false);
80
81        // Other Planes
82        assert_eq!(is_alphanumeric('\u{10000}'), true);
83        assert_eq!(is_alphanumeric('\u{10001}'), true);
84
85        assert_eq!(is_alphanumeric('\u{20000}'), true);
86        assert_eq!(is_alphanumeric('\u{30000}'), false);
87        assert_eq!(is_alphanumeric('\u{40000}'), false);
88        assert_eq!(is_alphanumeric('\u{50000}'), false);
89        assert_eq!(is_alphanumeric('\u{60000}'), false);
90        assert_eq!(is_alphanumeric('\u{70000}'), false);
91        assert_eq!(is_alphanumeric('\u{80000}'), false);
92        assert_eq!(is_alphanumeric('\u{90000}'), false);
93        assert_eq!(is_alphanumeric('\u{a0000}'), false);
94        assert_eq!(is_alphanumeric('\u{b0000}'), false);
95        assert_eq!(is_alphanumeric('\u{c0000}'), false);
96        assert_eq!(is_alphanumeric('\u{d0000}'), false);
97        assert_eq!(is_alphanumeric('\u{e0000}'), false);
98
99        assert_eq!(is_alphanumeric('\u{efffe}'), false);
100        assert_eq!(is_alphanumeric('\u{effff}'), false);
101
102        // Priavte-Use Area
103        assert_eq!(is_alphanumeric('\u{f0000}'), false);
104        assert_eq!(is_alphanumeric('\u{f0001}'), false);
105        assert_eq!(is_alphanumeric('\u{ffffe}'), false);
106        assert_eq!(is_alphanumeric('\u{fffff}'), false);
107        assert_eq!(is_alphanumeric('\u{100000}'), false);
108        assert_eq!(is_alphanumeric('\u{100001}'), false);
109        assert_eq!(is_alphanumeric('\u{10fffe}'), false);
110        assert_eq!(is_alphanumeric('\u{10ffff}'), false);
111    }
112}