TestCType.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/EACType.h>
  5. #include <EAStdCTest/EAStdCTest.h>
  6. #include <EATest/EATest.h>
  7. int TestCType()
  8. {
  9. using namespace EA::StdC;
  10. int nErrorCount = 0;
  11. EA::UnitTest::Report("TestCType\n");
  12. // Character categorization
  13. // To do: Change this from a macro to a template.
  14. #define ISCHAR_CATEGORY_TEST(type, category, c_from, c_to, positive) \
  15. {\
  16. for(uint32_t c = (uint32_t)(unsigned char)(c_from); c <= (uint32_t)(unsigned char)(c_to); ++c)\
  17. EATEST_VERIFY((Is##category((char##type##_t)c) != 0) == positive);\
  18. }
  19. // Make sure all chars are accepted
  20. int32_t i;
  21. char8_t n8;
  22. char16_t n16;
  23. int n32;
  24. char8_t c8;
  25. char16_t c16;
  26. for(c8 = INT8_MIN, i = INT8_MIN; i <= INT8_MAX; ++c8, ++i)
  27. {
  28. n32 = Isalnum(c8);
  29. EATEST_VERIFY(n32 != -1);
  30. n32 = Isalpha(c8);
  31. EATEST_VERIFY(n32 != -1);
  32. n32 = Isdigit(c8);
  33. EATEST_VERIFY(n32 != -1);
  34. n32 = Isxdigit(c8);
  35. EATEST_VERIFY(n32 != -1);
  36. n32 = Isgraph(c8);
  37. EATEST_VERIFY(n32 != -1);
  38. n32 = Islower(c8);
  39. EATEST_VERIFY(n32 != -1);
  40. n8 = Tolower(c8);
  41. EATEST_VERIFY(n32 != 99 || (n8 == 0));
  42. n32 = Isupper(c8);
  43. EATEST_VERIFY(n32 != -1);
  44. n8 = Toupper(c8);
  45. EATEST_VERIFY(n32 != 99 || (n8 == 0));
  46. n32 = Isprint(c8);
  47. EATEST_VERIFY(n32 != -1);
  48. n32 = Ispunct(c8);
  49. EATEST_VERIFY(n32 != -1);
  50. n32 = Isspace(c8);
  51. EATEST_VERIFY(n32 != -1);
  52. n32 = Iscntrl(c8);
  53. EATEST_VERIFY(n32 != -1);
  54. n32 = Isascii(c8);
  55. EATEST_VERIFY(n32 != -1);
  56. }
  57. // Make sure all chars are accepted
  58. for(c16 = 0, i = 0; i <= INT16_MAX; ++c16, ++i)
  59. {
  60. n32 = Isalnum(c16);
  61. EATEST_VERIFY(n32 != -1);
  62. n32 = Isalpha(c16);
  63. EATEST_VERIFY(n32 != -1);
  64. n32 = Isdigit(c16);
  65. EATEST_VERIFY(n32 != -1);
  66. n32 = Isxdigit(c16);
  67. EATEST_VERIFY(n32 != -1);
  68. n32 = Isgraph(c16);
  69. EATEST_VERIFY(n32 != -1);
  70. n32 = Islower(c16);
  71. EATEST_VERIFY(n32 != -1);
  72. n16 = Tolower(c16);
  73. EATEST_VERIFY(n32 != 99 || (n16 == 0));
  74. n32 = Isupper(c16);
  75. EATEST_VERIFY(n32 != -1);
  76. n16 = Toupper(c16);
  77. EATEST_VERIFY(n32 != 99 || (n16 == 0));
  78. n32 = Isprint(c16);
  79. EATEST_VERIFY(n32 != -1);
  80. n32 = Ispunct(c16);
  81. EATEST_VERIFY(n32 != -1);
  82. n32 = Isspace(c16);
  83. EATEST_VERIFY(n32 != -1);
  84. n32 = Iscntrl(c16);
  85. EATEST_VERIFY(n32 != -1);
  86. n32 = Isascii(c16);
  87. EATEST_VERIFY(n32 != -1);
  88. }
  89. // ********************* alnum
  90. ISCHAR_CATEGORY_TEST(8, alnum, '0', '9', true);
  91. ISCHAR_CATEGORY_TEST(8, alnum, 'a', 'z', true);
  92. ISCHAR_CATEGORY_TEST(8, alnum, 'A', 'Z', true);
  93. ISCHAR_CATEGORY_TEST(8, alnum, '\x0', '\x15', false);
  94. ISCHAR_CATEGORY_TEST(16, alnum, '0', '9', true);
  95. ISCHAR_CATEGORY_TEST(16, alnum, 'a', 'z', true);
  96. ISCHAR_CATEGORY_TEST(16, alnum, 'A', 'Z', true);
  97. // ********************* alpha
  98. ISCHAR_CATEGORY_TEST(8, alpha, '0', '9', false);
  99. ISCHAR_CATEGORY_TEST(8, alpha, 'a', 'z', true);
  100. ISCHAR_CATEGORY_TEST(8, alpha, 'A', 'Z', true);
  101. ISCHAR_CATEGORY_TEST(8, alpha, '\x0', '\x15', false);
  102. ISCHAR_CATEGORY_TEST(16, alpha, '0', '9', false);
  103. ISCHAR_CATEGORY_TEST(16, alpha, 'a', 'z', true);
  104. ISCHAR_CATEGORY_TEST(16, alpha, 'A', 'Z', true);
  105. ISCHAR_CATEGORY_TEST(16, alpha, '(', '('+10, false);
  106. // digit
  107. ISCHAR_CATEGORY_TEST(8, digit, '0', '9', true);
  108. ISCHAR_CATEGORY_TEST(8, digit, 'a', 'z', false);
  109. ISCHAR_CATEGORY_TEST(8, digit, 'A', 'Z', false);
  110. ISCHAR_CATEGORY_TEST(8, digit, '\x0', '\x15', false);
  111. ISCHAR_CATEGORY_TEST(16, digit, '0', '9', true);
  112. ISCHAR_CATEGORY_TEST(16, digit, 'a', 'z', false);
  113. ISCHAR_CATEGORY_TEST(16, digit, 'A', 'Z', false);
  114. ISCHAR_CATEGORY_TEST(16, digit, '\x70', '\x71', false);
  115. // xdigit
  116. ISCHAR_CATEGORY_TEST(8, xdigit, '0', '9', true);
  117. ISCHAR_CATEGORY_TEST(8, xdigit, 'a', 'f', true);
  118. ISCHAR_CATEGORY_TEST(8, xdigit, 'A', 'F', true);
  119. ISCHAR_CATEGORY_TEST(8, xdigit, '\x0', '\x15', false);
  120. ISCHAR_CATEGORY_TEST(16, xdigit, '0', '9', true);
  121. ISCHAR_CATEGORY_TEST(16, xdigit, 'a', 'f', true);
  122. ISCHAR_CATEGORY_TEST(16, xdigit, 'A', 'F', true);
  123. ISCHAR_CATEGORY_TEST(16, xdigit, 'z'+1, 'z'+60, false);
  124. // graph
  125. ISCHAR_CATEGORY_TEST(8, graph, '\x21','\x7e', true);
  126. ISCHAR_CATEGORY_TEST(8, graph, '\x0', '\x20', false);
  127. ISCHAR_CATEGORY_TEST(16, graph, '!', '!'+14, true);
  128. ISCHAR_CATEGORY_TEST(16, graph, '0', 'z', true);
  129. ISCHAR_CATEGORY_TEST(16, graph, '\x0', '\x20', false);
  130. // lower
  131. ISCHAR_CATEGORY_TEST(8, lower, '0', '9', false);
  132. ISCHAR_CATEGORY_TEST(8, lower, 'a', 'z', true);
  133. ISCHAR_CATEGORY_TEST(8, lower, 'A', 'Z', false);
  134. ISCHAR_CATEGORY_TEST(8, lower, '\x0', '\x15', false);
  135. ISCHAR_CATEGORY_TEST(16, lower, '0', '9', false);
  136. ISCHAR_CATEGORY_TEST(16, lower, 'a', 'z', true);
  137. ISCHAR_CATEGORY_TEST(16, lower, 'A', 'Z', false);
  138. ISCHAR_CATEGORY_TEST(16, lower, '!', '!'+14, false);
  139. // upper
  140. ISCHAR_CATEGORY_TEST(8, upper, '0', '9', false);
  141. ISCHAR_CATEGORY_TEST(8, upper, 'a', 'z', false);
  142. ISCHAR_CATEGORY_TEST(8, upper, 'A', 'Z', true);
  143. ISCHAR_CATEGORY_TEST(8, upper, '\x0', '\x15', false);
  144. ISCHAR_CATEGORY_TEST(16, upper, '0', '9', false);
  145. ISCHAR_CATEGORY_TEST(16, upper, 'a', 'z', false);
  146. ISCHAR_CATEGORY_TEST(16, upper, 'A', 'Z', true);
  147. ISCHAR_CATEGORY_TEST(16, upper, '!', '!'+14, false);
  148. // punct
  149. ISCHAR_CATEGORY_TEST(8, punct, '0', '9', false);
  150. ISCHAR_CATEGORY_TEST(8, punct, 'a', 'z', false);
  151. ISCHAR_CATEGORY_TEST(8, punct, 'A', 'Z', false);
  152. ISCHAR_CATEGORY_TEST(8, punct, '\x0', '\x15', false);
  153. ISCHAR_CATEGORY_TEST(8, punct, '!', '!', true);
  154. ISCHAR_CATEGORY_TEST(8, punct, '?', '?', true);
  155. ISCHAR_CATEGORY_TEST(8, punct, '.', '.', true);
  156. ISCHAR_CATEGORY_TEST(8, punct, ',', ',', true);
  157. ISCHAR_CATEGORY_TEST(16, punct, '0', '9', false);
  158. ISCHAR_CATEGORY_TEST(16, punct, 'a', 'z', false);
  159. ISCHAR_CATEGORY_TEST(16, punct, 'A', 'Z', false);
  160. ISCHAR_CATEGORY_TEST(16, punct, '!', '!', true);
  161. ISCHAR_CATEGORY_TEST(16, punct, '?', '?', true);
  162. ISCHAR_CATEGORY_TEST(16, punct, '.', '.', true);
  163. ISCHAR_CATEGORY_TEST(16, punct, ',', ',', true);
  164. ISCHAR_CATEGORY_TEST(16, punct, ':', ';', true);
  165. // space
  166. ISCHAR_CATEGORY_TEST(8, space, '0', '9', false);
  167. ISCHAR_CATEGORY_TEST(8, space, ' ', ' ', true);
  168. ISCHAR_CATEGORY_TEST(8, space, '\x0a', '\x0a', true);
  169. ISCHAR_CATEGORY_TEST(16, space, 'a', 'z', false);
  170. ISCHAR_CATEGORY_TEST(16, space, '\x09', '\x09', true);
  171. ISCHAR_CATEGORY_TEST(16, space, '\x0d', '\x0d', true);
  172. // cntrl
  173. ISCHAR_CATEGORY_TEST(8, cntrl, 0, '\x1f', true);
  174. ISCHAR_CATEGORY_TEST(8, cntrl, '\x7f', '\x7f', true);
  175. ISCHAR_CATEGORY_TEST(16, cntrl, 0, '\x1f', true);
  176. ISCHAR_CATEGORY_TEST(16, cntrl, '\x7f', '\x7f', true);
  177. // ascii
  178. ISCHAR_CATEGORY_TEST(8, ascii, '\x0', '\x7f', true);
  179. ISCHAR_CATEGORY_TEST(8, ascii, '\x80', '\xff', false);
  180. ISCHAR_CATEGORY_TEST(16, ascii, '\x0', '\x7f', true);
  181. ISCHAR_CATEGORY_TEST(16, ascii, '\x80', '\xff', false);
  182. // Toupper8 / Tolower8 / Toupper16 Tolower16
  183. for (int c = 'a'; c < 'z'; ++c)
  184. {
  185. EATEST_VERIFY(Toupper((char8_t)c) == 'A' + c - 'a');
  186. EATEST_VERIFY(Tolower((char8_t)('A' + c - 'a')) == (char8_t)c);
  187. EATEST_VERIFY(Toupper((char16_t)c) == char16_t('A' + c - 'a'));
  188. EATEST_VERIFY(Tolower((char16_t)('A' + c - 'a')) == char16_t((char16_t)c));
  189. }
  190. return nErrorCount;
  191. }