regex-unicode-CaseInsensitive.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. function a(re,p,str) {
  6. if (!re.test(str)) console.log("FAILED -- regex: " + re.toString() + " should match codepoint: " + p.toString(16))
  7. }
  8. function b(re,p,str) {
  9. if (re.test(str)) console.log("FAILED -- regex: " + re.toString() + " should not match codepoint: " + p.toString(16))
  10. }
  11. //
  12. // Tests adapted from issue #517
  13. //
  14. a(/\u0345/iu,0x0345,'\u0345')
  15. a(/\u0345/iu,0x03b9,'\u0399')
  16. a(/\u0345/iu,0x03b9,'\u03b9')
  17. a(/\u0345/iu,0x1fbe,'\u1fbe')
  18. a(/\u0399/iu,0x0345,'\u0345')
  19. a(/\u0399/iu,0x03b9,'\u0399')
  20. a(/\u0399/iu,0x03b9,'\u03b9')
  21. a(/\u0399/iu,0x1fbe,'\u1fbe')
  22. a(/\u03b9/iu,0x0345,'\u0345')
  23. a(/\u03b9/iu,0x03b9,'\u0399')
  24. a(/\u03b9/iu,0x03b9,'\u03b9')
  25. a(/\u03b9/iu,0x1fbe,'\u1fbe')
  26. a(/\u1fbe/iu,0x0345,'\u0345')
  27. a(/\u1fbe/iu,0x03b9,'\u0399')
  28. a(/\u1fbe/iu,0x03b9,'\u03b9')
  29. a(/\u1fbe/iu,0x1fbe,'\u1fbe')
  30. a(/\u01f1/iu,0x01f3,'\u01f3')
  31. a(/\u0345/iu,0x03b9,'\u03b9')
  32. a(/\u037f/iu,0x03f3,'\u03f3')
  33. a(/\u0528/iu,0x0529,'\u0529')
  34. a(/\u052a/iu,0x052b,'\u052b')
  35. a(/\u052c/iu,0x052d,'\u052d')
  36. a(/\u052e/iu,0x052f,'\u052f')
  37. a(/\ua698/iu,0xa699,'\ua699')
  38. a(/\ua69a/iu,0xa69b,'\ua69b')
  39. a(/\ua796/iu,0xa797,'\ua797')
  40. a(/\ua798/iu,0xa799,'\ua799')
  41. a(/\ua79a/iu,0xa79b,'\ua79b')
  42. a(/\ua79c/iu,0xa79d,'\ua79d')
  43. a(/\ua79e/iu,0xa79f,'\ua79f')
  44. a(/\ua7ab/iu,0x025c,'\u025c')
  45. a(/\ua7ac/iu,0x0261,'\u0261')
  46. a(/\ua7ad/iu,0x026c,'\u026c')
  47. a(/\ua7b0/iu,0x029e,'\u029e')
  48. a(/\ua7b1/iu,0x0287,'\u0287')
  49. a(/\u0345/i,0x0345,'\u0345')
  50. a(/\u0345/i,0x03b9,'\u0399')
  51. a(/\u0345/i,0x03b9,'\u03b9')
  52. a(/\u0345/i,0x1fbe,'\u1fbe')
  53. a(/\u0399/i,0x0345,'\u0345')
  54. a(/\u0399/i,0x03b9,'\u0399')
  55. a(/\u0399/i,0x03b9,'\u03b9')
  56. a(/\u0399/i,0x1fbe,'\u1fbe')
  57. a(/\u03b9/i,0x0345,'\u0345')
  58. a(/\u03b9/i,0x03b9,'\u0399')
  59. a(/\u03b9/i,0x03b9,'\u03b9')
  60. a(/\u03b9/i,0x1fbe,'\u1fbe')
  61. a(/\u1fbe/i,0x0345,'\u0345')
  62. a(/\u1fbe/i,0x03b9,'\u0399')
  63. a(/\u1fbe/i,0x03b9,'\u03b9')
  64. a(/\u1fbe/i,0x1fbe,'\u1fbe')
  65. a(/\u01f1/i,0x01f3,'\u01f3')
  66. a(/\u037f/i,0x03f3,'\u03f3')
  67. a(/\u0528/i,0x0529,'\u0529')
  68. a(/\u052a/i,0x052b,'\u052b')
  69. a(/\u052c/i,0x052d,'\u052d')
  70. a(/\u052e/i,0x052f,'\u052f')
  71. a(/\ua698/i,0xa699,'\ua699')
  72. a(/\ua69a/i,0xa69b,'\ua69b')
  73. a(/\ua796/i,0xa797,'\ua797')
  74. a(/\ua798/i,0xa799,'\ua799')
  75. a(/\ua79a/i,0xa79b,'\ua79b')
  76. a(/\ua79c/i,0xa79d,'\ua79d')
  77. a(/\ua79e/i,0xa79f,'\ua79f')
  78. a(/\ua7ab/i,0x025c,'\u025c')
  79. a(/\ua7ac/i,0x0261,'\u0261')
  80. a(/\ua7ad/i,0x026c,'\u026c')
  81. a(/\ua7b0/i,0x029e,'\u029e')
  82. a(/\ua7b1/i,0x0287,'\u0287')
  83. //
  84. // Detect regressions in the CaseInsensitive table
  85. //
  86. // 01BA != 01BB under /i.
  87. b(/\u01ba/iu,0x01bb,"\u01bb")
  88. b(/\u01bb/iu,0x01ba,"\u01ba")
  89. b(/\u01ba/i,0x01bb,"\u01bb")
  90. b(/\u01bb/i,0x01ba,"\u01ba")
  91. // 01F0 doesn't match anything
  92. b(/\u01f0/iu,0x01f1,"\u01f1")
  93. b(/\u01f1/iu,0x01f0,"\u01f0")
  94. b(/\u01f0/i,0x01f1,"\u01f1")
  95. b(/\u01f1/i,0x01f0,"\u01f0")
  96. // 01F4-5 match (G with ACUTE)
  97. a(/\u01f4/iu,0x01f5,"\u01f5")
  98. a(/\u01f5/iu,0x01f4,"\u01f4")
  99. a(/\u01f4/i,0x01f5,"\u01f5")
  100. a(/\u01f5/i,0x01f4,"\u01f4")
  101. // Latin ligature triples DZ WITH CARON,LJ,NJ (01C4-01CC) DZ (01F1-3)
  102. a(/\u01c4/iu,0x01c4,'\u01c4')
  103. a(/\u01c4/iu,0x01c5,'\u01c5')
  104. a(/\u01c4/iu,0x01c6,'\u01c6')
  105. a(/\u01c5/iu,0x01c4,'\u01c4')
  106. a(/\u01c5/iu,0x01c5,'\u01c5')
  107. a(/\u01c5/iu,0x01c6,'\u01c6')
  108. a(/\u01c6/iu,0x01c4,'\u01c4')
  109. a(/\u01c6/iu,0x01c5,'\u01c5')
  110. a(/\u01c6/iu,0x01c6,'\u01c6')
  111. a(/\u01c7/iu,0x01c7,'\u01c7')
  112. a(/\u01c7/iu,0x01c8,'\u01c8')
  113. a(/\u01c7/iu,0x01c9,'\u01c9')
  114. a(/\u01c9/iu,0x01c7,'\u01c7')
  115. a(/\u01c9/iu,0x01c8,'\u01c8')
  116. a(/\u01c9/iu,0x01c9,'\u01c9')
  117. a(/\u01c8/iu,0x01c7,'\u01c7')
  118. a(/\u01c8/iu,0x01c8,'\u01c8')
  119. a(/\u01c8/iu,0x01c9,'\u01c9')
  120. a(/\u01ca/iu,0x01ca,'\u01ca')
  121. a(/\u01ca/iu,0x01cb,'\u01cb')
  122. a(/\u01ca/iu,0x01cc,'\u01cc')
  123. a(/\u01cb/iu,0x01ca,'\u01ca')
  124. a(/\u01cb/iu,0x01cb,'\u01cb')
  125. a(/\u01cb/iu,0x01cc,'\u01cc')
  126. a(/\u01cc/iu,0x01ca,'\u01ca')
  127. a(/\u01cc/iu,0x01cb,'\u01cb')
  128. a(/\u01cc/iu,0x01cc,'\u01cc')
  129. a(/\u01f1/iu,0x01f1,'\u01f1')
  130. a(/\u01f1/iu,0x01f2,'\u01f2')
  131. a(/\u01f1/iu,0x01f3,'\u01f3')
  132. a(/\u01f2/iu,0x01f2,'\u01f2')
  133. a(/\u01f2/iu,0x01f1,'\u01f1')
  134. a(/\u01f2/iu,0x01f3,'\u01f3')
  135. a(/\u01f3/iu,0x01f1,'\u01f1')
  136. a(/\u01f3/iu,0x01f2,'\u01f2')
  137. a(/\u01f3/iu,0x01f3,'\u01f3')
  138. a(/\u01c4/i,0x01c4,'\u01c4')
  139. a(/\u01c4/i,0x01c5,'\u01c5')
  140. a(/\u01c4/i,0x01c6,'\u01c6')
  141. a(/\u01c5/i,0x01c4,'\u01c4')
  142. a(/\u01c5/i,0x01c5,'\u01c5')
  143. a(/\u01c5/i,0x01c6,'\u01c6')
  144. a(/\u01c6/i,0x01c4,'\u01c4')
  145. a(/\u01c6/i,0x01c5,'\u01c5')
  146. a(/\u01c6/i,0x01c6,'\u01c6')
  147. a(/\u01c7/i,0x01c7,'\u01c7')
  148. a(/\u01c7/i,0x01c8,'\u01c8')
  149. a(/\u01c7/i,0x01c9,'\u01c9')
  150. a(/\u01c9/i,0x01c7,'\u01c7')
  151. a(/\u01c9/i,0x01c8,'\u01c8')
  152. a(/\u01c9/i,0x01c9,'\u01c9')
  153. a(/\u01c8/i,0x01c7,'\u01c7')
  154. a(/\u01c8/i,0x01c8,'\u01c8')
  155. a(/\u01c8/i,0x01c9,'\u01c9')
  156. a(/\u01ca/i,0x01ca,'\u01ca')
  157. a(/\u01ca/i,0x01cb,'\u01cb')
  158. a(/\u01ca/i,0x01cc,'\u01cc')
  159. a(/\u01cb/i,0x01ca,'\u01ca')
  160. a(/\u01cb/i,0x01cb,'\u01cb')
  161. a(/\u01cb/i,0x01cc,'\u01cc')
  162. a(/\u01cc/i,0x01ca,'\u01ca')
  163. a(/\u01cc/i,0x01cb,'\u01cb')
  164. a(/\u01cc/i,0x01cc,'\u01cc')
  165. a(/\u01f1/i,0x01f1,'\u01f1')
  166. a(/\u01f1/i,0x01f2,'\u01f2')
  167. a(/\u01f1/i,0x01f3,'\u01f3')
  168. a(/\u01f2/i,0x01f2,'\u01f2')
  169. a(/\u01f2/i,0x01f1,'\u01f1')
  170. a(/\u01f2/i,0x01f3,'\u01f3')
  171. a(/\u01f3/i,0x01f1,'\u01f1')
  172. a(/\u01f3/i,0x01f2,'\u01f2')
  173. a(/\u01f3/i,0x01f3,'\u01f3')
  174. // 037F and 03F3 - GREEK LETTER YOT
  175. a(/\u037f/iu,0x037f,'\u037f')
  176. a(/\u037f/iu,0x03f3,'\u03f3')
  177. a(/\u03f3/iu,0x037f,'\u037f')
  178. a(/\u03f3/iu,0x03f3,'\u03f3')
  179. a(/\u037f/i,0x037f,'\u037f')
  180. a(/\u037f/i,0x03f3,'\u03f3')
  181. a(/\u03f3/i,0x037f,'\u037f')
  182. a(/\u03f3/i,0x03f3,'\u03f3')
  183. // New Cyrillic case-mapped pairs
  184. a(/\u0528/iu,0x0529,'\u0529')
  185. a(/\u0529/iu,0x0528,'\u0528')
  186. a(/\u052a/iu,0x052b,'\u052b')
  187. a(/\u052b/iu,0x052a,'\u052a')
  188. a(/\u052c/iu,0x052d,'\u052d')
  189. a(/\u052d/iu,0x052c,'\u052c')
  190. a(/\u052e/iu,0x052f,'\u052f')
  191. a(/\u052f/iu,0x052e,'\u052e')
  192. a(/\ua698/iu,0xa699,'\ua699')
  193. a(/\ua699/iu,0xa698,'\ua698')
  194. a(/\ua69a/iu,0xa69b,'\ua69b')
  195. a(/\ua69b/iu,0xa69a,'\ua69a')
  196. a(/\u0528/i,0x0529,'\u0529')
  197. a(/\u0529/i,0x0528,'\u0528')
  198. a(/\u052a/i,0x052b,'\u052b')
  199. a(/\u052b/i,0x052a,'\u052a')
  200. a(/\u052c/i,0x052d,'\u052d')
  201. a(/\u052d/i,0x052c,'\u052c')
  202. a(/\u052e/i,0x052f,'\u052f')
  203. a(/\u052f/i,0x052e,'\u052e')
  204. a(/\ua698/i,0xa699,'\ua699')
  205. a(/\ua699/i,0xa698,'\ua698')
  206. a(/\ua69a/i,0xa69b,'\ua69b')
  207. a(/\ua69b/i,0xa69a,'\ua69a')
  208. // New Cherokee uppercase-lowercase mappings and case-mapping pairs.
  209. a(/\u13a0/iu,0xab70,'\uab70')
  210. a(/\uab70/iu,0x13a0,'\u13a0')
  211. a(/\u13a1/iu,0xab71,'\uab71')
  212. a(/\uab71/iu,0x13a1,'\u13a1')
  213. // ...
  214. a(/\u13ee/iu,0xabbe,'\uabbe')
  215. a(/\uabbe/iu,0x13ee,'\u13ee')
  216. a(/\u13ef/iu,0xabbf,'\uabbf')
  217. a(/\uabbf/iu,0x13ef,'\u13ef')
  218. a(/\u13f0/iu,0x13f8,'\u13f8')
  219. a(/\u13f8/iu,0x13f0,'\u13f0')
  220. a(/\u13f1/iu,0x13f9,'\u13f9')
  221. a(/\u13f9/iu,0x13f1,'\u13f1')
  222. a(/\u13f2/iu,0x13fa,'\u13fa')
  223. a(/\u13fa/iu,0x13f2,'\u13f2')
  224. a(/\u13f3/iu,0x13fb,'\u13fb')
  225. a(/\u13fb/iu,0x13f3,'\u13f3')
  226. a(/\u13f4/iu,0x13fc,'\u13fc')
  227. a(/\u13fc/iu,0x13f4,'\u13f4')
  228. a(/\u13f5/iu,0x13fd,'\u13fd')
  229. a(/\u13fd/iu,0x13f5,'\u13f5')
  230. // NOTE: Cherokee does not case-fold without /u
  231. b(/\u13a0/i,0xab70,'\uab70')
  232. b(/\uab70/i,0x13a0,'\u13a0')
  233. b(/\u13a1/i,0xab71,'\uab71')
  234. b(/\uab71/i,0x13a1,'\u13a1')
  235. // ...
  236. b(/\u13ee/i,0xabbe,'\uabbe')
  237. b(/\uabbe/i,0x13ee,'\u13ee')
  238. b(/\u13ef/i,0xabbf,'\uabbf')
  239. b(/\uabbf/i,0x13ef,'\u13ef')
  240. b(/\u13f0/i,0x13f8,'\u13f8')
  241. b(/\u13f8/i,0x13f0,'\u13f0')
  242. b(/\u13f1/i,0x13f9,'\u13f9')
  243. b(/\u13f9/i,0x13f1,'\u13f1')
  244. b(/\u13f2/i,0x13fa,'\u13fa')
  245. b(/\u13fa/i,0x13f2,'\u13f2')
  246. b(/\u13f3/i,0x13fb,'\u13fb')
  247. b(/\u13fb/i,0x13f3,'\u13f3')
  248. b(/\u13f4/i,0x13fc,'\u13fc')
  249. b(/\u13fc/i,0x13f4,'\u13f4')
  250. b(/\u13f5/i,0x13fd,'\u13fd')
  251. b(/\u13fd/i,0x13f5,'\u13f5')
  252. // Latin extensions added in Unicode 7.0
  253. a(/\ua796/iu,0xa797,'\ua797')
  254. a(/\ua797/iu,0xa796,'\ua796')
  255. a(/\ua798/iu,0xa799,'\ua799')
  256. a(/\ua799/iu,0xa798,'\ua798')
  257. a(/\ua79a/iu,0xa79b,'\ua79b')
  258. a(/\ua79b/iu,0xa79a,'\ua79a')
  259. a(/\ua79c/iu,0xa79d,'\ua79d')
  260. a(/\ua79d/iu,0xa79c,'\ua79c')
  261. a(/\ua79e/iu,0xa79f,'\ua79f')
  262. a(/\ua79f/iu,0xa79e,'\ua79e')
  263. a(/\ua796/i,0xa797,'\ua797')
  264. a(/\ua797/i,0xa796,'\ua796')
  265. a(/\ua798/i,0xa799,'\ua799')
  266. a(/\ua799/i,0xa798,'\ua798')
  267. a(/\ua79a/i,0xa79b,'\ua79b')
  268. a(/\ua79b/i,0xa79a,'\ua79a')
  269. a(/\ua79c/i,0xa79d,'\ua79d')
  270. a(/\ua79d/i,0xa79c,'\ua79c')
  271. a(/\ua79e/i,0xa79f,'\ua79f')
  272. a(/\ua79f/i,0xa79e,'\ua79e')
  273. console.log("PASS")