PageRenderTime 30ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/hphp/test/zend/good/ext/intl/tests/grapheme.php

https://github.com/tstarling/hiphop-php
PHP | 765 lines | 660 code | 88 blank | 17 comment | 69 complexity | 44630380e1c0a944cfb63fc517352313 MD5 | raw file
  1. <?php
  2. /*
  3. * Test grapheme functions (procedural only)
  4. */
  5. function ut_main()
  6. {
  7. $res_str = '';
  8. $char_a_diaeresis = "\xC3\xA4"; // 'LATIN SMALL LETTER A WITH DIAERESIS' (U+00E4)
  9. $char_a_ring = "\xC3\xA5"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5)
  10. $char_o_diaeresis = "\xC3\xB6"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6)
  11. $char_O_diaeresis = "\xC3\x96"; // 'LATIN CAPITAL LETTER O WITH DIAERESIS' (U+00D6)
  12. $char_angstrom_sign = "\xE2\x84\xAB"; // 'ANGSTROM SIGN' (U+212B)
  13. $char_A_ring = "\xC3\x85"; // 'LATIN CAPITAL LETTER A WITH RING ABOVE' (U+00C5)
  14. $char_ohm_sign = "\xE2\x84\xA6"; // 'OHM SIGN' (U+2126)
  15. $char_omega = "\xCE\xA9"; // 'GREEK CAPITAL LETTER OMEGA' (U+03A9)
  16. $char_combining_ring_above = "\xCC\x8A"; // 'COMBINING RING ABOVE' (U+030A)
  17. $char_fi_ligature = "\xEF\xAC\x81"; // 'LATIN SMALL LIGATURE FI' (U+FB01)
  18. $char_long_s_dot = "\xE1\xBA\x9B"; // 'LATIN SMALL LETTER LONG S WITH DOT ABOVE' (U+1E9B)
  19. // the word 'hindi' using Devanagari characters:
  20. $hindi = "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80";
  21. $char_a_ring_nfd = "a\xCC\x8A";
  22. $char_A_ring_nfd = "A\xCC\x8A";
  23. $char_o_diaeresis_nfd = "o\xCC\x88";
  24. $char_O_diaeresis_nfd = "O\xCC\x88";
  25. $char_diaeresis = "\xCC\x88";
  26. //=====================================================================================
  27. $res_str .= "\n" . 'function grapheme_strlen($string) {}' . "\n\n";
  28. $res_str .= "\"hindi\" in devanagari strlen " . grapheme_strlen($hindi) . "\n";
  29. $res_str .= "\"ab\" + \"hindi\" + \"cde\" strlen " . grapheme_strlen('ab' . $hindi . 'cde') . "\n";
  30. $res_str .= "\"\" strlen " . grapheme_strlen("") . "\n";
  31. $res_str .= "char_a_ring_nfd strlen " . grapheme_strlen($char_a_ring_nfd) . "\n";
  32. $res_str .= "char_a_ring_nfd + \"bc\" strlen " . grapheme_strlen($char_a_ring_nfd . 'bc') . "\n";
  33. $res_str .= "\"abc\" strlen " . grapheme_strlen('abc') . "\n";
  34. //=====================================================================================
  35. $res_str .= "\n" . 'function grapheme_strpos($haystack, $needle, $offset = 0) {}' . "\n\n";
  36. $tests = array(
  37. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 5 ),
  38. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
  39. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
  40. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2 ),
  41. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
  42. array( "abc", $char_a_ring_nfd, "false" ),
  43. array( $char_a_ring_nfd . "bc", "a", "false" ),
  44. array( "abc", "d", "false" ),
  45. array( "abc", "c", 2 ),
  46. array( "abc", "b", 1 ),
  47. array( "abc", "a", 0 ),
  48. array( "abc", "a", 0, 0 ),
  49. array( "abc", "a", 1, "false" ),
  50. array( "ababc", "a", 1, 2 ),
  51. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 2, 6 ),
  52. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
  53. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "op", 5 ),
  54. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "opq", 5 ),
  55. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
  56. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
  57. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 2 ),
  58. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 1 ),
  59. array( "abc", $char_a_ring_nfd . "bc", "false" ),
  60. array( $char_a_ring_nfd . "bc", "abcdefg", "false" ),
  61. array( "abc", "defghijklmnopq", "false" ),
  62. array( "abc", "ab", 0 ),
  63. array( "abc", "bc", 1 ),
  64. array( "abc", "abc", 0 ),
  65. array( "abc", "abcd", "false" ),
  66. array( "abc", "ab", 0, 0 ),
  67. array( "abc", "abc", 0, 0 ),
  68. array( "abc", "abc", 1, "false" ),
  69. array( "ababc", "ab", 1, 2 ),
  70. array( "ababc", "abc", 1, 2 ),
  71. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_a_ring_nfd . "bc", "o" . $char_a_ring_nfd . "bc", 2, 6 ),
  72. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "bc" . $char_a_ring_nfd, 2, 3 ),
  73. );
  74. foreach( $tests as $test ) {
  75. $arg1 = urlencode($test[1]);
  76. $arg0 = urlencode($test[0]);
  77. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strpos";
  78. if ( 3 == count( $test ) ) {
  79. $result = grapheme_strpos($test[0], $test[1]);
  80. }
  81. else {
  82. $res_str .= " from $test[2]";
  83. $result = grapheme_strpos($test[0], $test[1], $test[2]);
  84. }
  85. $res_str .= " = ";
  86. if ( $result === false ) {
  87. $res_str .= 'false';
  88. }
  89. else {
  90. $res_str .= $result;
  91. }
  92. $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
  93. }
  94. //=====================================================================================
  95. $res_str .= "\n" . 'function grapheme_stripos($haystack, $needle, $offset = 0) {}' . "\n\n";
  96. $tests = array(
  97. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 2, 6 ),
  98. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
  99. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 5 ),
  100. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "O", "false" ),
  101. array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
  102. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, 2 ),
  103. array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
  104. array( "Abc", $char_a_ring_nfd, "false" ),
  105. array( $char_a_ring_nfd . "bc", "A", "false" ),
  106. array( "abc", "D", "false" ),
  107. array( "abC", "c", 2 ),
  108. array( "abc", "B", 1 ),
  109. array( "Abc", "a", 0 ),
  110. array( "abc", "A", 0, 0 ),
  111. array( "Abc", "a", 1, "false" ),
  112. array( "ababc", "A", 1, 2 ),
  113. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "oP", 5 ),
  114. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "opQ", 5 ),
  115. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
  116. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bC" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
  117. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "Bc", $char_A_ring_nfd . "bc", 2 ),
  118. array( "a" . $char_a_ring_nfd . "BC", $char_a_ring_nfd . "bc", 1 ),
  119. array( "abc", $char_a_ring_nfd . "BC", "false" ),
  120. array( $char_a_ring_nfd . "BC", "aBCdefg", "false" ),
  121. array( "aBC", "Defghijklmnopq", "false" ),
  122. array( "abC", "Ab", 0 ),
  123. array( "aBC", "bc", 1 ),
  124. array( "abC", "Abc", 0 ),
  125. array( "abC", "aBcd", "false" ),
  126. array( "ABc", "ab", 0, 0 ),
  127. array( "aBc", "abC", 0, 0 ),
  128. array( "abc", "aBc", 1, "false" ),
  129. array( "ABabc", "AB", 1, 2 ),
  130. array( "abaBc", "aBc", 1, 2 ),
  131. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_A_ring_nfd . "bC", "O" . $char_a_ring_nfd . "bC", 2, 6 ),
  132. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bC" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "Bc" . $char_a_ring_nfd, 2, 3 ),
  133. );
  134. foreach( $tests as $test ) {
  135. $arg1 = urlencode($test[1]);
  136. $arg0 = urlencode($test[0]);
  137. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_stripos";
  138. if ( 3 == count( $test ) ) {
  139. $result = grapheme_stripos($test[0], $test[1]);
  140. }
  141. else {
  142. $res_str .= " from $test[2]";
  143. $result = grapheme_stripos($test[0], $test[1], $test[2]);
  144. }
  145. $res_str .= " = ";
  146. if ( $result === false ) {
  147. $res_str .= 'false';
  148. }
  149. else {
  150. $res_str .= $result;
  151. }
  152. $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
  153. }
  154. //=====================================================================================
  155. $res_str .= "\n" . 'function grapheme_strrpos($haystack, $needle, $offset = 0) {}' . "\n\n";
  156. $tests = array(
  157. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 5 ),
  158. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
  159. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
  160. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2 ),
  161. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
  162. array( "abc", $char_a_ring_nfd, "false" ),
  163. array( $char_a_ring_nfd . "bc", "a", "false" ),
  164. array( "abc", "d", "false" ),
  165. array( "abc", "c", 2 ),
  166. array( "abc", "b", 1 ),
  167. array( "abc", "a", 0 ),
  168. array( "abc", "a", 0, 0 ),
  169. array( "abc", "a", 1, "false" ),
  170. array( "ababc", "a", 1, 2 ),
  171. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", 2, 6 ),
  172. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
  173. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "op", 5 ),
  174. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "opq", "opq", 5 ),
  175. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
  176. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
  177. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 2 ),
  178. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", 1 ),
  179. array( "abc", $char_a_ring_nfd . "bc", "false" ),
  180. array( $char_a_ring_nfd . "bc", "abcdefg", "false" ),
  181. array( "abc", "defghijklmnopq", "false" ),
  182. array( "abc", "ab", 0 ),
  183. array( "abc", "bc", 1 ),
  184. array( "abc", "abc", 0 ),
  185. array( "abc", "abcd", "false" ),
  186. array( "abc", "ab", 0, 0 ),
  187. array( "abc", "abc", 0, 0 ),
  188. array( "abc", "abc", 1, "false" ),
  189. array( "ababc", "ab", 1, 2 ),
  190. array( "ababc", "abc", 1, 2 ),
  191. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_a_ring_nfd . "bc", "o" . $char_a_ring_nfd . "bc", 2, 6 ),
  192. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_a_ring_nfd . "bc" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "bc" . $char_a_ring_nfd, 2, 3 ),
  193. );
  194. foreach( $tests as $test ) {
  195. $arg1 = urlencode($test[1]);
  196. $arg0 = urlencode($test[0]);
  197. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strrpos";
  198. if ( 3 == count( $test ) ) {
  199. $result = grapheme_strrpos($test[0], $test[1]);
  200. }
  201. else {
  202. $res_str .= " from $test[2]";
  203. $result = grapheme_strrpos($test[0], $test[1], $test[2]);
  204. }
  205. $res_str .= " = ";
  206. if ( $result === false ) {
  207. $res_str .= 'false';
  208. }
  209. else {
  210. $res_str .= $result;
  211. }
  212. $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
  213. }
  214. //=====================================================================================
  215. $res_str .= "\n" . 'function grapheme_strripos($haystack, $needle, $offset = 0) {}' . "\n\n";
  216. $tests = array(
  217. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 2, 6 ),
  218. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 2, 3 ),
  219. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", 5 ),
  220. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "O", "false" ),
  221. array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, $char_o_diaeresis_nfd, 4 ),
  222. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, 2 ),
  223. array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, 1 ),
  224. array( "Abc", $char_a_ring_nfd, "false" ),
  225. array( $char_a_ring_nfd . "bc", "A", "false" ),
  226. array( "abc", "D", "false" ),
  227. array( "abC", "c", 2 ),
  228. array( "abc", "B", 1 ),
  229. array( "Abc", "a", 0 ),
  230. array( "abc", "A", 0, 0 ),
  231. array( "Abc", "a", 1, "false" ),
  232. array( "ababc", "A", 1, 2 ),
  233. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "oP", 5 ),
  234. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", "opQ", 5 ),
  235. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "abc", "false" ),
  236. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "bC" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd . "bc" . $char_o_diaeresis_nfd, 4 ),
  237. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "Bc", $char_A_ring_nfd . "bc", 2 ),
  238. array( "a" . $char_a_ring_nfd . "BC", $char_a_ring_nfd . "bc", 1 ),
  239. array( "abc", $char_a_ring_nfd . "BC", "false" ),
  240. array( $char_a_ring_nfd . "BC", "aBCdefg", "false" ),
  241. array( "aBC", "Defghijklmnopq", "false" ),
  242. array( "abC", "Ab", 0 ),
  243. array( "aBC", "bc", 1 ),
  244. array( "abC", "Abc", 0 ),
  245. array( "abC", "aBcd", "false" ),
  246. array( "ABc", "ab", 0, 0 ),
  247. array( "aBc", "abC", 0, 0 ),
  248. array( "abc", "aBc", 1, "false" ),
  249. array( "ABabc", "AB", 1, 2 ),
  250. array( "abaBc", "aBc", 1, 2 ),
  251. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o" . $char_A_ring_nfd . "bC", "O" . $char_a_ring_nfd . "bC", 2, 6 ),
  252. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bC" . $char_a_ring_nfd . "def", $char_a_ring_nfd . "Bc" . $char_a_ring_nfd, 2, 3 ),
  253. );
  254. foreach( $tests as $test ) {
  255. $arg1 = urlencode($test[1]);
  256. $arg0 = urlencode($test[0]);
  257. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strripos";
  258. if ( 3 == count( $test ) ) {
  259. $result = grapheme_strripos($test[0], $test[1]);
  260. }
  261. else {
  262. $res_str .= " from $test[2]";
  263. $result = grapheme_strripos($test[0], $test[1], $test[2]);
  264. }
  265. $res_str .= " = ";
  266. if ( $result === false ) {
  267. $res_str .= 'false';
  268. }
  269. else {
  270. $res_str .= $result;
  271. }
  272. $res_str .= " == " . $test[count($test)-1] . check_result($result, $test[count($test)-1]) . "\n";
  273. }
  274. //=====================================================================================
  275. $res_str .= "\n" . 'function grapheme_substr($string, $start, $length = -1) {}' . "\n\n";
  276. $tests = array(
  277. array( "abc", 3, "false" ),
  278. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, 5, "false" ),
  279. array( "ao" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", 2, $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
  280. array( $char_o_diaeresis_nfd . $char_a_ring_nfd . "a" . $char_A_ring_nfd . "bc", 2, "a" . $char_A_ring_nfd . "bc" ),
  281. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", 5, "O" ),
  282. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, 5, "false" ),
  283. array( "a" . $char_a_ring_nfd . "bc" . $char_O_diaeresis_nfd, 4, $char_O_diaeresis_nfd ),
  284. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", 2, $char_a_ring_nfd . "bc" ),
  285. array( "a" . $char_A_ring_nfd . "bc", 1, $char_A_ring_nfd . "bc" ),
  286. array( "Abc", -5, "false" ),
  287. array( $char_a_ring_nfd . "bc", 3, "false" ),
  288. array( "abc", 4, "false" ),
  289. array( "abC", 2, "C" ),
  290. array( "abc", 1, "bc" ),
  291. array( "Abc", 1, 1, "b" ),
  292. array( "abc", 0, 2, "ab" ),
  293. array( "Abc", -4, 1, "false" ),
  294. array( "ababc", 1, 2, "ba" ),
  295. array( "ababc", 0, 10, "ababc" ),
  296. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, 10 , "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
  297. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, "Opq" ),
  298. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -1, "Op" ),
  299. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -2, "O" ),
  300. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -3, "" ),
  301. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 5, -4, "false" ),
  302. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
  303. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -1, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
  304. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -2, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
  305. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -3, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
  306. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -4, "a" . $char_a_ring_nfd . "bc" ),
  307. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -5, "a" . $char_a_ring_nfd . "b" ),
  308. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -6, "a" . $char_a_ring_nfd ),
  309. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -7, "a" ),
  310. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -8, "" ),
  311. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", 0, -9, "false" ),
  312. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
  313. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -7, $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
  314. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -6, "bc" . $char_o_diaeresis_nfd . "Opq" ),
  315. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -5, "c" . $char_o_diaeresis_nfd . "Opq" ),
  316. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -4, $char_o_diaeresis_nfd . "Opq" ),
  317. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -3, "Opq" ),
  318. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -2, "pq" ),
  319. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -1, "q" ),
  320. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -999, "false" ),
  321. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 8, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq" ),
  322. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 7, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
  323. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 6, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
  324. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 5, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
  325. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 4, "a" . $char_a_ring_nfd . "bc" ),
  326. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 3, "a" . $char_a_ring_nfd . "b" ),
  327. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 2, "a" . $char_a_ring_nfd ),
  328. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 1, "a" ),
  329. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, 0, "" ),
  330. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -999, "false" ),
  331. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -1, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Op" ),
  332. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -2, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O" ),
  333. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -3, "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd ),
  334. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -4, "a" . $char_a_ring_nfd . "bc" ),
  335. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -5, "a" . $char_a_ring_nfd . "b" ),
  336. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -6, "a" . $char_a_ring_nfd ),
  337. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -7, "a" ),
  338. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -8, "" ),
  339. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "Opq", -8, -9, "false" ),
  340. );
  341. foreach( $tests as $test ) {
  342. $arg0 = urlencode($test[0]);
  343. $res_str .= "substring of \"$arg0\" from \"$test[1]\" - grapheme_substr";
  344. if ( 3 == count( $test ) ) {
  345. $result = grapheme_substr($test[0], $test[1]);
  346. }
  347. else {
  348. $res_str .= " with length $test[2]";
  349. $result = grapheme_substr($test[0], $test[1], $test[2]);
  350. }
  351. $res_str .= " = ";
  352. if ( $result === false ) {
  353. $res_str .= 'false';
  354. }
  355. else {
  356. $res_str .= urlencode($result);
  357. }
  358. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
  359. }
  360. //=====================================================================================
  361. $res_str .= "\n" . 'function grapheme_strstr($haystack, $needle, $before_needle = FALSE) {}' . "\n\n";
  362. $tests = array(
  363. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "o", "o", "o" ),
  364. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
  365. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_o_diaeresis_nfd, $char_o_diaeresis_nfd ),
  366. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
  367. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
  368. array( "abc", $char_a_ring_nfd, "false" ),
  369. array( $char_a_ring_nfd . "bc", "a", "false" ),
  370. array( "abc", "d", "false" ),
  371. array( "abc", "c", "c" ),
  372. array( "abc", "b", "bc" ),
  373. array( "abc", "a", "abc" ),
  374. array( "abc", "ab", "abc" ),
  375. array( "abc", "abc", "abc" ),
  376. array( "abc", "bc", "bc" ),
  377. array( "abc", "a", FALSE, "abc" ),
  378. array( "abc", "a", TRUE, "" ),
  379. array( "abc", "b", TRUE, "a" ),
  380. array( "abc", "c", TRUE, "ab" ),
  381. array( "ababc", "bab", TRUE, "a" ),
  382. array( "ababc", "abc", TRUE, "ab" ),
  383. array( "ababc", "abc", FALSE, "abc" ),
  384. array( "ab" . $char_a_ring_nfd . "c", "d", "false" ),
  385. array( "bc" . $char_a_ring_nfd . "a", "a", "a" ),
  386. array( "a" . $char_a_ring_nfd . "bc", "b", "bc" ),
  387. array( $char_a_ring_nfd . "bc", "a", "false" ),
  388. array( $char_a_ring_nfd . "abc", "ab", "abc" ),
  389. array( "abc" . $char_a_ring_nfd, "abc", "abc" . $char_a_ring_nfd),
  390. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc", $char_a_ring_nfd . "bc" ),
  391. array( "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, FALSE, $char_a_ring_nfd . "bc"),
  392. array( "a" . $char_a_ring_nfd . "bc", "a", TRUE, "" ),
  393. array( $char_a_ring_nfd . "abc", "b", TRUE, $char_a_ring_nfd . "a" ),
  394. array( "ab" . $char_a_ring_nfd . "c", "c", TRUE, "ab" . $char_a_ring_nfd ),
  395. array( "aba" . $char_a_ring_nfd . "bc", "ba" . $char_a_ring_nfd . "b", TRUE, "a" ),
  396. array( "ababc" . $char_a_ring_nfd, "abc" . $char_a_ring_nfd, TRUE, "ab" ),
  397. array( "abab" . $char_a_ring_nfd . "c", "ab" . $char_a_ring_nfd . "c", FALSE, "ab" . $char_a_ring_nfd . "c" ),
  398. );
  399. foreach( $tests as $test ) {
  400. $arg1 = urlencode($test[1]);
  401. $arg0 = urlencode($test[0]);
  402. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_strstr";
  403. if ( 3 == count( $test ) ) {
  404. $result = grapheme_strstr($test[0], $test[1]);
  405. }
  406. else {
  407. $res_str .= " before flag is " . ( $test[2] ? "TRUE" : "FALSE" );
  408. $result = grapheme_strstr($test[0], $test[1], $test[2]);
  409. }
  410. $res_str .= " = ";
  411. if ( $result === false ) {
  412. $res_str .= 'false';
  413. }
  414. else {
  415. $res_str .= urlencode($result);
  416. }
  417. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
  418. }
  419. //=====================================================================================
  420. $res_str .= "\n" . 'function grapheme_stristr($haystack, $needle, $before_needle = FALSE) {}' . "\n\n";
  421. $tests = array(
  422. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, $char_O_diaeresis_nfd, $char_o_diaeresis_nfd ),
  423. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd . "O", "o", "O" ),
  424. array( "a" . $char_a_ring_nfd . "bc" . $char_o_diaeresis_nfd, "o", "false" ),
  425. array( $char_o_diaeresis_nfd . "a" . $char_a_ring_nfd . "bc", $char_a_ring_nfd, $char_a_ring_nfd . "bc"),
  426. array( "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd, $char_a_ring_nfd . "bc"),
  427. array( "abc", $char_a_ring_nfd, "false" ),
  428. array( $char_a_ring_nfd . "bc", "A", "false" ),
  429. array( "abc", "d", "false" ),
  430. array( "abc", "C", "c" ),
  431. array( "aBc", "b", "Bc" ),
  432. array( "abc", "A", "abc" ),
  433. array( "abC", "ab", "abC" ),
  434. array( "abc", "aBc", "abc" ),
  435. array( "abC", "bc", "bC" ),
  436. array( "abc", "A", FALSE, "abc" ),
  437. array( "abc", "a", TRUE, "" ),
  438. array( "aBc", "b", TRUE, "a" ),
  439. array( "abc", "C", TRUE, "ab" ),
  440. array( "aBabc", "bab", TRUE, "a" ),
  441. array( "ababc", "aBc", TRUE, "ab" ),
  442. array( "ababc", "abC", FALSE, "abc" ),
  443. array( "ab" . $char_a_ring_nfd . "c", "d", "false" ),
  444. array( "bc" . $char_a_ring_nfd . "A", "a", "A" ),
  445. array( "a" . $char_a_ring_nfd . "bc", "B", "bc" ),
  446. array( $char_A_ring_nfd . "bc", "a", "false" ),
  447. array( $char_a_ring_nfd . "abc", "Ab", "abc" ),
  448. array( "abc" . $char_A_ring_nfd, "abc", "abc" . $char_A_ring_nfd),
  449. array( "a" . $char_a_ring_nfd . "bc", $char_A_ring_nfd . "bc", $char_a_ring_nfd . "bc" ),
  450. array( "a" . $char_A_ring_nfd . "bc", $char_a_ring_nfd, FALSE, $char_A_ring_nfd . "bc" ),
  451. array( "a" . $char_a_ring_nfd . "bc", "A", TRUE, "" ),
  452. array( $char_a_ring_nfd . "aBc", "b", TRUE, $char_a_ring_nfd . "a" ),
  453. array( "ab" . $char_a_ring_nfd . "c", "C", TRUE, "ab" . $char_a_ring_nfd ),
  454. array( "aba" . $char_A_ring_nfd . "bc", "ba" . $char_a_ring_nfd . "b", TRUE, "a" ),
  455. array( "ababc" . $char_a_ring_nfd, "aBc" . $char_A_ring_nfd, TRUE, "ab" ),
  456. array( "abAB" . $char_A_ring_nfd . "c", "ab" . $char_a_ring_nfd . "c", FALSE, "AB" . $char_A_ring_nfd . "c" ),
  457. );
  458. foreach( $tests as $test ) {
  459. $arg1 = urlencode($test[1]);
  460. $arg0 = urlencode($test[0]);
  461. $res_str .= "find \"$arg1\" in \"$arg0\" - grapheme_stristr";
  462. if ( 3 == count( $test ) ) {
  463. $result = grapheme_stristr($test[0], $test[1]);
  464. }
  465. else {
  466. $res_str .= " before flag is " . ( $test[2] ? "TRUE" : "FALSE" );
  467. $result = grapheme_stristr($test[0], $test[1], $test[2]);
  468. }
  469. $res_str .= " = ";
  470. if ( $result === false ) {
  471. $res_str .= 'false';
  472. }
  473. else {
  474. $res_str .= urlencode($result);
  475. }
  476. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
  477. }
  478. //=====================================================================================
  479. $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_COUNT, $start = 0[, $next])' . "\n\n";
  480. $tests = array(
  481. // haystack, count, [[offset], [next]], result
  482. array( "abc", 3, "abc" ),
  483. array( "abc", 2, "ab" ),
  484. array( "abc", 1, "a" ),
  485. array( "abc", 0, "" ),
  486. array( "abc", 1, 0, "a" ),
  487. array( "abc", 1, 1, "b" ),
  488. array( "abc", 1, 2, "c" ),
  489. array( "abc", 0, 2, "" ),
  490. array( "abc", 3, 0, 3, "abc" ),
  491. array( "abc", 2, 0, 2, "ab" ),
  492. array( "abc", 1, 0, 1, "a" ),
  493. array( "abc", 0, 0, 0, "" ),
  494. array( "abc", 1, 0, 1, "a" ),
  495. array( "abc", 1, 1, 2, "b" ),
  496. array( "abc", 1, 2, 3, "c" ),
  497. array( "abc", 0, 2, 2, "" ),
  498. array( "http://news.bbc.co.uk/2/hi/middle_east/7831588.stm", 48, 48 , 50 , "tm" ),
  499. array( $char_a_ring_nfd . "bc", 3, $char_a_ring_nfd . "bc" ),
  500. array( $char_a_ring_nfd . "bc", 2, $char_a_ring_nfd . "b" ),
  501. array( $char_a_ring_nfd . "bc", 1, $char_a_ring_nfd . "" ),
  502. array( $char_a_ring_nfd . "bc", 3, 0, 5, $char_a_ring_nfd . "bc" ),
  503. array( $char_a_ring_nfd . "bc", 2, 0, 4, $char_a_ring_nfd . "b" ),
  504. array( $char_a_ring_nfd . "bc", 1, 0, 3, $char_a_ring_nfd . "" ),
  505. array( $char_a_ring_nfd . "bcde", 2, 3, 5, "bc" ),
  506. array( $char_a_ring_nfd . "bcde", 2, 4, 6, "cd" ),
  507. array( $char_a_ring_nfd . "bcde" . $char_a_ring_nfd . "f", 4, 5, 11, "de" . $char_a_ring_nfd . "f" ),
  508. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
  509. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, $char_a_ring_nfd . $char_o_diaeresis_nfd ),
  510. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 1, $char_a_ring_nfd . "" ),
  511. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 0, $char_o_diaeresis_nfd),
  512. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 2, $char_o_diaeresis_nfd),
  513. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 3, $char_o_diaeresis_nfd),
  514. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 1, 4, $char_diaeresis),
  515. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 0, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  516. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 2, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  517. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 3, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  518. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 4, $char_diaeresis . $char_o_diaeresis_nfd),
  519. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 7, $char_diaeresis . $char_o_diaeresis_nfd),
  520. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 8, $char_o_diaeresis_nfd),
  521. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 10, $char_diaeresis),
  522. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 11, "false"),
  523. );
  524. $next = -1;
  525. foreach( $tests as $test ) {
  526. $arg0 = urlencode($test[0]);
  527. $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract";
  528. if ( 3 == count( $test ) ) {
  529. $result = grapheme_extract($test[0], $test[1]);
  530. }
  531. elseif ( 4 == count ( $test ) ) {
  532. $res_str .= " starting at byte position $test[2]";
  533. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_COUNT, $test[2]);
  534. }
  535. else {
  536. $res_str .= " starting at byte position $test[2] with \$next";
  537. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_COUNT, $test[2], $next);
  538. }
  539. $res_str .= " = ";
  540. if ( $result === false ) {
  541. $res_str .= 'false';
  542. }
  543. else {
  544. $res_str .= urlencode($result);
  545. }
  546. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]);
  547. if ( 5 == count ( $test ) ) {
  548. $res_str .= " \$next=$next == $test[3] ";
  549. if ( $next != $test[3] ) {
  550. $res_str .= "***FAILED***";
  551. }
  552. }
  553. $res_str .= "\n";
  554. }
  555. //=====================================================================================
  556. $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXBYTES, $start = 0)' . "\n\n";
  557. $tests = array(
  558. array( "abc", 3, "abc" ),
  559. array( "abc", 2, "ab" ),
  560. array( "abc", 1, "a" ),
  561. array( "abc", 0, "" ),
  562. array( $char_a_ring_nfd . "bc", 5, $char_a_ring_nfd . "bc" ),
  563. array( $char_a_ring_nfd . "bc", 4, $char_a_ring_nfd . "b" ),
  564. array( $char_a_ring_nfd . "bc", 1, "" ),
  565. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 9, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
  566. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 10, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
  567. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 11, $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd ),
  568. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, $char_a_ring_nfd . $char_o_diaeresis_nfd ),
  569. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 3, $char_a_ring_nfd . "" ),
  570. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 4, $char_a_ring_nfd . "" ),
  571. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 5, $char_a_ring_nfd . "" ),
  572. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 6, $char_a_ring_nfd . $char_o_diaeresis_nfd ),
  573. array( $char_a_ring_nfd . $char_o_diaeresis_nfd . "c", 7, $char_a_ring_nfd . $char_o_diaeresis_nfd . "c" ),
  574. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 0, $char_o_diaeresis_nfd),
  575. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 2, $char_o_diaeresis_nfd),
  576. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 3, $char_o_diaeresis_nfd),
  577. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 4, $char_diaeresis),
  578. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 0, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  579. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 2, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  580. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 6, 3, $char_o_diaeresis_nfd . $char_o_diaeresis_nfd),
  581. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 5, 4, $char_diaeresis . $char_o_diaeresis_nfd),
  582. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 5, 7, $char_diaeresis . $char_o_diaeresis_nfd),
  583. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 3, 8, $char_o_diaeresis_nfd),
  584. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 10, $char_diaeresis),
  585. array( $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd . $char_o_diaeresis_nfd, 2, 11, "false"),
  586. );
  587. foreach( $tests as $test ) {
  588. $arg0 = urlencode($test[0]);
  589. $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract GRAPHEME_EXTR_MAXBYTES";
  590. if ( 3 == count( $test ) ) {
  591. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXBYTES);
  592. }
  593. else {
  594. $res_str .= " starting at byte position $test[2]";
  595. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXBYTES, $test[2]);
  596. }
  597. $res_str .= " = ";
  598. if ( $result === false ) {
  599. $res_str .= 'false';
  600. }
  601. else {
  602. $res_str .= urlencode($result);
  603. }
  604. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
  605. }
  606. //=====================================================================================
  607. $res_str .= "\n" . 'function grapheme_extract($haystack, $size, $extract_type = GRAPHEME_EXTR_MAXCHARS, $start = 0)' . "\n\n";
  608. $tests = array(
  609. array( "abc", 3, "abc" ),
  610. array( "abc", 2, "ab" ),
  611. array( "abc", 1, "a" ),
  612. array( "abc", 0, "" ),
  613. array( "abc" . $char_o_diaeresis_nfd, 0, "" ),
  614. array( "abc" . $char_o_diaeresis_nfd, 1, "a" ),
  615. array( "abc" . $char_o_diaeresis_nfd, 2, "ab" ),
  616. array( "abc" . $char_o_diaeresis_nfd, 3, "abc" ),
  617. array( "abc" . $char_o_diaeresis_nfd, 4, "abc" ),
  618. array( "abc" . $char_o_diaeresis_nfd, 5, "abc" . $char_o_diaeresis_nfd),
  619. array( "abc" . $char_o_diaeresis_nfd, 6, "abc" . $char_o_diaeresis_nfd),
  620. array( $char_o_diaeresis_nfd . "abc", 0, "" ),
  621. array( $char_o_diaeresis_nfd . "abc", 1, "" ),
  622. array( $char_o_diaeresis_nfd . "abc", 2, $char_o_diaeresis_nfd ),
  623. array( $char_o_diaeresis_nfd . "abc", 3, $char_o_diaeresis_nfd . "a" ),
  624. array( $char_o_diaeresis_nfd . "abc", 4, $char_o_diaeresis_nfd . "ab" ),
  625. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 5, $char_o_diaeresis_nfd . "abc" ),
  626. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 6, $char_o_diaeresis_nfd . "abc" ),
  627. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 7, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd ),
  628. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "x" ),
  629. array( "abc", 3, 0, "abc" ),
  630. array( "abc", 2, 1, "bc" ),
  631. array( "abc", 1, 2, "c" ),
  632. array( "abc", 0, 3, "false" ),
  633. array( "abc", 1, 3, "false" ),
  634. array( "abc", 1, 999, "false" ),
  635. array( $char_o_diaeresis_nfd . "abc", 1, 6, "false" ),
  636. array( $char_o_diaeresis_nfd . "abc", 1, 999, "false" ),
  637. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 0, $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "x" ),
  638. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 1, $char_diaeresis . "abc" . $char_a_ring_nfd . "xy" ),
  639. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 2, "abc" . $char_a_ring_nfd . "xyz" ),
  640. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 3, "abc" . $char_a_ring_nfd . "xyz" ),
  641. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 4, "bc" . $char_a_ring_nfd . "xyz" ),
  642. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 5, "c" . $char_a_ring_nfd . "xyz" ),
  643. array( $char_o_diaeresis_nfd . "abc" . $char_a_ring_nfd . "xyz", 8, 6, $char_a_ring_nfd . "xyz" ),
  644. );
  645. foreach( $tests as $test ) {
  646. $arg0 = urlencode($test[0]);
  647. $res_str .= "extract from \"$arg0\" \"$test[1]\" graphemes - grapheme_extract GRAPHEME_EXTR_MAXCHARS";
  648. if ( 3 == count( $test ) ) {
  649. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXCHARS);
  650. }
  651. else {
  652. $res_str .= " starting at byte position $test[2]";
  653. $result = grapheme_extract($test[0], $test[1], GRAPHEME_EXTR_MAXCHARS, $test[2]);
  654. }
  655. $res_str .= " = ";
  656. if ( $result === false ) {
  657. $res_str .= 'false';
  658. }
  659. else {
  660. $res_str .= urlencode($result);
  661. }
  662. $res_str .= " == " . urlencode($test[count($test)-1]) . check_result($result, $test[count($test)-1]) . "\n";
  663. }
  664. //=====================================================================================
  665. return $res_str;
  666. }
  667. echo ut_main();
  668. function check_result($result, $expected) {
  669. if ( $result === false ) {
  670. $result = 'false';
  671. }
  672. if ( strcmp($result, $expected) != 0 ) {
  673. return " **FAILED** ";
  674. }
  675. return "";
  676. }
  677. ?>