orecc_front/
lib.rs

1/// Checking characters to be a part of ident, start of ident, etc.
2pub mod chars;
3/// Codebase. A struct that holds all your code in memory (codespan forces this)
4pub mod codebase;
5/// A simple character reader that is useful for creating lexers
6pub mod token_reader;
7
8pub use codebase::Codebase;
9pub use token_reader::TokenReader;
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    #[test]
16    fn test_character_buffer() {
17        let data = "Awesome\ndemo";
18        let mut source = TokenReader::new(std::rc::Rc::from(data));
19        assert_eq!(source.peek_char(), Some('A'));
20        assert_eq!(source.next_char(), Some('A'));
21        assert_eq!(source.next_char_if(|char| char == 'e'), None);
22        source.next_char();
23        assert_eq!(source.next_char_if(|char| char == 'e'), Some('e'));
24        assert_eq!(source.cursor, 2);
25        for _ in 0..5 {
26            source.next_char();
27        }
28        assert_eq!(source.cursor, 7);
29        assert_eq!(source.next_token(char::is_alphabetic, '1'), "1demo");
30        assert_eq!(source.peek_char(), None);
31        assert_eq!(source.next_char(), None);
32    }
33
34    #[test]
35    fn test_chars() {
36        assert!(chars::is_whitespace(' '));
37        assert!(chars::is_whitespace('\n'));
38        assert!(chars::is_whitespace('\t'));
39        assert!(chars::is_whitespace('\r'));
40
41        assert!(!chars::is_whitespace('a'));
42        assert!(!chars::is_whitespace('_'));
43
44        assert!(chars::is_ident_start('D'));
45        assert!(chars::is_ident_start('f'));
46        assert!(chars::is_ident_start('_'));
47
48        assert!(!chars::is_ident_start('!'));
49        assert!(!chars::is_ident_start(' '));
50        assert!(!chars::is_ident_start('4'));
51
52        assert!(chars::is_ident_continue('D'));
53        assert!(chars::is_ident_continue('f'));
54        assert!(chars::is_ident_continue('_'));
55        assert!(chars::is_ident_continue('4'));
56
57        assert!(!chars::is_ident_continue('!'));
58        assert!(!chars::is_ident_continue(' '));
59
60        #[cfg(feature = "xid")]
61        {
62            assert!(chars::is_ident_start('Ф'));
63            assert!(chars::is_ident_start('ф'));
64            assert!(chars::is_ident_start('\u{1000d}'));
65            assert!(chars::is_ident_start('\u{10026}'));
66
67            assert!(!chars::is_ident_start('\u{02c2}'));
68            assert!(!chars::is_ident_start('\u{ffff}'));
69
70            assert!(chars::is_ident_continue('\u{1000d}'));
71            assert!(chars::is_ident_continue('\u{10026}'));
72
73            assert!(!chars::is_ident_continue('\u{02c2}'));
74            assert!(!chars::is_ident_continue('\u{ffff}'));
75        }
76
77        assert!(chars::is_digit('0'));
78        assert!(chars::is_digit('4'));
79        assert!(chars::is_digit('8'));
80        assert!(!chars::is_digit('s'));
81        assert!(!chars::is_digit(' '));
82        assert!(!chars::is_digit('/'));
83
84        assert!(chars::is_bindigit('0'));
85        assert!(chars::is_bindigit('1'));
86        assert!(!chars::is_bindigit('2'));
87        assert!(!chars::is_bindigit(' '));
88        assert!(!chars::is_bindigit('/'));
89
90        assert!(chars::is_hexdigit('3'));
91        assert!(chars::is_hexdigit('f'));
92        assert!(chars::is_hexdigit('F'));
93        assert!(!chars::is_hexdigit('g'));
94        assert!(!chars::is_hexdigit(' '));
95        assert!(!chars::is_hexdigit('/'));
96
97        assert!(chars::is_octdigit('0'));
98        assert!(chars::is_octdigit('4'));
99        assert!(chars::is_octdigit('7'));
100        assert!(!chars::is_octdigit('8'));
101        assert!(!chars::is_octdigit('f'));
102        assert!(!chars::is_octdigit('/'));
103    }
104}