ascii_domain

Domains whose labels are only ASCII.
git clone https://git.philomathiclife.com/repos/ascii_domain
Log | Files | Refs | README

tests.rs (7044B)


      1 extern crate alloc;
      2 use super::{
      3     ASCII_DIGITS, ASCII_DIGITS_LETTERS, ASCII_DIGITS_LOWERCASE, ASCII_DIGITS_UPPERCASE,
      4     ASCII_FIREFOX, ASCII_HYPHEN_DIGITS_LETTERS, ASCII_HYPHEN_DIGITS_LOWERCASE,
      5     ASCII_HYPHEN_DIGITS_UPPERCASE, ASCII_LETTERS, ASCII_LOWERCASE, ASCII_UPPERCASE, AllowedAscii,
      6     AsciiErr, PRINTABLE_ASCII, RFC5322_ATEXT, WHATWG_VALID_DOMAIN_CODE_POINTS,
      7 };
      8 use alloc::{borrow::ToOwned as _, vec::Vec};
      9 #[test]
     10 fn try_from() {
     11     // Empty is allowed.
     12     assert_eq!(
     13         AllowedAscii::try_from_unique_ascii([]),
     14         Ok(AllowedAscii { allowed: [] })
     15     );
     16     // Duplicates are not allowed.
     17     assert_eq!(
     18         AllowedAscii::try_from_unique_ascii(b"aba".to_owned()),
     19         Err(AsciiErr::Duplicate(b'a'))
     20     );
     21     // `b'.'` is not allowed.
     22     assert_eq!(
     23         AllowedAscii::try_from_unique_ascii(b"a.c".to_owned()),
     24         Err(AsciiErr::Contains46)
     25     );
     26     // At most 127 bytes are allowed.
     27     assert_eq!(
     28         AllowedAscii::try_from_unique_ascii([0; 128]),
     29         Err(AsciiErr::CountTooLarge(128))
     30     );
     31     let mut all_ascii = (0..b'.').collect::<Vec<u8>>();
     32     let next = b'.' + 1;
     33     all_ascii.extend(next..=127);
     34     assert_eq!(
     35         AllowedAscii::try_from_unique_ascii(all_ascii.clone()),
     36         Ok(AllowedAscii { allowed: all_ascii })
     37     );
     38     // Only ASCII is allowed.
     39     assert_eq!(
     40         AllowedAscii::try_from_unique_ascii([255]),
     41         Err(AsciiErr::InvalidByte(255))
     42     );
     43     assert!(
     44         AllowedAscii::try_from_unique_ascii(b"abcdef".to_owned()).is_ok_and(|bytes| bytes
     45             .as_inner()
     46             .contains(&b'a')
     47             && bytes.contains(b'b')
     48             && bytes.contains(b'c')
     49             && bytes.contains(b'd')
     50             && bytes.contains(b'e')
     51             && bytes.contains(b'f'))
     52     );
     53 }
     54 #[expect(
     55     clippy::cognitive_complexity,
     56     clippy::too_many_lines,
     57     reason = "want to test a lot of things"
     58 )]
     59 #[test]
     60 fn consts() {
     61     let letters = ASCII_LETTERS;
     62     assert_eq!(letters.len(), 52);
     63     for i in b'A'..=b'Z' {
     64         assert!(letters.contains(i));
     65     }
     66     for i in b'a'..=b'z' {
     67         assert!(letters.contains(i));
     68     }
     69     let digits = ASCII_DIGITS;
     70     assert_eq!(digits.len(), 10);
     71     for i in b'0'..=b'9' {
     72         assert!(digits.contains(i));
     73     }
     74     let lower = ASCII_LOWERCASE;
     75     assert_eq!(lower.len(), 26);
     76     for i in b'a'..=b'z' {
     77         assert!(lower.contains(i));
     78     }
     79     let upper = ASCII_UPPERCASE;
     80     assert_eq!(upper.len(), 26);
     81     for i in b'A'..=b'Z' {
     82         assert!(upper.contains(i));
     83     }
     84     let dig_let = ASCII_DIGITS_LETTERS;
     85     assert_eq!(dig_let.len(), 62);
     86     for i in b'a'..=b'z' {
     87         assert!(dig_let.contains(i));
     88     }
     89     for i in b'0'..=b'9' {
     90         assert!(dig_let.contains(i));
     91     }
     92     for i in b'A'..=b'Z' {
     93         assert!(dig_let.contains(i));
     94     }
     95     let dig_lower = ASCII_DIGITS_LOWERCASE;
     96     assert_eq!(dig_lower.len(), 36);
     97     for i in b'a'..=b'z' {
     98         assert!(dig_lower.contains(i));
     99     }
    100     for i in b'0'..=b'9' {
    101         assert!(dig_lower.contains(i));
    102     }
    103     let dig_upper = ASCII_DIGITS_UPPERCASE;
    104     assert_eq!(dig_upper.len(), 36);
    105     for i in b'A'..=b'Z' {
    106         assert!(dig_upper.contains(i));
    107     }
    108     for i in b'0'..=b'9' {
    109         assert!(dig_upper.contains(i));
    110     }
    111     let ffox = ASCII_FIREFOX;
    112     assert_eq!(ffox.len(), 78);
    113     for i in b'A'..=b'Z' {
    114         assert!(ffox.contains(i));
    115     }
    116     for i in b'a'..=b'z' {
    117         assert!(ffox.contains(i));
    118     }
    119     for i in b'0'..=b'9' {
    120         assert!(ffox.contains(i));
    121     }
    122     assert!(ffox.contains(b'!'));
    123     assert!(ffox.contains(b'$'));
    124     assert!(ffox.contains(b'&'));
    125     assert!(ffox.contains(b'\''));
    126     assert!(ffox.contains(b'('));
    127     assert!(ffox.contains(b')'));
    128     assert!(ffox.contains(b'+'));
    129     assert!(ffox.contains(b','));
    130     assert!(ffox.contains(b'-'));
    131     assert!(ffox.contains(b';'));
    132     assert!(ffox.contains(b'='));
    133     assert!(ffox.contains(b'_'));
    134     assert!(ffox.contains(b'`'));
    135     assert!(ffox.contains(b'{'));
    136     assert!(ffox.contains(b'}'));
    137     assert!(ffox.contains(b'~'));
    138     assert_eq!(ASCII_HYPHEN_DIGITS_LETTERS.len(), 63);
    139     assert!(ASCII_HYPHEN_DIGITS_LETTERS.contains(b'-'));
    140     for i in b'A'..=b'Z' {
    141         assert!(ASCII_HYPHEN_DIGITS_LETTERS.contains(i));
    142     }
    143     for i in b'a'..=b'z' {
    144         assert!(ASCII_HYPHEN_DIGITS_LETTERS.contains(i));
    145     }
    146     for i in b'0'..=b'9' {
    147         assert!(ASCII_HYPHEN_DIGITS_LETTERS.contains(i));
    148     }
    149     let hyp_lower = ASCII_HYPHEN_DIGITS_LOWERCASE;
    150     assert_eq!(hyp_lower.len(), 37);
    151     assert!(hyp_lower.contains(b'-'));
    152     for i in b'a'..=b'z' {
    153         assert!(hyp_lower.contains(i));
    154     }
    155     for i in b'0'..=b'9' {
    156         assert!(hyp_lower.contains(i));
    157     }
    158     let hyp_upper = ASCII_HYPHEN_DIGITS_UPPERCASE;
    159     assert_eq!(hyp_upper.len(), 37);
    160     assert!(hyp_upper.contains(b'-'));
    161     for i in b'A'..=b'Z' {
    162         assert!(hyp_upper.contains(i));
    163     }
    164     for i in b'0'..=b'9' {
    165         assert!(hyp_upper.contains(i));
    166     }
    167     let printable = PRINTABLE_ASCII;
    168     assert_eq!(printable.len(), 92);
    169     let stop = b'.' - 1;
    170     for i in 33..=stop {
    171         assert!(printable.contains(i));
    172     }
    173     let stop2 = b'\\' - 1;
    174     for i in stop + 2..=stop2 {
    175         assert!(printable.contains(i));
    176     }
    177     for i in stop2 + 2..=b'~' {
    178         assert!(printable.contains(i));
    179     }
    180     let rfc = RFC5322_ATEXT;
    181     assert_eq!(rfc.len(), 81);
    182     for i in b'A'..=b'Z' {
    183         assert!(rfc.contains(i));
    184     }
    185     for i in b'a'..=b'z' {
    186         assert!(rfc.contains(i));
    187     }
    188     for i in b'0'..=b'9' {
    189         assert!(rfc.contains(i));
    190     }
    191     assert!(rfc.contains(b'!'));
    192     assert!(rfc.contains(b'#'));
    193     assert!(rfc.contains(b'$'));
    194     assert!(rfc.contains(b'%'));
    195     assert!(rfc.contains(b'&'));
    196     assert!(rfc.contains(b'\''));
    197     assert!(rfc.contains(b'*'));
    198     assert!(rfc.contains(b'+'));
    199     assert!(rfc.contains(b'-'));
    200     assert!(rfc.contains(b'/'));
    201     assert!(rfc.contains(b'='));
    202     assert!(rfc.contains(b'?'));
    203     assert!(rfc.contains(b'^'));
    204     assert!(rfc.contains(b'_'));
    205     assert!(rfc.contains(b'`'));
    206     assert!(rfc.contains(b'{'));
    207     assert!(rfc.contains(b'|'));
    208     assert!(rfc.contains(b'}'));
    209     assert!(rfc.contains(b'~'));
    210     let whatwg = WHATWG_VALID_DOMAIN_CODE_POINTS;
    211     for i in 0..=0x1f {
    212         assert!(!whatwg.contains(i));
    213     }
    214     assert!(!whatwg.contains(b'\x20'));
    215     assert!(!whatwg.contains(b'#'));
    216     assert!(!whatwg.contains(b'/'));
    217     assert!(!whatwg.contains(b':'));
    218     assert!(!whatwg.contains(b'<'));
    219     assert!(!whatwg.contains(b'>'));
    220     assert!(!whatwg.contains(b'?'));
    221     assert!(!whatwg.contains(b'@'));
    222     assert!(!whatwg.contains(b'['));
    223     assert!(!whatwg.contains(b'\\'));
    224     assert!(!whatwg.contains(b']'));
    225     assert!(!whatwg.contains(b'^'));
    226     assert!(!whatwg.contains(b'|'));
    227     assert!(!whatwg.contains(b'%'));
    228     assert!(!whatwg.contains(b'\x7f'));
    229     assert!(!whatwg.contains(b'.'));
    230     assert_eq!(whatwg.len(), 128 - 32 - 16);
    231 }