Skip to main content

steel_utils/
java.rs

1//! Java standard-library behavior used by vanilla parsing.
2
3/// Returns whether Java's `Character.isWhitespace` recognizes `character`.
4#[must_use]
5pub const fn is_whitespace(character: char) -> bool {
6    matches!(
7        character,
8        '\u{0009}'..='\u{000d}'
9            | '\u{001c}'..='\u{0020}'
10            | '\u{1680}'
11            | '\u{2000}'..='\u{2006}'
12            | '\u{2008}'..='\u{200a}'
13            | '\u{2028}'
14            | '\u{2029}'
15            | '\u{205f}'
16            | '\u{3000}'
17    )
18}
19
20/// Returns whether Java's `Character.isSpaceChar` recognizes `character`.
21#[must_use]
22pub const fn is_space_char(character: char) -> bool {
23    matches!(
24        character,
25        '\u{0020}' | '\u{00a0}' | '\u{1680}' | '\u{2000}'
26            ..='\u{200a}' | '\u{2028}' | '\u{2029}' | '\u{202f}' | '\u{205f}' | '\u{3000}'
27    )
28}
29
30/// Mirrors vanilla `StringUtil.isBlank`.
31#[must_use]
32pub fn is_blank(value: &str) -> bool {
33    value
34        .chars()
35        .all(|character| is_whitespace(character) || is_space_char(character))
36}
37
38#[cfg(test)]
39mod tests {
40    use super::{is_blank, is_space_char, is_whitespace};
41
42    #[test]
43    fn matches_java_whitespace_exclusions() {
44        assert!(is_whitespace(' '));
45        assert!(is_whitespace('\u{1680}'));
46        for non_breaking_space in ['\u{0085}', '\u{00a0}', '\u{2007}', '\u{202f}'] {
47            assert!(!is_whitespace(non_breaking_space));
48        }
49    }
50
51    #[test]
52    fn space_char_includes_unicode_space_separators() {
53        for space in [' ', '\u{00a0}', '\u{2007}', '\u{202f}'] {
54            assert!(is_space_char(space));
55        }
56        assert!(!is_space_char('\u{0085}'));
57    }
58
59    #[test]
60    fn blank_combines_java_whitespace_and_space_char() {
61        assert!(is_blank(""));
62        assert!(is_blank("\u{001c}\u{00a0}\u{202f}"));
63        assert!(!is_blank("\u{0085}"));
64        assert!(!is_blank(" text "));
65    }
66}