/raw/src/scratch/regexengine/RegexEngineTest.as

https://github.com/yellcorp/Yellib · ActionScript · 259 lines · 220 code · 36 blank · 3 comment · 23 complexity · fc9c6414463a1b30dd323a2a022d9503 MD5 · raw file

  1. package scratch.regexengine
  2. {
  3. import org.yellcorp.lib.core.MapUtil;
  4. import org.yellcorp.lib.core.StringUtil;
  5. import org.yellcorp.lib.debug.DumpUtil;
  6. import scratch.regexengine.charrender.ASCIIEscaper;
  7. import scratch.regexengine.charrender.CharRenderer;
  8. import scratch.regexengine.charrender.LiteralRenderer;
  9. import scratch.regexengine.regextest.CharClass;
  10. import scratch.regexengine.regextest.Literal;
  11. import scratch.regexengine.regextest.RegexTest;
  12. import scratch.regexengine.regextest.WideClass;
  13. import flash.display.Sprite;
  14. public class RegexEngineTest extends Sprite
  15. {
  16. private var charResults:Object;
  17. private var rangeResults:Object;
  18. public function RegexEngineTest()
  19. {
  20. charResults = { };
  21. rangeResults = { };
  22. // non-printing unicode codepoints
  23. var ranges:Array = [
  24. [ 0x0061, 0x007a ], // lowercase a-z included for sanity
  25. [ 0x0000, 0x001f ],
  26. [ 0x007f, 0x009f ],
  27. [ 0x00ad ],
  28. [ 0x0600, 0x0603 ],
  29. [ 0x06dd ],
  30. [ 0x070f ],
  31. [ 0x17b4, 0x17b5 ],
  32. [ 0x200b, 0x200f ],
  33. [ 0x202a, 0x202e ],
  34. [ 0x2060, 0x2064 ],
  35. [ 0x206a, 0x206f ],
  36. [ 0xfeff ],
  37. [ 0xfff9, 0xfffb ],
  38. [ 0x2028, 0x2029 ],
  39. // [ 0xd800, 0xdfff ],
  40. [ 0xe000, 0xf8ff ],
  41. ];
  42. for each (var range:Array in ranges)
  43. {
  44. if (range.length == 1)
  45. {
  46. testRegexChar(range[0]);
  47. }
  48. else
  49. {
  50. testRegexRange(range[0], range[1]);
  51. }
  52. }
  53. trace("test complete");
  54. trace(DumpUtil.dumpObject(rangeResults));
  55. // printRangeResults();
  56. printCharResults();
  57. trace("dump complete");
  58. }
  59. private function printCharResults():void
  60. {
  61. var codepoints:Array = MapUtil.getKeys(charResults);
  62. codepoints.sort();
  63. for each (var cp:String in codepoints)
  64. {
  65. printCharResult(cp, charResults[cp]);
  66. }
  67. }
  68. private function printCharResult(codepoint:String, results:Object):void
  69. {
  70. var result:String;
  71. var print:Boolean = false;
  72. var testNames:Array;
  73. var testName:String;
  74. var columns:Array = [ codepoint ];
  75. for each (result in results)
  76. {
  77. if (result == "fail")
  78. {
  79. print = true;
  80. break;
  81. }
  82. }
  83. if (print)
  84. {
  85. testNames = MapUtil.getKeys(results);
  86. testNames.sort();
  87. for each (testName in testNames)
  88. {
  89. columns.push(testName + ":" + results[testName]);
  90. }
  91. trace(columns.join(","));
  92. }
  93. }
  94. private function testRegexRange(first:uint, last:uint):void
  95. {
  96. for (var i:uint = first; i <= last; i++)
  97. {
  98. testRegexChar(i);
  99. }
  100. testRegexRangeWith(first, last, new LiteralRenderer());
  101. testRegexRangeWith(first, last, new ASCIIEscaper());
  102. }
  103. private function testRegexRangeWith(first:uint, last:uint, renderer:CharRenderer):void
  104. {
  105. var re:RegExp;
  106. var testString:String;
  107. var cp:uint;
  108. if (renderer.isCodepointSupported(first) &&
  109. renderer.isCodepointSupported(last))
  110. {
  111. re = new RegExp(
  112. "[" +
  113. renderer.getRegexToken(first) +
  114. "-" +
  115. renderer.getRegexToken(last) +
  116. "]");
  117. for (cp = first; cp <= last; cp++)
  118. {
  119. testString = String.fromCharCode(cp);
  120. if (!re.test(testString))
  121. {
  122. recordRangeResult(first, last, cp, renderer, "fail");
  123. break;
  124. }
  125. }
  126. }
  127. }
  128. public function testRegexChar(codepoint:uint):void
  129. {
  130. var testers:Array = [
  131. new CharClass(),
  132. new Literal(),
  133. new WideClass()
  134. ];
  135. var renderers:Array = [
  136. new LiteralRenderer(),
  137. new ASCIIEscaper()
  138. ];
  139. var cRenderer:CharRenderer;
  140. var cTester:RegexTest;
  141. var testRegex:RegExp;
  142. var testString:String;
  143. var resultString:String;
  144. var expectedString:String = "ABC_DEF_GHI";
  145. for each (cRenderer in renderers)
  146. {
  147. if (cRenderer.isCodepointSupported(codepoint))
  148. {
  149. for each (cTester in testers)
  150. {
  151. if (cTester.isCodepointSupported(codepoint))
  152. {
  153. testString = "ABC" +
  154. String.fromCharCode(codepoint) +
  155. "DEF" +
  156. String.fromCharCode(codepoint) +
  157. "GHI";
  158. testRegex = cTester.getRegex(codepoint, cRenderer);
  159. resultString = testString.replace(testRegex, "_");
  160. if (resultString == expectedString)
  161. {
  162. recordCharResult(codepoint, cTester, cRenderer, "pass");
  163. }
  164. else
  165. {
  166. trace("Fail: " + testRegex.source + " " + resultString);
  167. recordCharResult(codepoint, cTester, cRenderer, "fail");
  168. }
  169. }
  170. else
  171. {
  172. recordCharResult(codepoint, cTester, cRenderer, "test:na");
  173. }
  174. }
  175. }
  176. else
  177. {
  178. recordCharResult(codepoint, null, cRenderer, "char:na");
  179. }
  180. }
  181. }
  182. private function recordCharResult(codepoint:uint, tester:RegexTest, renderer:CharRenderer, result:String):void
  183. {
  184. var cpName:String = formatCodepoint(codepoint);
  185. var cpResults:Object = charResults[cpName];
  186. var testName:String;
  187. if (tester)
  188. {
  189. testName = tester.name + "/" + renderer.name;
  190. }
  191. else
  192. {
  193. testName = "/" + renderer.name;
  194. }
  195. if (!cpResults)
  196. {
  197. cpResults = charResults[cpName] = { };
  198. }
  199. cpResults[testName] = result;
  200. }
  201. private function recordRangeResult(first:uint, last:uint, cp:uint, renderer:CharRenderer, result:String):void
  202. {
  203. var rangeName:String = formatCodepoint(first) + "-" + formatCodepoint(last);
  204. var cpName:String = formatCodepoint(cp);
  205. var thisRangeResults:Object = rangeResults[rangeName];
  206. var rendererResults:Object;
  207. if (!thisRangeResults)
  208. {
  209. thisRangeResults = rangeResults[rangeName] = { };
  210. }
  211. rendererResults = thisRangeResults[renderer.name];
  212. if (!rendererResults)
  213. {
  214. rendererResults = thisRangeResults[renderer.name] = { };
  215. }
  216. rendererResults[cpName] = result;
  217. }
  218. private static function formatCodepoint(c:uint):String
  219. {
  220. return "U+" + StringUtil.padLeft(c.toString(16), 4, "0");
  221. }
  222. }
  223. }