tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestTextUtils.cpp (45568B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "mozilla/TextUtils.h"
      8 
      9 using mozilla::AsciiAlphanumericToNumber;
     10 using mozilla::IsAscii;
     11 using mozilla::IsAsciiAlpha;
     12 using mozilla::IsAsciiAlphanumeric;
     13 using mozilla::IsAsciiDigit;
     14 using mozilla::IsAsciiLowercaseAlpha;
     15 using mozilla::IsAsciiNullTerminated;
     16 using mozilla::IsAsciiUppercaseAlpha;
     17 
     18 static void TestIsAscii() {
     19  // char
     20 
     21  static_assert(!IsAscii(char(-1)), "char(-1) isn't ASCII");
     22 
     23  static_assert(IsAscii('\0'), "nul is ASCII");
     24 
     25  static_assert(IsAscii('A'), "'A' is ASCII");
     26  static_assert(IsAscii('B'), "'B' is ASCII");
     27  static_assert(IsAscii('M'), "'M' is ASCII");
     28  static_assert(IsAscii('Y'), "'Y' is ASCII");
     29  static_assert(IsAscii('Z'), "'Z' is ASCII");
     30 
     31  static_assert(IsAscii('['), "'[' is ASCII");
     32  static_assert(IsAscii('`'), "'`' is ASCII");
     33 
     34  static_assert(IsAscii('a'), "'a' is ASCII");
     35  static_assert(IsAscii('b'), "'b' is ASCII");
     36  static_assert(IsAscii('m'), "'m' is ASCII");
     37  static_assert(IsAscii('y'), "'y' is ASCII");
     38  static_assert(IsAscii('z'), "'z' is ASCII");
     39 
     40  static_assert(IsAscii('{'), "'{' is ASCII");
     41 
     42  static_assert(IsAscii('5'), "'5' is ASCII");
     43 
     44  static_assert(IsAscii('\x7F'), "'\\x7F' is ASCII");
     45  static_assert(!IsAscii('\x80'), "'\\x80' isn't ASCII");
     46 
     47  // char16_t
     48 
     49  static_assert(!IsAscii(char16_t(-1)), "char16_t(-1) isn't ASCII");
     50 
     51  static_assert(IsAscii(u'\0'), "nul is ASCII");
     52 
     53  static_assert(IsAscii(u'A'), "u'A' is ASCII");
     54  static_assert(IsAscii(u'B'), "u'B' is ASCII");
     55  static_assert(IsAscii(u'M'), "u'M' is ASCII");
     56  static_assert(IsAscii(u'Y'), "u'Y' is ASCII");
     57  static_assert(IsAscii(u'Z'), "u'Z' is ASCII");
     58 
     59  static_assert(IsAscii(u'['), "u'[' is ASCII");
     60  static_assert(IsAscii(u'`'), "u'`' is ASCII");
     61 
     62  static_assert(IsAscii(u'a'), "u'a' is ASCII");
     63  static_assert(IsAscii(u'b'), "u'b' is ASCII");
     64  static_assert(IsAscii(u'm'), "u'm' is ASCII");
     65  static_assert(IsAscii(u'y'), "u'y' is ASCII");
     66  static_assert(IsAscii(u'z'), "u'z' is ASCII");
     67 
     68  static_assert(IsAscii(u'{'), "u'{' is ASCII");
     69 
     70  static_assert(IsAscii(u'5'), "u'5' is ASCII");
     71 
     72  static_assert(IsAscii(u'\x7F'), "u'\\x7F' is ASCII");
     73  static_assert(!IsAscii(u'\x80'), "u'\\x80' isn't ASCII");
     74 
     75  // char32_t
     76 
     77  static_assert(!IsAscii(char32_t(-1)), "char32_t(-1) isn't ASCII");
     78 
     79  static_assert(IsAscii(U'\0'), "nul is ASCII");
     80 
     81  static_assert(IsAscii(U'A'), "U'A' is ASCII");
     82  static_assert(IsAscii(U'B'), "U'B' is ASCII");
     83  static_assert(IsAscii(U'M'), "U'M' is ASCII");
     84  static_assert(IsAscii(U'Y'), "U'Y' is ASCII");
     85  static_assert(IsAscii(U'Z'), "U'Z' is ASCII");
     86 
     87  static_assert(IsAscii(U'['), "U'[' is ASCII");
     88  static_assert(IsAscii(U'`'), "U'`' is ASCII");
     89 
     90  static_assert(IsAscii(U'a'), "U'a' is ASCII");
     91  static_assert(IsAscii(U'b'), "U'b' is ASCII");
     92  static_assert(IsAscii(U'm'), "U'm' is ASCII");
     93  static_assert(IsAscii(U'y'), "U'y' is ASCII");
     94  static_assert(IsAscii(U'z'), "U'z' is ASCII");
     95 
     96  static_assert(IsAscii(U'{'), "U'{' is ASCII");
     97 
     98  static_assert(IsAscii(U'5'), "U'5' is ASCII");
     99 
    100  static_assert(IsAscii(U'\x7F'), "U'\\x7F' is ASCII");
    101  static_assert(!IsAscii(U'\x80'), "U'\\x80' isn't ASCII");
    102 }
    103 
    104 static void TestIsAsciiNullTerminated() {
    105  // char
    106 
    107  constexpr char allChar[] =
    108      "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\0x0C\x0D\x0E\x0F"
    109      "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\0x1C\x1D\x1E\x1F"
    110      "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\0x2C\x2D\x2E\x2F"
    111      "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\0x3C\x3D\x3E\x3F"
    112      "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\0x4C\x4D\x4E\x4F"
    113      "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\0x5C\x5D\x5E\x5F"
    114      "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\0x6C\x6D\x6E\x6F"
    115      "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\0x7C\x7D\x7E\x7F";
    116 
    117  static_assert(IsAsciiNullTerminated(allChar), "allChar is ASCII");
    118 
    119  constexpr char loBadChar[] = "\x80";
    120 
    121  static_assert(!IsAsciiNullTerminated(loBadChar), "loBadChar isn't ASCII");
    122 
    123  constexpr char hiBadChar[] = "\xFF";
    124 
    125  static_assert(!IsAsciiNullTerminated(hiBadChar), "hiBadChar isn't ASCII");
    126 
    127  // char16_t
    128 
    129  constexpr char16_t allChar16[] =
    130      u"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\0x0C\x0D\x0E\x0F"
    131      "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\0x1C\x1D\x1E\x1F"
    132      "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\0x2C\x2D\x2E\x2F"
    133      "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\0x3C\x3D\x3E\x3F"
    134      "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\0x4C\x4D\x4E\x4F"
    135      "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\0x5C\x5D\x5E\x5F"
    136      "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\0x6C\x6D\x6E\x6F"
    137      "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\0x7C\x7D\x7E\x7F";
    138 
    139  static_assert(IsAsciiNullTerminated(allChar16), "allChar16 is ASCII");
    140 
    141  constexpr char16_t loBadChar16[] = u"\x80";
    142 
    143  static_assert(!IsAsciiNullTerminated(loBadChar16), "loBadChar16 isn't ASCII");
    144 
    145  constexpr char16_t hiBadChar16[] = u"\xFF";
    146 
    147  static_assert(!IsAsciiNullTerminated(hiBadChar16), "hiBadChar16 isn't ASCII");
    148 
    149  constexpr char16_t highestChar16[] = u"\uFFFF";
    150 
    151  static_assert(!IsAsciiNullTerminated(highestChar16),
    152                "highestChar16 isn't ASCII");
    153 
    154  // char32_t
    155 
    156  constexpr char32_t allChar32[] =
    157      U"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\0x0C\x0D\x0E\x0F"
    158      "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\0x1C\x1D\x1E\x1F"
    159      "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\0x2C\x2D\x2E\x2F"
    160      "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\0x3C\x3D\x3E\x3F"
    161      "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\0x4C\x4D\x4E\x4F"
    162      "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\0x5C\x5D\x5E\x5F"
    163      "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\0x6C\x6D\x6E\x6F"
    164      "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\0x7C\x7D\x7E\x7F";
    165 
    166  static_assert(IsAsciiNullTerminated(allChar32), "allChar32 is ASCII");
    167 
    168  constexpr char32_t loBadChar32[] = U"\x80";
    169 
    170  static_assert(!IsAsciiNullTerminated(loBadChar32), "loBadChar32 isn't ASCII");
    171 
    172  constexpr char32_t hiBadChar32[] = U"\xFF";
    173 
    174  static_assert(!IsAsciiNullTerminated(hiBadChar32), "hiBadChar32 isn't ASCII");
    175 
    176  constexpr char32_t highestChar32[] = {static_cast<char32_t>(-1), 0};
    177 
    178  static_assert(!IsAsciiNullTerminated(highestChar32),
    179                "highestChar32 isn't ASCII");
    180 }
    181 
    182 static void TestIsAsciiAlpha() {
    183  // char
    184 
    185  static_assert(!IsAsciiAlpha('@'), "'@' isn't ASCII alpha");
    186  static_assert('@' == 0x40, "'@' has value 0x40");
    187 
    188  static_assert('A' == 0x41, "'A' has value 0x41");
    189  static_assert(IsAsciiAlpha('A'), "'A' is ASCII alpha");
    190  static_assert(IsAsciiAlpha('B'), "'B' is ASCII alpha");
    191  static_assert(IsAsciiAlpha('M'), "'M' is ASCII alpha");
    192  static_assert(IsAsciiAlpha('Y'), "'Y' is ASCII alpha");
    193  static_assert(IsAsciiAlpha('Z'), "'Z' is ASCII alpha");
    194 
    195  static_assert('Z' == 0x5A, "'Z' has value 0x5A");
    196  static_assert('[' == 0x5B, "'[' has value 0x5B");
    197  static_assert(!IsAsciiAlpha('['), "'[' isn't ASCII alpha");
    198 
    199  static_assert(!IsAsciiAlpha('`'), "'`' isn't ASCII alpha");
    200  static_assert('`' == 0x60, "'`' has value 0x60");
    201 
    202  static_assert('a' == 0x61, "'a' has value 0x61");
    203  static_assert(IsAsciiAlpha('a'), "'a' is ASCII alpha");
    204  static_assert(IsAsciiAlpha('b'), "'b' is ASCII alpha");
    205  static_assert(IsAsciiAlpha('m'), "'m' is ASCII alpha");
    206  static_assert(IsAsciiAlpha('y'), "'y' is ASCII alpha");
    207  static_assert(IsAsciiAlpha('z'), "'z' is ASCII alpha");
    208 
    209  static_assert('z' == 0x7A, "'z' has value 0x7A");
    210  static_assert('{' == 0x7B, "'{' has value 0x7B");
    211  static_assert(!IsAsciiAlpha('{'), "'{' isn't ASCII alpha");
    212 
    213  static_assert(!IsAsciiAlpha('5'), "'5' isn't ASCII alpha");
    214 
    215  // char16_t
    216 
    217  static_assert(!IsAsciiAlpha(u'@'), "u'@' isn't ASCII alpha");
    218  static_assert(u'@' == 0x40, "u'@' has value 0x40");
    219 
    220  static_assert(u'A' == 0x41, "u'A' has value 0x41");
    221  static_assert(IsAsciiAlpha(u'A'), "u'A' is ASCII alpha");
    222  static_assert(IsAsciiAlpha(u'B'), "u'B' is ASCII alpha");
    223  static_assert(IsAsciiAlpha(u'M'), "u'M' is ASCII alpha");
    224  static_assert(IsAsciiAlpha(u'Y'), "u'Y' is ASCII alpha");
    225  static_assert(IsAsciiAlpha(u'Z'), "u'Z' is ASCII alpha");
    226 
    227  static_assert(u'Z' == 0x5A, "u'Z' has value 0x5A");
    228  static_assert(u'[' == 0x5B, "u'[' has value 0x5B");
    229  static_assert(!IsAsciiAlpha(u'['), "u'[' isn't ASCII alpha");
    230 
    231  static_assert(!IsAsciiAlpha(u'`'), "u'`' isn't ASCII alpha");
    232  static_assert(u'`' == 0x60, "u'`' has value 0x60");
    233 
    234  static_assert(u'a' == 0x61, "u'a' has value 0x61");
    235  static_assert(IsAsciiAlpha(u'a'), "u'a' is ASCII alpha");
    236  static_assert(IsAsciiAlpha(u'b'), "u'b' is ASCII alpha");
    237  static_assert(IsAsciiAlpha(u'm'), "u'm' is ASCII alpha");
    238  static_assert(IsAsciiAlpha(u'y'), "u'y' is ASCII alpha");
    239  static_assert(IsAsciiAlpha(u'z'), "u'z' is ASCII alpha");
    240 
    241  static_assert(u'z' == 0x7A, "u'z' has value 0x7A");
    242  static_assert(u'{' == 0x7B, "u'{' has value 0x7B");
    243  static_assert(!IsAsciiAlpha(u'{'), "u'{' isn't ASCII alpha");
    244 
    245  static_assert(!IsAsciiAlpha(u'5'), "u'5' isn't ASCII alpha");
    246 
    247  // char32_t
    248 
    249  static_assert(!IsAsciiAlpha(U'@'), "U'@' isn't ASCII alpha");
    250  static_assert(U'@' == 0x40, "U'@' has value 0x40");
    251 
    252  static_assert(U'A' == 0x41, "U'A' has value 0x41");
    253  static_assert(IsAsciiAlpha(U'A'), "U'A' is ASCII alpha");
    254  static_assert(IsAsciiAlpha(U'B'), "U'B' is ASCII alpha");
    255  static_assert(IsAsciiAlpha(U'M'), "U'M' is ASCII alpha");
    256  static_assert(IsAsciiAlpha(U'Y'), "U'Y' is ASCII alpha");
    257  static_assert(IsAsciiAlpha(U'Z'), "U'Z' is ASCII alpha");
    258 
    259  static_assert(U'Z' == 0x5A, "U'Z' has value 0x5A");
    260  static_assert(U'[' == 0x5B, "U'[' has value 0x5B");
    261  static_assert(!IsAsciiAlpha(U'['), "U'[' isn't ASCII alpha");
    262 
    263  static_assert(!IsAsciiAlpha(U'`'), "U'`' isn't ASCII alpha");
    264  static_assert(U'`' == 0x60, "U'`' has value 0x60");
    265 
    266  static_assert(U'a' == 0x61, "U'a' has value 0x61");
    267  static_assert(IsAsciiAlpha(U'a'), "U'a' is ASCII alpha");
    268  static_assert(IsAsciiAlpha(U'b'), "U'b' is ASCII alpha");
    269  static_assert(IsAsciiAlpha(U'm'), "U'm' is ASCII alpha");
    270  static_assert(IsAsciiAlpha(U'y'), "U'y' is ASCII alpha");
    271  static_assert(IsAsciiAlpha(U'z'), "U'z' is ASCII alpha");
    272 
    273  static_assert(U'z' == 0x7A, "U'z' has value 0x7A");
    274  static_assert(U'{' == 0x7B, "U'{' has value 0x7B");
    275  static_assert(!IsAsciiAlpha(U'{'), "U'{' isn't ASCII alpha");
    276 
    277  static_assert(!IsAsciiAlpha(U'5'), "U'5' isn't ASCII alpha");
    278 }
    279 
    280 static void TestIsAsciiUppercaseAlpha() {
    281  // char
    282 
    283  static_assert(!IsAsciiUppercaseAlpha('@'), "'@' isn't ASCII alpha uppercase");
    284  static_assert('@' == 0x40, "'@' has value 0x40");
    285 
    286  static_assert('A' == 0x41, "'A' has value 0x41");
    287  static_assert(IsAsciiUppercaseAlpha('A'), "'A' is ASCII alpha uppercase");
    288  static_assert(IsAsciiUppercaseAlpha('B'), "'B' is ASCII alpha uppercase");
    289  static_assert(IsAsciiUppercaseAlpha('M'), "'M' is ASCII alpha uppercase");
    290  static_assert(IsAsciiUppercaseAlpha('Y'), "'Y' is ASCII alpha uppercase");
    291  static_assert(IsAsciiUppercaseAlpha('Z'), "'Z' is ASCII alpha uppercase");
    292 
    293  static_assert('Z' == 0x5A, "'Z' has value 0x5A");
    294  static_assert('[' == 0x5B, "'[' has value 0x5B");
    295  static_assert(!IsAsciiUppercaseAlpha('['), "'[' isn't ASCII alpha uppercase");
    296 
    297  static_assert(!IsAsciiUppercaseAlpha('`'), "'`' isn't ASCII alpha uppercase");
    298  static_assert(!IsAsciiUppercaseAlpha('a'), "'a' is ASCII alpha uppercase");
    299  static_assert(!IsAsciiUppercaseAlpha('b'), "'b' is ASCII alpha uppercase");
    300  static_assert(!IsAsciiUppercaseAlpha('m'), "'m' is ASCII alpha uppercase");
    301  static_assert(!IsAsciiUppercaseAlpha('y'), "'y' is ASCII alpha uppercase");
    302  static_assert(!IsAsciiUppercaseAlpha('z'), "'z' is ASCII alpha uppercase");
    303  static_assert(!IsAsciiUppercaseAlpha('{'), "'{' isn't ASCII alpha uppercase");
    304 
    305  // char16_t
    306 
    307  static_assert(!IsAsciiUppercaseAlpha(u'@'),
    308                "u'@' isn't ASCII alpha uppercase");
    309  static_assert(u'@' == 0x40, "u'@' has value 0x40");
    310 
    311  static_assert(u'A' == 0x41, "u'A' has value 0x41");
    312  static_assert(IsAsciiUppercaseAlpha(u'A'), "u'A' is ASCII alpha uppercase");
    313  static_assert(IsAsciiUppercaseAlpha(u'B'), "u'B' is ASCII alpha uppercase");
    314  static_assert(IsAsciiUppercaseAlpha(u'M'), "u'M' is ASCII alpha uppercase");
    315  static_assert(IsAsciiUppercaseAlpha(u'Y'), "u'Y' is ASCII alpha uppercase");
    316  static_assert(IsAsciiUppercaseAlpha(u'Z'), "u'Z' is ASCII alpha uppercase");
    317 
    318  static_assert(u'Z' == 0x5A, "u'Z' has value 0x5A");
    319  static_assert(u'[' == 0x5B, "u'[' has value 0x5B");
    320  static_assert(!IsAsciiUppercaseAlpha(u'['),
    321                "u'[' isn't ASCII alpha uppercase");
    322 
    323  static_assert(!IsAsciiUppercaseAlpha(u'`'),
    324                "u'`' isn't ASCII alpha uppercase");
    325  static_assert(!IsAsciiUppercaseAlpha(u'a'), "u'a' is ASCII alpha uppercase");
    326  static_assert(!IsAsciiUppercaseAlpha(u'b'), "u'b' is ASCII alpha uppercase");
    327  static_assert(!IsAsciiUppercaseAlpha(u'm'), "u'm' is ASCII alpha uppercase");
    328  static_assert(!IsAsciiUppercaseAlpha(u'y'), "u'y' is ASCII alpha uppercase");
    329  static_assert(!IsAsciiUppercaseAlpha(u'z'), "u'z' is ASCII alpha uppercase");
    330  static_assert(!IsAsciiUppercaseAlpha(u'{'),
    331                "u'{' isn't ASCII alpha uppercase");
    332 
    333  // char32_t
    334 
    335  static_assert(!IsAsciiUppercaseAlpha(U'@'),
    336                "U'@' isn't ASCII alpha uppercase");
    337  static_assert(U'@' == 0x40, "U'@' has value 0x40");
    338 
    339  static_assert(U'A' == 0x41, "U'A' has value 0x41");
    340  static_assert(IsAsciiUppercaseAlpha(U'A'), "U'A' is ASCII alpha uppercase");
    341  static_assert(IsAsciiUppercaseAlpha(U'B'), "U'B' is ASCII alpha uppercase");
    342  static_assert(IsAsciiUppercaseAlpha(U'M'), "U'M' is ASCII alpha uppercase");
    343  static_assert(IsAsciiUppercaseAlpha(U'Y'), "U'Y' is ASCII alpha uppercase");
    344  static_assert(IsAsciiUppercaseAlpha(U'Z'), "U'Z' is ASCII alpha uppercase");
    345 
    346  static_assert(U'Z' == 0x5A, "U'Z' has value 0x5A");
    347  static_assert(U'[' == 0x5B, "U'[' has value 0x5B");
    348  static_assert(!IsAsciiUppercaseAlpha(U'['),
    349                "U'[' isn't ASCII alpha uppercase");
    350 
    351  static_assert(!IsAsciiUppercaseAlpha(U'`'),
    352                "U'`' isn't ASCII alpha uppercase");
    353  static_assert(!IsAsciiUppercaseAlpha(U'a'), "U'a' is ASCII alpha uppercase");
    354  static_assert(!IsAsciiUppercaseAlpha(U'b'), "U'b' is ASCII alpha uppercase");
    355  static_assert(!IsAsciiUppercaseAlpha(U'm'), "U'm' is ASCII alpha uppercase");
    356  static_assert(!IsAsciiUppercaseAlpha(U'y'), "U'y' is ASCII alpha uppercase");
    357  static_assert(!IsAsciiUppercaseAlpha(U'z'), "U'z' is ASCII alpha uppercase");
    358  static_assert(!IsAsciiUppercaseAlpha(U'{'),
    359                "U'{' isn't ASCII alpha uppercase");
    360 }
    361 
    362 static void TestIsAsciiLowercaseAlpha() {
    363  // char
    364 
    365  static_assert(!IsAsciiLowercaseAlpha('`'), "'`' isn't ASCII alpha lowercase");
    366  static_assert('`' == 0x60, "'`' has value 0x60");
    367 
    368  static_assert('a' == 0x61, "'a' has value 0x61");
    369  static_assert(IsAsciiLowercaseAlpha('a'), "'a' is ASCII alpha lowercase");
    370  static_assert(IsAsciiLowercaseAlpha('b'), "'b' is ASCII alpha lowercase");
    371  static_assert(IsAsciiLowercaseAlpha('m'), "'m' is ASCII alpha lowercase");
    372  static_assert(IsAsciiLowercaseAlpha('y'), "'y' is ASCII alpha lowercase");
    373  static_assert(IsAsciiLowercaseAlpha('z'), "'z' is ASCII alpha lowercase");
    374 
    375  static_assert('z' == 0x7A, "'z' has value 0x7A");
    376  static_assert('{' == 0x7B, "'{' has value 0x7B");
    377  static_assert(!IsAsciiLowercaseAlpha('{'), "'{' isn't ASCII alpha lowercase");
    378 
    379  static_assert(!IsAsciiLowercaseAlpha('@'), "'@' isn't ASCII alpha lowercase");
    380  static_assert(!IsAsciiLowercaseAlpha('A'), "'A' is ASCII alpha lowercase");
    381  static_assert(!IsAsciiLowercaseAlpha('B'), "'B' is ASCII alpha lowercase");
    382  static_assert(!IsAsciiLowercaseAlpha('M'), "'M' is ASCII alpha lowercase");
    383  static_assert(!IsAsciiLowercaseAlpha('Y'), "'Y' is ASCII alpha lowercase");
    384  static_assert(!IsAsciiLowercaseAlpha('Z'), "'Z' is ASCII alpha lowercase");
    385  static_assert(!IsAsciiLowercaseAlpha('['), "'[' isn't ASCII alpha lowercase");
    386 
    387  // char16_t
    388 
    389  static_assert(!IsAsciiLowercaseAlpha(u'`'),
    390                "u'`' isn't ASCII alpha lowercase");
    391  static_assert(u'`' == 0x60, "u'`' has value 0x60");
    392 
    393  static_assert(u'a' == 0x61, "u'a' has value 0x61");
    394  static_assert(IsAsciiLowercaseAlpha(u'a'), "u'a' is ASCII alpha lowercase");
    395  static_assert(IsAsciiLowercaseAlpha(u'b'), "u'b' is ASCII alpha lowercase");
    396  static_assert(IsAsciiLowercaseAlpha(u'm'), "u'm' is ASCII alpha lowercase");
    397  static_assert(IsAsciiLowercaseAlpha(u'y'), "u'y' is ASCII alpha lowercase");
    398  static_assert(IsAsciiLowercaseAlpha(u'z'), "u'z' is ASCII alpha lowercase");
    399 
    400  static_assert(u'z' == 0x7A, "u'z' has value 0x7A");
    401  static_assert(u'{' == 0x7B, "u'{' has value 0x7B");
    402  static_assert(!IsAsciiLowercaseAlpha(u'{'),
    403                "u'{' isn't ASCII alpha lowercase");
    404 
    405  static_assert(!IsAsciiLowercaseAlpha(u'@'),
    406                "u'@' isn't ASCII alpha lowercase");
    407  static_assert(!IsAsciiLowercaseAlpha(u'A'), "u'A' is ASCII alpha lowercase");
    408  static_assert(!IsAsciiLowercaseAlpha(u'B'), "u'B' is ASCII alpha lowercase");
    409  static_assert(!IsAsciiLowercaseAlpha(u'M'), "u'M' is ASCII alpha lowercase");
    410  static_assert(!IsAsciiLowercaseAlpha(u'Y'), "u'Y' is ASCII alpha lowercase");
    411  static_assert(!IsAsciiLowercaseAlpha(u'Z'), "u'Z' is ASCII alpha lowercase");
    412  static_assert(!IsAsciiLowercaseAlpha(u'['),
    413                "u'[' isn't ASCII alpha lowercase");
    414 
    415  // char32_t
    416 
    417  static_assert(!IsAsciiLowercaseAlpha(U'`'),
    418                "U'`' isn't ASCII alpha lowercase");
    419  static_assert(U'`' == 0x60, "U'`' has value 0x60");
    420 
    421  static_assert(U'a' == 0x61, "U'a' has value 0x61");
    422  static_assert(IsAsciiLowercaseAlpha(U'a'), "U'a' is ASCII alpha lowercase");
    423  static_assert(IsAsciiLowercaseAlpha(U'b'), "U'b' is ASCII alpha lowercase");
    424  static_assert(IsAsciiLowercaseAlpha(U'm'), "U'm' is ASCII alpha lowercase");
    425  static_assert(IsAsciiLowercaseAlpha(U'y'), "U'y' is ASCII alpha lowercase");
    426  static_assert(IsAsciiLowercaseAlpha(U'z'), "U'z' is ASCII alpha lowercase");
    427 
    428  static_assert(U'z' == 0x7A, "U'z' has value 0x7A");
    429  static_assert(U'{' == 0x7B, "U'{' has value 0x7B");
    430  static_assert(!IsAsciiLowercaseAlpha(U'{'),
    431                "U'{' isn't ASCII alpha lowercase");
    432 
    433  static_assert(!IsAsciiLowercaseAlpha(U'@'),
    434                "U'@' isn't ASCII alpha lowercase");
    435  static_assert(!IsAsciiLowercaseAlpha(U'A'), "U'A' is ASCII alpha lowercase");
    436  static_assert(!IsAsciiLowercaseAlpha(U'B'), "U'B' is ASCII alpha lowercase");
    437  static_assert(!IsAsciiLowercaseAlpha(U'M'), "U'M' is ASCII alpha lowercase");
    438  static_assert(!IsAsciiLowercaseAlpha(U'Y'), "U'Y' is ASCII alpha lowercase");
    439  static_assert(!IsAsciiLowercaseAlpha(U'Z'), "U'Z' is ASCII alpha lowercase");
    440  static_assert(!IsAsciiLowercaseAlpha(U'['),
    441                "U'[' isn't ASCII alpha lowercase");
    442 }
    443 
    444 static void TestIsAsciiAlphanumeric() {
    445  // char
    446 
    447  static_assert(!IsAsciiAlphanumeric('/'), "'/' isn't ASCII alphanumeric");
    448  static_assert('/' == 0x2F, "'/' has value 0x2F");
    449 
    450  static_assert('0' == 0x30, "'0' has value 0x30");
    451  static_assert(IsAsciiAlphanumeric('0'), "'0' is ASCII alphanumeric");
    452  static_assert(IsAsciiAlphanumeric('1'), "'1' is ASCII alphanumeric");
    453  static_assert(IsAsciiAlphanumeric('5'), "'5' is ASCII alphanumeric");
    454  static_assert(IsAsciiAlphanumeric('8'), "'8' is ASCII alphanumeric");
    455  static_assert(IsAsciiAlphanumeric('9'), "'9' is ASCII alphanumeric");
    456 
    457  static_assert('9' == 0x39, "'9' has value 0x39");
    458  static_assert(':' == 0x3A, "':' has value 0x3A");
    459  static_assert(!IsAsciiAlphanumeric(':'), "':' isn't ASCII alphanumeric");
    460 
    461  static_assert(!IsAsciiAlphanumeric('@'), "'@' isn't ASCII alphanumeric");
    462  static_assert('@' == 0x40, "'@' has value 0x40");
    463 
    464  static_assert('A' == 0x41, "'A' has value 0x41");
    465  static_assert(IsAsciiAlphanumeric('A'), "'A' is ASCII alphanumeric");
    466  static_assert(IsAsciiAlphanumeric('B'), "'B' is ASCII alphanumeric");
    467  static_assert(IsAsciiAlphanumeric('M'), "'M' is ASCII alphanumeric");
    468  static_assert(IsAsciiAlphanumeric('Y'), "'Y' is ASCII alphanumeric");
    469  static_assert(IsAsciiAlphanumeric('Z'), "'Z' is ASCII alphanumeric");
    470 
    471  static_assert('Z' == 0x5A, "'Z' has value 0x5A");
    472  static_assert('[' == 0x5B, "'[' has value 0x5B");
    473  static_assert(!IsAsciiAlphanumeric('['), "'[' isn't ASCII alphanumeric");
    474 
    475  static_assert(!IsAsciiAlphanumeric('`'), "'`' isn't ASCII alphanumeric");
    476  static_assert('`' == 0x60, "'`' has value 0x60");
    477 
    478  static_assert('a' == 0x61, "'a' has value 0x61");
    479  static_assert(IsAsciiAlphanumeric('a'), "'a' is ASCII alphanumeric");
    480  static_assert(IsAsciiAlphanumeric('b'), "'b' is ASCII alphanumeric");
    481  static_assert(IsAsciiAlphanumeric('m'), "'m' is ASCII alphanumeric");
    482  static_assert(IsAsciiAlphanumeric('y'), "'y' is ASCII alphanumeric");
    483  static_assert(IsAsciiAlphanumeric('z'), "'z' is ASCII alphanumeric");
    484 
    485  static_assert('z' == 0x7A, "'z' has value 0x7A");
    486  static_assert('{' == 0x7B, "'{' has value 0x7B");
    487  static_assert(!IsAsciiAlphanumeric('{'), "'{' isn't ASCII alphanumeric");
    488 
    489  // char16_t
    490 
    491  static_assert(!IsAsciiAlphanumeric(u'/'), "u'/' isn't ASCII alphanumeric");
    492  static_assert(u'/' == 0x2F, "u'/' has value 0x2F");
    493 
    494  static_assert(u'0' == 0x30, "u'0' has value 0x30");
    495  static_assert(IsAsciiAlphanumeric(u'0'), "u'0' is ASCII alphanumeric");
    496  static_assert(IsAsciiAlphanumeric(u'1'), "u'1' is ASCII alphanumeric");
    497  static_assert(IsAsciiAlphanumeric(u'5'), "u'5' is ASCII alphanumeric");
    498  static_assert(IsAsciiAlphanumeric(u'8'), "u'8' is ASCII alphanumeric");
    499  static_assert(IsAsciiAlphanumeric(u'9'), "u'9' is ASCII alphanumeric");
    500 
    501  static_assert(u'9' == 0x39, "u'9' has value 0x39");
    502  static_assert(u':' == 0x3A, "u':' has value 0x3A");
    503  static_assert(!IsAsciiAlphanumeric(u':'), "u':' isn't ASCII alphanumeric");
    504 
    505  static_assert(!IsAsciiAlphanumeric(u'@'), "u'@' isn't ASCII alphanumeric");
    506  static_assert(u'@' == 0x40, "u'@' has value 0x40");
    507 
    508  static_assert(u'A' == 0x41, "u'A' has value 0x41");
    509  static_assert(IsAsciiAlphanumeric(u'A'), "u'A' is ASCII alphanumeric");
    510  static_assert(IsAsciiAlphanumeric(u'B'), "u'B' is ASCII alphanumeric");
    511  static_assert(IsAsciiAlphanumeric(u'M'), "u'M' is ASCII alphanumeric");
    512  static_assert(IsAsciiAlphanumeric(u'Y'), "u'Y' is ASCII alphanumeric");
    513  static_assert(IsAsciiAlphanumeric(u'Z'), "u'Z' is ASCII alphanumeric");
    514 
    515  static_assert(u'Z' == 0x5A, "u'Z' has value 0x5A");
    516  static_assert(u'[' == 0x5B, "u'[' has value 0x5B");
    517  static_assert(!IsAsciiAlphanumeric(u'['), "u'[' isn't ASCII alphanumeric");
    518 
    519  static_assert(!IsAsciiAlphanumeric(u'`'), "u'`' isn't ASCII alphanumeric");
    520  static_assert(u'`' == 0x60, "u'`' has value 0x60");
    521 
    522  static_assert(u'a' == 0x61, "u'a' has value 0x61");
    523  static_assert(IsAsciiAlphanumeric(u'a'), "u'a' is ASCII alphanumeric");
    524  static_assert(IsAsciiAlphanumeric(u'b'), "u'b' is ASCII alphanumeric");
    525  static_assert(IsAsciiAlphanumeric(u'm'), "u'm' is ASCII alphanumeric");
    526  static_assert(IsAsciiAlphanumeric(u'y'), "u'y' is ASCII alphanumeric");
    527  static_assert(IsAsciiAlphanumeric(u'z'), "u'z' is ASCII alphanumeric");
    528 
    529  static_assert(u'z' == 0x7A, "u'z' has value 0x7A");
    530  static_assert(u'{' == 0x7B, "u'{' has value 0x7B");
    531  static_assert(!IsAsciiAlphanumeric(u'{'), "u'{' isn't ASCII alphanumeric");
    532 
    533  // char32_t
    534 
    535  static_assert(!IsAsciiAlphanumeric(U'/'), "U'/' isn't ASCII alphanumeric");
    536  static_assert(U'/' == 0x2F, "U'/' has value 0x2F");
    537 
    538  static_assert(U'0' == 0x30, "U'0' has value 0x30");
    539  static_assert(IsAsciiAlphanumeric(U'0'), "U'0' is ASCII alphanumeric");
    540  static_assert(IsAsciiAlphanumeric(U'1'), "U'1' is ASCII alphanumeric");
    541  static_assert(IsAsciiAlphanumeric(U'5'), "U'5' is ASCII alphanumeric");
    542  static_assert(IsAsciiAlphanumeric(U'8'), "U'8' is ASCII alphanumeric");
    543  static_assert(IsAsciiAlphanumeric(U'9'), "U'9' is ASCII alphanumeric");
    544 
    545  static_assert(U'9' == 0x39, "U'9' has value 0x39");
    546  static_assert(U':' == 0x3A, "U':' has value 0x3A");
    547  static_assert(!IsAsciiAlphanumeric(U':'), "U':' isn't ASCII alphanumeric");
    548 
    549  static_assert(!IsAsciiAlphanumeric(U'@'), "U'@' isn't ASCII alphanumeric");
    550  static_assert(U'@' == 0x40, "U'@' has value 0x40");
    551 
    552  static_assert(U'A' == 0x41, "U'A' has value 0x41");
    553  static_assert(IsAsciiAlphanumeric(U'A'), "U'A' is ASCII alphanumeric");
    554  static_assert(IsAsciiAlphanumeric(U'B'), "U'B' is ASCII alphanumeric");
    555  static_assert(IsAsciiAlphanumeric(U'M'), "U'M' is ASCII alphanumeric");
    556  static_assert(IsAsciiAlphanumeric(U'Y'), "U'Y' is ASCII alphanumeric");
    557  static_assert(IsAsciiAlphanumeric(U'Z'), "U'Z' is ASCII alphanumeric");
    558 
    559  static_assert(U'Z' == 0x5A, "U'Z' has value 0x5A");
    560  static_assert(U'[' == 0x5B, "U'[' has value 0x5B");
    561  static_assert(!IsAsciiAlphanumeric(U'['), "U'[' isn't ASCII alphanumeric");
    562 
    563  static_assert(!IsAsciiAlphanumeric(U'`'), "U'`' isn't ASCII alphanumeric");
    564  static_assert(U'`' == 0x60, "U'`' has value 0x60");
    565 
    566  static_assert(U'a' == 0x61, "U'a' has value 0x61");
    567  static_assert(IsAsciiAlphanumeric(U'a'), "U'a' is ASCII alphanumeric");
    568  static_assert(IsAsciiAlphanumeric(U'b'), "U'b' is ASCII alphanumeric");
    569  static_assert(IsAsciiAlphanumeric(U'm'), "U'm' is ASCII alphanumeric");
    570  static_assert(IsAsciiAlphanumeric(U'y'), "U'y' is ASCII alphanumeric");
    571  static_assert(IsAsciiAlphanumeric(U'z'), "U'z' is ASCII alphanumeric");
    572 
    573  static_assert(U'z' == 0x7A, "U'z' has value 0x7A");
    574  static_assert(U'{' == 0x7B, "U'{' has value 0x7B");
    575  static_assert(!IsAsciiAlphanumeric(U'{'), "U'{' isn't ASCII alphanumeric");
    576 }
    577 
    578 static void TestAsciiAlphanumericToNumber() {
    579  // char
    580  static_assert(AsciiAlphanumericToNumber('0') == 0, "'0' converts to 0");
    581  static_assert(AsciiAlphanumericToNumber('1') == 1, "'1' converts to 1");
    582  static_assert(AsciiAlphanumericToNumber('2') == 2, "'2' converts to 2");
    583  static_assert(AsciiAlphanumericToNumber('3') == 3, "'3' converts to 3");
    584  static_assert(AsciiAlphanumericToNumber('4') == 4, "'4' converts to 4");
    585  static_assert(AsciiAlphanumericToNumber('5') == 5, "'5' converts to 5");
    586  static_assert(AsciiAlphanumericToNumber('6') == 6, "'6' converts to 6");
    587  static_assert(AsciiAlphanumericToNumber('7') == 7, "'7' converts to 7");
    588  static_assert(AsciiAlphanumericToNumber('8') == 8, "'8' converts to 8");
    589  static_assert(AsciiAlphanumericToNumber('9') == 9, "'9' converts to 9");
    590 
    591  static_assert(AsciiAlphanumericToNumber('A') == 10, "'A' converts to 10");
    592  static_assert(AsciiAlphanumericToNumber('B') == 11, "'B' converts to 11");
    593  static_assert(AsciiAlphanumericToNumber('C') == 12, "'C' converts to 12");
    594  static_assert(AsciiAlphanumericToNumber('D') == 13, "'D' converts to 13");
    595  static_assert(AsciiAlphanumericToNumber('E') == 14, "'E' converts to 14");
    596  static_assert(AsciiAlphanumericToNumber('F') == 15, "'F' converts to 15");
    597  static_assert(AsciiAlphanumericToNumber('G') == 16, "'G' converts to 16");
    598  static_assert(AsciiAlphanumericToNumber('H') == 17, "'H' converts to 17");
    599  static_assert(AsciiAlphanumericToNumber('I') == 18, "'I' converts to 18");
    600  static_assert(AsciiAlphanumericToNumber('J') == 19, "'J' converts to 19");
    601  static_assert(AsciiAlphanumericToNumber('K') == 20, "'K' converts to 20");
    602  static_assert(AsciiAlphanumericToNumber('L') == 21, "'L' converts to 21");
    603  static_assert(AsciiAlphanumericToNumber('M') == 22, "'M' converts to 22");
    604  static_assert(AsciiAlphanumericToNumber('N') == 23, "'N' converts to 23");
    605  static_assert(AsciiAlphanumericToNumber('O') == 24, "'O' converts to 24");
    606  static_assert(AsciiAlphanumericToNumber('P') == 25, "'P' converts to 25");
    607  static_assert(AsciiAlphanumericToNumber('Q') == 26, "'Q' converts to 26");
    608  static_assert(AsciiAlphanumericToNumber('R') == 27, "'R' converts to 27");
    609  static_assert(AsciiAlphanumericToNumber('S') == 28, "'S' converts to 28");
    610  static_assert(AsciiAlphanumericToNumber('T') == 29, "'T' converts to 29");
    611  static_assert(AsciiAlphanumericToNumber('U') == 30, "'U' converts to 30");
    612  static_assert(AsciiAlphanumericToNumber('V') == 31, "'V' converts to 31");
    613  static_assert(AsciiAlphanumericToNumber('W') == 32, "'W' converts to 32");
    614  static_assert(AsciiAlphanumericToNumber('X') == 33, "'X' converts to 33");
    615  static_assert(AsciiAlphanumericToNumber('Y') == 34, "'Y' converts to 34");
    616  static_assert(AsciiAlphanumericToNumber('Z') == 35, "'Z' converts to 35");
    617 
    618  static_assert(AsciiAlphanumericToNumber('a') == 10, "'a' converts to 10");
    619  static_assert(AsciiAlphanumericToNumber('b') == 11, "'b' converts to 11");
    620  static_assert(AsciiAlphanumericToNumber('c') == 12, "'c' converts to 12");
    621  static_assert(AsciiAlphanumericToNumber('d') == 13, "'d' converts to 13");
    622  static_assert(AsciiAlphanumericToNumber('e') == 14, "'e' converts to 14");
    623  static_assert(AsciiAlphanumericToNumber('f') == 15, "'f' converts to 15");
    624  static_assert(AsciiAlphanumericToNumber('g') == 16, "'g' converts to 16");
    625  static_assert(AsciiAlphanumericToNumber('h') == 17, "'h' converts to 17");
    626  static_assert(AsciiAlphanumericToNumber('i') == 18, "'i' converts to 18");
    627  static_assert(AsciiAlphanumericToNumber('j') == 19, "'j' converts to 19");
    628  static_assert(AsciiAlphanumericToNumber('k') == 20, "'k' converts to 20");
    629  static_assert(AsciiAlphanumericToNumber('l') == 21, "'l' converts to 21");
    630  static_assert(AsciiAlphanumericToNumber('m') == 22, "'m' converts to 22");
    631  static_assert(AsciiAlphanumericToNumber('n') == 23, "'n' converts to 23");
    632  static_assert(AsciiAlphanumericToNumber('o') == 24, "'o' converts to 24");
    633  static_assert(AsciiAlphanumericToNumber('p') == 25, "'p' converts to 25");
    634  static_assert(AsciiAlphanumericToNumber('q') == 26, "'q' converts to 26");
    635  static_assert(AsciiAlphanumericToNumber('r') == 27, "'r' converts to 27");
    636  static_assert(AsciiAlphanumericToNumber('s') == 28, "'s' converts to 28");
    637  static_assert(AsciiAlphanumericToNumber('t') == 29, "'t' converts to 29");
    638  static_assert(AsciiAlphanumericToNumber('u') == 30, "'u' converts to 30");
    639  static_assert(AsciiAlphanumericToNumber('v') == 31, "'v' converts to 31");
    640  static_assert(AsciiAlphanumericToNumber('w') == 32, "'w' converts to 32");
    641  static_assert(AsciiAlphanumericToNumber('x') == 33, "'x' converts to 33");
    642  static_assert(AsciiAlphanumericToNumber('y') == 34, "'y' converts to 34");
    643  static_assert(AsciiAlphanumericToNumber('z') == 35, "'z' converts to 35");
    644 
    645  // char16_t
    646 
    647  static_assert(AsciiAlphanumericToNumber(u'0') == 0, "u'0' converts to 0");
    648  static_assert(AsciiAlphanumericToNumber(u'1') == 1, "u'1' converts to 1");
    649  static_assert(AsciiAlphanumericToNumber(u'2') == 2, "u'2' converts to 2");
    650  static_assert(AsciiAlphanumericToNumber(u'3') == 3, "u'3' converts to 3");
    651  static_assert(AsciiAlphanumericToNumber(u'4') == 4, "u'4' converts to 4");
    652  static_assert(AsciiAlphanumericToNumber(u'5') == 5, "u'5' converts to 5");
    653  static_assert(AsciiAlphanumericToNumber(u'6') == 6, "u'6' converts to 6");
    654  static_assert(AsciiAlphanumericToNumber(u'7') == 7, "u'7' converts to 7");
    655  static_assert(AsciiAlphanumericToNumber(u'8') == 8, "u'8' converts to 8");
    656  static_assert(AsciiAlphanumericToNumber(u'9') == 9, "u'9' converts to 9");
    657 
    658  static_assert(AsciiAlphanumericToNumber(u'A') == 10, "u'A' converts to 10");
    659  static_assert(AsciiAlphanumericToNumber(u'B') == 11, "u'B' converts to 11");
    660  static_assert(AsciiAlphanumericToNumber(u'C') == 12, "u'C' converts to 12");
    661  static_assert(AsciiAlphanumericToNumber(u'D') == 13, "u'D' converts to 13");
    662  static_assert(AsciiAlphanumericToNumber(u'E') == 14, "u'E' converts to 14");
    663  static_assert(AsciiAlphanumericToNumber(u'F') == 15, "u'F' converts to 15");
    664  static_assert(AsciiAlphanumericToNumber(u'G') == 16, "u'G' converts to 16");
    665  static_assert(AsciiAlphanumericToNumber(u'H') == 17, "u'H' converts to 17");
    666  static_assert(AsciiAlphanumericToNumber(u'I') == 18, "u'I' converts to 18");
    667  static_assert(AsciiAlphanumericToNumber(u'J') == 19, "u'J' converts to 19");
    668  static_assert(AsciiAlphanumericToNumber(u'K') == 20, "u'K' converts to 20");
    669  static_assert(AsciiAlphanumericToNumber(u'L') == 21, "u'L' converts to 21");
    670  static_assert(AsciiAlphanumericToNumber(u'M') == 22, "u'M' converts to 22");
    671  static_assert(AsciiAlphanumericToNumber(u'N') == 23, "u'N' converts to 23");
    672  static_assert(AsciiAlphanumericToNumber(u'O') == 24, "u'O' converts to 24");
    673  static_assert(AsciiAlphanumericToNumber(u'P') == 25, "u'P' converts to 25");
    674  static_assert(AsciiAlphanumericToNumber(u'Q') == 26, "u'Q' converts to 26");
    675  static_assert(AsciiAlphanumericToNumber(u'R') == 27, "u'R' converts to 27");
    676  static_assert(AsciiAlphanumericToNumber(u'S') == 28, "u'S' converts to 28");
    677  static_assert(AsciiAlphanumericToNumber(u'T') == 29, "u'T' converts to 29");
    678  static_assert(AsciiAlphanumericToNumber(u'U') == 30, "u'U' converts to 30");
    679  static_assert(AsciiAlphanumericToNumber(u'V') == 31, "u'V' converts to 31");
    680  static_assert(AsciiAlphanumericToNumber(u'W') == 32, "u'W' converts to 32");
    681  static_assert(AsciiAlphanumericToNumber(u'X') == 33, "u'X' converts to 33");
    682  static_assert(AsciiAlphanumericToNumber(u'Y') == 34, "u'Y' converts to 34");
    683  static_assert(AsciiAlphanumericToNumber(u'Z') == 35, "u'Z' converts to 35");
    684 
    685  static_assert(AsciiAlphanumericToNumber(u'a') == 10, "u'a' converts to 10");
    686  static_assert(AsciiAlphanumericToNumber(u'b') == 11, "u'b' converts to 11");
    687  static_assert(AsciiAlphanumericToNumber(u'c') == 12, "u'c' converts to 12");
    688  static_assert(AsciiAlphanumericToNumber(u'd') == 13, "u'd' converts to 13");
    689  static_assert(AsciiAlphanumericToNumber(u'e') == 14, "u'e' converts to 14");
    690  static_assert(AsciiAlphanumericToNumber(u'f') == 15, "u'f' converts to 15");
    691  static_assert(AsciiAlphanumericToNumber(u'g') == 16, "u'g' converts to 16");
    692  static_assert(AsciiAlphanumericToNumber(u'h') == 17, "u'h' converts to 17");
    693  static_assert(AsciiAlphanumericToNumber(u'i') == 18, "u'i' converts to 18");
    694  static_assert(AsciiAlphanumericToNumber(u'j') == 19, "u'j' converts to 19");
    695  static_assert(AsciiAlphanumericToNumber(u'k') == 20, "u'k' converts to 20");
    696  static_assert(AsciiAlphanumericToNumber(u'l') == 21, "u'l' converts to 21");
    697  static_assert(AsciiAlphanumericToNumber(u'm') == 22, "u'm' converts to 22");
    698  static_assert(AsciiAlphanumericToNumber(u'n') == 23, "u'n' converts to 23");
    699  static_assert(AsciiAlphanumericToNumber(u'o') == 24, "u'o' converts to 24");
    700  static_assert(AsciiAlphanumericToNumber(u'p') == 25, "u'p' converts to 25");
    701  static_assert(AsciiAlphanumericToNumber(u'q') == 26, "u'q' converts to 26");
    702  static_assert(AsciiAlphanumericToNumber(u'r') == 27, "u'r' converts to 27");
    703  static_assert(AsciiAlphanumericToNumber(u's') == 28, "u's' converts to 28");
    704  static_assert(AsciiAlphanumericToNumber(u't') == 29, "u't' converts to 29");
    705  static_assert(AsciiAlphanumericToNumber(u'u') == 30, "u'u' converts to 30");
    706  static_assert(AsciiAlphanumericToNumber(u'v') == 31, "u'v' converts to 31");
    707  static_assert(AsciiAlphanumericToNumber(u'w') == 32, "u'w' converts to 32");
    708  static_assert(AsciiAlphanumericToNumber(u'x') == 33, "u'x' converts to 33");
    709  static_assert(AsciiAlphanumericToNumber(u'y') == 34, "u'y' converts to 34");
    710  static_assert(AsciiAlphanumericToNumber(u'z') == 35, "u'z' converts to 35");
    711 
    712  // char32_t
    713 
    714  static_assert(AsciiAlphanumericToNumber(U'0') == 0, "U'0' converts to 0");
    715  static_assert(AsciiAlphanumericToNumber(U'1') == 1, "U'1' converts to 1");
    716  static_assert(AsciiAlphanumericToNumber(U'2') == 2, "U'2' converts to 2");
    717  static_assert(AsciiAlphanumericToNumber(U'3') == 3, "U'3' converts to 3");
    718  static_assert(AsciiAlphanumericToNumber(U'4') == 4, "U'4' converts to 4");
    719  static_assert(AsciiAlphanumericToNumber(U'5') == 5, "U'5' converts to 5");
    720  static_assert(AsciiAlphanumericToNumber(U'6') == 6, "U'6' converts to 6");
    721  static_assert(AsciiAlphanumericToNumber(U'7') == 7, "U'7' converts to 7");
    722  static_assert(AsciiAlphanumericToNumber(U'8') == 8, "U'8' converts to 8");
    723  static_assert(AsciiAlphanumericToNumber(U'9') == 9, "U'9' converts to 9");
    724 
    725  static_assert(AsciiAlphanumericToNumber(U'A') == 10, "U'A' converts to 10");
    726  static_assert(AsciiAlphanumericToNumber(U'B') == 11, "U'B' converts to 11");
    727  static_assert(AsciiAlphanumericToNumber(U'C') == 12, "U'C' converts to 12");
    728  static_assert(AsciiAlphanumericToNumber(U'D') == 13, "U'D' converts to 13");
    729  static_assert(AsciiAlphanumericToNumber(U'E') == 14, "U'E' converts to 14");
    730  static_assert(AsciiAlphanumericToNumber(U'F') == 15, "U'F' converts to 15");
    731  static_assert(AsciiAlphanumericToNumber(U'G') == 16, "U'G' converts to 16");
    732  static_assert(AsciiAlphanumericToNumber(U'H') == 17, "U'H' converts to 17");
    733  static_assert(AsciiAlphanumericToNumber(U'I') == 18, "U'I' converts to 18");
    734  static_assert(AsciiAlphanumericToNumber(U'J') == 19, "U'J' converts to 19");
    735  static_assert(AsciiAlphanumericToNumber(U'K') == 20, "U'K' converts to 20");
    736  static_assert(AsciiAlphanumericToNumber(U'L') == 21, "U'L' converts to 21");
    737  static_assert(AsciiAlphanumericToNumber(U'M') == 22, "U'M' converts to 22");
    738  static_assert(AsciiAlphanumericToNumber(U'N') == 23, "U'N' converts to 23");
    739  static_assert(AsciiAlphanumericToNumber(U'O') == 24, "U'O' converts to 24");
    740  static_assert(AsciiAlphanumericToNumber(U'P') == 25, "U'P' converts to 25");
    741  static_assert(AsciiAlphanumericToNumber(U'Q') == 26, "U'Q' converts to 26");
    742  static_assert(AsciiAlphanumericToNumber(U'R') == 27, "U'R' converts to 27");
    743  static_assert(AsciiAlphanumericToNumber(U'S') == 28, "U'S' converts to 28");
    744  static_assert(AsciiAlphanumericToNumber(U'T') == 29, "U'T' converts to 29");
    745  static_assert(AsciiAlphanumericToNumber(U'U') == 30, "U'U' converts to 30");
    746  static_assert(AsciiAlphanumericToNumber(U'V') == 31, "U'V' converts to 31");
    747  static_assert(AsciiAlphanumericToNumber(U'W') == 32, "U'W' converts to 32");
    748  static_assert(AsciiAlphanumericToNumber(U'X') == 33, "U'X' converts to 33");
    749  static_assert(AsciiAlphanumericToNumber(U'Y') == 34, "U'Y' converts to 34");
    750  static_assert(AsciiAlphanumericToNumber(U'Z') == 35, "U'Z' converts to 35");
    751 
    752  static_assert(AsciiAlphanumericToNumber(U'a') == 10, "U'a' converts to 10");
    753  static_assert(AsciiAlphanumericToNumber(U'b') == 11, "U'b' converts to 11");
    754  static_assert(AsciiAlphanumericToNumber(U'c') == 12, "U'c' converts to 12");
    755  static_assert(AsciiAlphanumericToNumber(U'd') == 13, "U'd' converts to 13");
    756  static_assert(AsciiAlphanumericToNumber(U'e') == 14, "U'e' converts to 14");
    757  static_assert(AsciiAlphanumericToNumber(U'f') == 15, "U'f' converts to 15");
    758  static_assert(AsciiAlphanumericToNumber(U'g') == 16, "U'g' converts to 16");
    759  static_assert(AsciiAlphanumericToNumber(U'h') == 17, "U'h' converts to 17");
    760  static_assert(AsciiAlphanumericToNumber(U'i') == 18, "U'i' converts to 18");
    761  static_assert(AsciiAlphanumericToNumber(U'j') == 19, "U'j' converts to 19");
    762  static_assert(AsciiAlphanumericToNumber(U'k') == 20, "U'k' converts to 20");
    763  static_assert(AsciiAlphanumericToNumber(U'l') == 21, "U'l' converts to 21");
    764  static_assert(AsciiAlphanumericToNumber(U'm') == 22, "U'm' converts to 22");
    765  static_assert(AsciiAlphanumericToNumber(U'n') == 23, "U'n' converts to 23");
    766  static_assert(AsciiAlphanumericToNumber(U'o') == 24, "U'o' converts to 24");
    767  static_assert(AsciiAlphanumericToNumber(U'p') == 25, "U'p' converts to 25");
    768  static_assert(AsciiAlphanumericToNumber(U'q') == 26, "U'q' converts to 26");
    769  static_assert(AsciiAlphanumericToNumber(U'r') == 27, "U'r' converts to 27");
    770  static_assert(AsciiAlphanumericToNumber(U's') == 28, "U's' converts to 28");
    771  static_assert(AsciiAlphanumericToNumber(U't') == 29, "U't' converts to 29");
    772  static_assert(AsciiAlphanumericToNumber(U'u') == 30, "U'u' converts to 30");
    773  static_assert(AsciiAlphanumericToNumber(U'v') == 31, "U'v' converts to 31");
    774  static_assert(AsciiAlphanumericToNumber(U'w') == 32, "U'w' converts to 32");
    775  static_assert(AsciiAlphanumericToNumber(U'x') == 33, "U'x' converts to 33");
    776  static_assert(AsciiAlphanumericToNumber(U'y') == 34, "U'y' converts to 34");
    777  static_assert(AsciiAlphanumericToNumber(U'z') == 35, "U'z' converts to 35");
    778 }
    779 
    780 static void TestIsAsciiDigit() {
    781  // char
    782 
    783  static_assert(!IsAsciiDigit('/'), "'/' isn't an ASCII digit");
    784  static_assert('/' == 0x2F, "'/' has value 0x2F");
    785 
    786  static_assert('0' == 0x30, "'0' has value 0x30");
    787  static_assert(IsAsciiDigit('0'), "'0' is an ASCII digit");
    788  static_assert(IsAsciiDigit('1'), "'1' is an ASCII digit");
    789  static_assert(IsAsciiDigit('5'), "'5' is an ASCII digit");
    790  static_assert(IsAsciiDigit('8'), "'8' is an ASCII digit");
    791  static_assert(IsAsciiDigit('9'), "'9' is an ASCII digit");
    792 
    793  static_assert('9' == 0x39, "'9' has value 0x39");
    794  static_assert(':' == 0x3A, "':' has value 0x3A");
    795  static_assert(!IsAsciiDigit(':'), "':' isn't an ASCII digit");
    796 
    797  static_assert(!IsAsciiDigit('@'), "'@' isn't an ASCII digit");
    798  static_assert(!IsAsciiDigit('A'), "'A' isn't an ASCII digit");
    799  static_assert(!IsAsciiDigit('B'), "'B' isn't an ASCII digit");
    800  static_assert(!IsAsciiDigit('M'), "'M' isn't an ASCII digit");
    801  static_assert(!IsAsciiDigit('Y'), "'Y' isn't an ASCII digit");
    802  static_assert(!IsAsciiDigit('Z'), "'Z' isn't an ASCII digit");
    803  static_assert(!IsAsciiDigit('['), "'[' isn't an ASCII digit");
    804  static_assert(!IsAsciiDigit('`'), "'`' isn't an ASCII digit");
    805  static_assert(!IsAsciiDigit('a'), "'a' isn't an ASCII digit");
    806  static_assert(!IsAsciiDigit('b'), "'b' isn't an ASCII digit");
    807  static_assert(!IsAsciiDigit('m'), "'m' isn't an ASCII digit");
    808  static_assert(!IsAsciiDigit('y'), "'y' isn't an ASCII digit");
    809  static_assert(!IsAsciiDigit('z'), "'z' isn't an ASCII digit");
    810  static_assert(!IsAsciiDigit('{'), "'{' isn't an ASCII digit");
    811 
    812  // char16_t
    813 
    814  static_assert(!IsAsciiDigit(u'/'), "u'/' isn't an ASCII digit");
    815  static_assert(u'/' == 0x2F, "u'/' has value 0x2F");
    816  static_assert(u'0' == 0x30, "u'0' has value 0x30");
    817  static_assert(IsAsciiDigit(u'0'), "u'0' is an ASCII digit");
    818  static_assert(IsAsciiDigit(u'1'), "u'1' is an ASCII digit");
    819  static_assert(IsAsciiDigit(u'5'), "u'5' is an ASCII digit");
    820  static_assert(IsAsciiDigit(u'8'), "u'8' is an ASCII digit");
    821  static_assert(IsAsciiDigit(u'9'), "u'9' is an ASCII digit");
    822 
    823  static_assert(u'9' == 0x39, "u'9' has value 0x39");
    824  static_assert(u':' == 0x3A, "u':' has value 0x3A");
    825  static_assert(!IsAsciiDigit(u':'), "u':' isn't an ASCII digit");
    826 
    827  static_assert(!IsAsciiDigit(u'@'), "u'@' isn't an ASCII digit");
    828  static_assert(!IsAsciiDigit(u'A'), "u'A' isn't an ASCII digit");
    829  static_assert(!IsAsciiDigit(u'B'), "u'B' isn't an ASCII digit");
    830  static_assert(!IsAsciiDigit(u'M'), "u'M' isn't an ASCII digit");
    831  static_assert(!IsAsciiDigit(u'Y'), "u'Y' isn't an ASCII digit");
    832  static_assert(!IsAsciiDigit(u'Z'), "u'Z' isn't an ASCII digit");
    833  static_assert(!IsAsciiDigit(u'['), "u'[' isn't an ASCII digit");
    834  static_assert(!IsAsciiDigit(u'`'), "u'`' isn't an ASCII digit");
    835  static_assert(!IsAsciiDigit(u'a'), "u'a' isn't an ASCII digit");
    836  static_assert(!IsAsciiDigit(u'b'), "u'b' isn't an ASCII digit");
    837  static_assert(!IsAsciiDigit(u'm'), "u'm' isn't an ASCII digit");
    838  static_assert(!IsAsciiDigit(u'y'), "u'y' isn't an ASCII digit");
    839  static_assert(!IsAsciiDigit(u'z'), "u'z' isn't an ASCII digit");
    840  static_assert(!IsAsciiDigit(u'{'), "u'{' isn't an ASCII digit");
    841 
    842  // char32_t
    843 
    844  static_assert(!IsAsciiDigit(U'/'), "U'/' isn't an ASCII digit");
    845  static_assert(U'/' == 0x2F, "U'/' has value 0x2F");
    846 
    847  static_assert(U'0' == 0x30, "U'0' has value 0x30");
    848  static_assert(IsAsciiDigit(U'0'), "U'0' is an ASCII digit");
    849  static_assert(IsAsciiDigit(U'1'), "U'1' is an ASCII digit");
    850  static_assert(IsAsciiDigit(U'5'), "U'5' is an ASCII digit");
    851  static_assert(IsAsciiDigit(U'8'), "U'8' is an ASCII digit");
    852  static_assert(IsAsciiDigit(U'9'), "U'9' is an ASCII digit");
    853 
    854  static_assert(U'9' == 0x39, "U'9' has value 0x39");
    855  static_assert(U':' == 0x3A, "U':' has value 0x3A");
    856  static_assert(!IsAsciiDigit(U':'), "U':' isn't an ASCII digit");
    857 
    858  static_assert(!IsAsciiDigit(U'@'), "U'@' isn't an ASCII digit");
    859  static_assert(!IsAsciiDigit(U'A'), "U'A' isn't an ASCII digit");
    860  static_assert(!IsAsciiDigit(U'B'), "U'B' isn't an ASCII digit");
    861  static_assert(!IsAsciiDigit(U'M'), "U'M' isn't an ASCII digit");
    862  static_assert(!IsAsciiDigit(U'Y'), "U'Y' isn't an ASCII digit");
    863  static_assert(!IsAsciiDigit(U'Z'), "U'Z' isn't an ASCII digit");
    864  static_assert(!IsAsciiDigit(U'['), "U'[' isn't an ASCII digit");
    865  static_assert(!IsAsciiDigit(U'`'), "U'`' isn't an ASCII digit");
    866  static_assert(!IsAsciiDigit(U'a'), "U'a' isn't an ASCII digit");
    867  static_assert(!IsAsciiDigit(U'b'), "U'b' isn't an ASCII digit");
    868  static_assert(!IsAsciiDigit(U'm'), "U'm' isn't an ASCII digit");
    869  static_assert(!IsAsciiDigit(U'y'), "U'y' isn't an ASCII digit");
    870  static_assert(!IsAsciiDigit(U'z'), "U'z' isn't an ASCII digit");
    871  static_assert(!IsAsciiDigit(U'{'), "U'{' isn't an ASCII digit");
    872 }
    873 
    874 int main() {
    875  TestIsAscii();
    876  TestIsAsciiNullTerminated();
    877  TestIsAsciiAlpha();
    878  TestIsAsciiUppercaseAlpha();
    879  TestIsAsciiLowercaseAlpha();
    880  TestIsAsciiAlphanumeric();
    881  TestAsciiAlphanumericToNumber();
    882  TestIsAsciiDigit();
    883 }