char.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use std::convert::TryFrom;
  2. use std::ops::RangeBounds;
  3. fn test_char_coverage<R>(n: usize, range: R)
  4. where
  5. R: Iterator<Item = char> + RangeBounds<char> + Clone,
  6. {
  7. use std::collections::HashSet;
  8. let all: HashSet<char> = range.clone().collect();
  9. let mut covered = HashSet::new();
  10. for _ in 0..n {
  11. let c = fastrand::char(range.clone());
  12. assert!(all.contains(&c));
  13. covered.insert(c);
  14. }
  15. assert_eq!(covered, all);
  16. }
  17. #[test]
  18. fn test_char() {
  19. // ASCII control chars.
  20. let nul = 0u8 as char;
  21. let soh = 1u8 as char;
  22. let stx = 2u8 as char;
  23. // Some undefined Hangul Jamo codepoints just before
  24. // the surrogate area.
  25. let last_jamo = char::try_from(0xd7ffu32).unwrap();
  26. let penultimate_jamo = char::try_from(last_jamo as u32 - 1).unwrap();
  27. // Private-use codepoints just after the surrogate area.
  28. let first_private = char::try_from(0xe000u32).unwrap();
  29. let second_private = char::try_from(first_private as u32 + 1).unwrap();
  30. // Private-use codepoints at the end of Unicode space.
  31. let last_private = std::char::MAX;
  32. let penultimate_private = char::try_from(last_private as u32 - 1).unwrap();
  33. test_char_coverage(100, nul..stx);
  34. test_char_coverage(100, nul..=soh);
  35. test_char_coverage(400, penultimate_jamo..second_private);
  36. test_char_coverage(400, penultimate_jamo..=second_private);
  37. test_char_coverage(100, penultimate_private..=last_private);
  38. }