compare-table-gen.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2015 the V8 project authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. // Generates a comparison table test case.
  5. // Usage: d8 compare-table-gen.js -- lt|lteq|gt|gteq|eq|ne|eq|sne|min|max
  6. var strings = ["true", "false", "null", "void 0", "0", "0.0", "-0", "\"\"", "-1", "-1.25", "1", "1.25", "-2147483648", "2147483648", "Infinity", "-Infinity", "NaN"];
  7. var values = new Array(strings.length);
  8. for (var i = 0; i < strings.length; i++) {
  9. values[i] = eval(strings[i]);
  10. }
  11. function test() {
  12. for (var i = 0; i < values.length; i++) {
  13. for (var j = 0; j < values.length; j++) {
  14. var a = values[i];
  15. var b = values[j];
  16. var x = expected[i][j];
  17. assertEquals(x, func(a,b));
  18. assertEquals(x, left_funcs[i](b));
  19. assertEquals(x, right_funcs[j](a));
  20. }
  21. }
  22. var result = matrix();
  23. for (var i = 0; i < values.length; i++) {
  24. for (var j = 0; j < values.length; j++) {
  25. assertEquals(expected[i][j], result[i][j]);
  26. }
  27. }
  28. }
  29. function expr(infix, a, cmp, b) {
  30. return infix ? a + " " + cmp + " " + b : cmp + "(" + a + ", " + b + ")";
  31. }
  32. function SpecialToString(x) {
  33. if ((1 / x) == -Infinity) return "-0";
  34. return "" + x;
  35. }
  36. function gen(name, cmp, infix) {
  37. print("// Copyright 2015 the V8 project authors. All rights reserved.");
  38. print("// Use of this source code is governed by a BSD-style license that can be");
  39. print("// found in the LICENSE file.");
  40. print();
  41. print("var values = [" + strings + "];");
  42. var body = "(function " + name + "(a,b) { return " + expr(infix, "a", cmp, "b") + "; })";
  43. var func = eval(body);
  44. print("var expected = [");
  45. for (var i = 0; i < values.length; i++) {
  46. var line = " [";
  47. for (var j = 0; j < values.length; j++) {
  48. if (j > 0) line += ",";
  49. line += SpecialToString(func(values[i], values[j]));
  50. }
  51. line += "]";
  52. if (i < (values.length - 1)) line += ",";
  53. print(line);
  54. }
  55. print("];");
  56. print("var func = " + body + ";");
  57. print("var left_funcs = [");
  58. for (var i = 0; i < values.length; i++) {
  59. var value = strings[i];
  60. var body = "(function " + name + "_L" + i + "(b) { return " + expr(infix, value, cmp, "b") + "; })";
  61. var end = i < (values.length - 1) ? "," : "";
  62. print(" " + body + end);
  63. }
  64. print("];");
  65. print("var right_funcs = [");
  66. for (var i = 0; i < values.length; i++) {
  67. var value = strings[i];
  68. var body = "(function " + name + "_R" + i + "(a) { return " + expr(infix, "a", cmp, value) + "; })";
  69. var end = i < (values.length - 1) ? "," : "";
  70. print(" " + body + end);
  71. }
  72. print("];");
  73. print("function matrix() {");
  74. print(" return [");
  75. for (var i = 0; i < values.length; i++) {
  76. var line = " [";
  77. for (var j = 0; j < values.length; j++) {
  78. if (j > 0) line += ",";
  79. line += expr(infix, strings[i], cmp, strings[j]);
  80. }
  81. line += "]";
  82. if (i < (values.length - 1)) line += ",";
  83. print(line);
  84. }
  85. print(" ];");
  86. print("}");
  87. print(test.toString());
  88. print("test();");
  89. print("test();");
  90. }
  91. switch (arguments[0]) {
  92. case "lt": gen("lt", "<", true); break;
  93. case "lteq": gen("lteq", "<=", true); break;
  94. case "gt": gen("gt", ">", true); break;
  95. case "gteq": gen("gteq", ">=", true); break;
  96. case "eq": gen("eq", "==", true); break;
  97. case "ne": gen("ne", "!=", true); break;
  98. case "seq": gen("seq", "===", true); break;
  99. case "sne": gen("sne", "!==", true); break;
  100. case "min": gen("min", "Math.min", false); break;
  101. case "max": gen("max", "Math.max", false); break;
  102. }