// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Generates a comparison table test case. // Usage: d8 compare-table-gen.js -- lt|lteq|gt|gteq|eq|ne|eq|sne|min|max var strings = ["true", "false", "null", "void 0", "0", "0.0", "-0", "\"\"", "-1", "-1.25", "1", "1.25", "-2147483648", "2147483648", "Infinity", "-Infinity", "NaN"]; var values = new Array(strings.length); for (var i = 0; i < strings.length; i++) { values[i] = eval(strings[i]); } function test() { for (var i = 0; i < values.length; i++) { for (var j = 0; j < values.length; j++) { var a = values[i]; var b = values[j]; var x = expected[i][j]; assertEquals(x, func(a,b)); assertEquals(x, left_funcs[i](b)); assertEquals(x, right_funcs[j](a)); } } var result = matrix(); for (var i = 0; i < values.length; i++) { for (var j = 0; j < values.length; j++) { assertEquals(expected[i][j], result[i][j]); } } } function expr(infix, a, cmp, b) { return infix ? a + " " + cmp + " " + b : cmp + "(" + a + ", " + b + ")"; } function SpecialToString(x) { if ((1 / x) == -Infinity) return "-0"; return "" + x; } function gen(name, cmp, infix) { print("// Copyright 2015 the V8 project authors. All rights reserved."); print("// Use of this source code is governed by a BSD-style license that can be"); print("// found in the LICENSE file."); print(); print("var values = [" + strings + "];"); var body = "(function " + name + "(a,b) { return " + expr(infix, "a", cmp, "b") + "; })"; var func = eval(body); print("var expected = ["); for (var i = 0; i < values.length; i++) { var line = " ["; for (var j = 0; j < values.length; j++) { if (j > 0) line += ","; line += SpecialToString(func(values[i], values[j])); } line += "]"; if (i < (values.length - 1)) line += ","; print(line); } print("];"); print("var func = " + body + ";"); print("var left_funcs = ["); for (var i = 0; i < values.length; i++) { var value = strings[i]; var body = "(function " + name + "_L" + i + "(b) { return " + expr(infix, value, cmp, "b") + "; })"; var end = i < (values.length - 1) ? "," : ""; print(" " + body + end); } print("];"); print("var right_funcs = ["); for (var i = 0; i < values.length; i++) { var value = strings[i]; var body = "(function " + name + "_R" + i + "(a) { return " + expr(infix, "a", cmp, value) + "; })"; var end = i < (values.length - 1) ? "," : ""; print(" " + body + end); } print("];"); print("function matrix() {"); print(" return ["); for (var i = 0; i < values.length; i++) { var line = " ["; for (var j = 0; j < values.length; j++) { if (j > 0) line += ","; line += expr(infix, strings[i], cmp, strings[j]); } line += "]"; if (i < (values.length - 1)) line += ","; print(line); } print(" ];"); print("}"); print(test.toString()); print("test();"); print("test();"); } switch (arguments[0]) { case "lt": gen("lt", "<", true); break; case "lteq": gen("lteq", "<=", true); break; case "gt": gen("gt", ">", true); break; case "gteq": gen("gteq", ">=", true); break; case "eq": gen("eq", "==", true); break; case "ne": gen("ne", "!=", true); break; case "seq": gen("seq", "===", true); break; case "sne": gen("sne", "!==", true); break; case "min": gen("min", "Math.min", false); break; case "max": gen("max", "Math.max", false); break; }