TestCType.cpp 7.2 KB

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