jlaskey@3: /* jlaskey@7: * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. jlaskey@3: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jlaskey@3: * jlaskey@3: * This code is free software; you can redistribute it and/or modify it jlaskey@3: * under the terms of the GNU General Public License version 2 only, as jlaskey@3: * published by the Free Software Foundation. jlaskey@3: * jlaskey@3: * This code is distributed in the hope that it will be useful, but WITHOUT jlaskey@3: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jlaskey@3: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jlaskey@3: * version 2 for more details (a copy is included in the LICENSE file that jlaskey@3: * accompanied this code). jlaskey@3: * jlaskey@3: * You should have received a copy of the GNU General Public License version jlaskey@3: * 2 along with this work; if not, write to the Free Software Foundation, jlaskey@3: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jlaskey@3: * jlaskey@3: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jlaskey@3: * or visit www.oracle.com if you need additional information or have any jlaskey@3: * questions. jlaskey@3: */ jlaskey@3: jlaskey@3: /** jlaskey@3: * runsunspider : runs the sunspider tests and checks for compliance jlaskey@3: * lagergren@139: * @subtest jlaskey@3: */ jlaskey@3: jlaskey@3: /** jlaskey@3: * This is not a test, but a test "framework" for running sunspider tests. jlaskey@3: */ jlaskey@3: jlaskey@3: function assertEq(a, b) { jlaskey@3: if (a !== b) { jlaskey@3: throw "ASSERTION FAILED: " + a + " should be " + b; jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: var runs = 0; jlaskey@3: var iterations__ = 1; jlaskey@3: var total_time = 0; jlaskey@3: jlaskey@3: function runbench(name) { jlaskey@3: var filename = name.split("/").pop(); jlaskey@3: if (verbose_run) { jlaskey@3: print("Running " + filename); jlaskey@3: } jlaskey@3: jlaskey@3: var start = new Date; jlaskey@3: for (var i = 0; i < iterations__; i++) { jlaskey@3: load(name); jlaskey@3: } jlaskey@3: var stop = new Date - start; jlaskey@3: total_time += stop; jlaskey@3: jlaskey@3: if (verbose_run) { jlaskey@3: print(filename + " done in " + stop + " ms"); jlaskey@3: } jlaskey@3: runs++; jlaskey@3: } lagergren@20: lagergren@20: var m_w = 4711; lagergren@20: var m_z = 17; lagergren@20: var MAXINT = 0x7fffffff; lagergren@20: lagergren@20: //produce deterministic random numbers for test suite lagergren@20: function pseudorandom() { lagergren@20: m_z = 36969 * (m_z & 65535) + (m_z >> 16); lagergren@20: m_w = 18000 * (m_w & 65535) + (m_w >> 16); lagergren@20: return (Math.abs((m_z << 16) + m_w) & MAXINT) / MAXINT; lagergren@20: } lagergren@20: lagergren@20: function runsuite(tests) { lagergren@20: var changed = false; jlaskey@3: lagergren@20: var oldRandom = Math.random; lagergren@20: Math.random = pseudorandom; lagergren@20: jlaskey@3: try { lagergren@20: for (var n = 0; n < tests.length; n++) { lagergren@20: runbench(tests[n].name); lagergren@20: if (typeof tests[n].actual !== 'undefined') { lagergren@20: assertEq(tests[n].actual(), tests[n].expected()); jlaskey@3: } jlaskey@3: changed = true; jlaskey@3: } jlaskey@3: } catch (e) { lagergren@247: print("error: " + e.printStackTrace()); lagergren@20: if (e.toString().indexOf(tests) == 1) { jlaskey@3: throw e; jlaskey@3: } jlaskey@3: // no scripting or something, silently fail lagergren@20: } finally { lagergren@20: Math.random = oldRandom; jlaskey@3: } lagergren@20: jlaskey@3: return changed; jlaskey@3: } jlaskey@3: lagergren@20: function hash(str) { lagergren@20: var s = "" + str; lagergren@20: var h = 0; lagergren@20: var off = 0; lagergren@20: for (var i = 0; i < s.length; i++) { lagergren@20: h = 31 * h + s.charCodeAt(off++); lagergren@20: h &= 0x7fffffff; lagergren@20: } lagergren@20: return h ^ s.length; lagergren@20: } jlaskey@3: jlaskey@3: var tests = [ lagergren@20: { name: 'string-base64.js', lagergren@20: actual: function() { lagergren@20: return hash(str); lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 1544571068; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'string-validate-input.js', lagergren@20: actual: function() { lagergren@20: return hash(endResult); lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 2016572373; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'date-format-xparb.js', lagergren@20: actual: function() { lagergren@20: return shortFormat + longFormat; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM"; lagergren@20: } lagergren@20: }, lagergren@20: { name: '3d-morph.js', lagergren@20: actual: function() { lagergren@20: var acceptableDelta = 4e-15; lagergren@20: return (testOutput - 6.394884621840902e-14) < acceptableDelta; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return true; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'crypto-aes.js', lagergren@20: actual: function() { lagergren@20: return plainText; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return decryptedText; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'crypto-md5.js', lagergren@20: actual: function() { lagergren@20: return md5Output; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "a831e91e0f70eddcb70dc61c6f82f6cd"; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'crypto-sha1.js', lagergren@20: actual: function() { lagergren@20: return sha1Output; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "2524d264def74cce2498bf112bedf00e6c0b796d"; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'bitops-bitwise-and.js', lagergren@20: actual: function() { lagergren@20: return result; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 0; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'bitops-bits-in-byte.js', lagergren@20: actual: function() { lagergren@20: return result; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 358400; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'bitops-nsieve-bits.js', lagergren@20: actual: function() { lagergren@20: var ret = 0; lagergren@20: for (var i = 0; i < result.length; ++i) { lagergren@20: ret += result[i]; lagergren@20: } lagergren@20: ret += result.length; lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return -1286749539853; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'bitops-3bit-bits-in-byte.js', lagergren@20: actual: function() { lagergren@20: return sum; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 512000; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'access-nbody.js', lagergren@20: actual: function() { lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return -0.16906933525822856; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'access-binary-trees.js', lagergren@20: actual: function() { lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return -1; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'access-fannkuch.js', lagergren@20: actual: function() { lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 22; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'math-spectral-norm.js', lagergren@20: actual: function() { lagergren@20: var ret = ''; lagergren@20: for (var i = 6; i <= 48; i *= 2) { lagergren@20: ret += spectralnorm(i) + ','; lagergren@20: } lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "1.2657786149754053,1.2727355112619148,1.273989979775574,1.274190125290389,"; lagergren@20: } lagergren@20: }, lagergren@20: { name: '3d-raytrace.js', lagergren@20: actual: function() { lagergren@20: return hash(testOutput); lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 230692593; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'regexp-dna.js', lagergren@20: actual: function() { lagergren@20: return dnaOutputString; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "undefinedagggtaaa|tttaccct 0\n[cgt]gggtaaa|tttaccc[acg] 9\na[act]ggtaaa|tttacc[agt]t 27\nag[act]gtaaa|tttac[agt]ct 24\nagg[act]taaa|ttta[agt]cct 30\naggg[acg]aaa|ttt[cgt]ccct 9\nagggt[cgt]aa|tt[acg]accct 12\nagggta[cgt]a|t[acg]taccct 9\nagggtaa[cgt]|[acg]ttaccct 15\n"; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'math-cordic.js', lagergren@20: actual: function() { lagergren@20: return total; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 10362.570468755888; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'controlflow-recursive.js', lagergren@20: actual: function() { lagergren@20: var ret = 0; lagergren@20: for (var i = 3; i <= 5; i++) { lagergren@20: ret += ack(3,i); lagergren@20: ret += fib(17.0+i); lagergren@20: ret += tak(3*i+3,2*i+2,i+1); lagergren@20: } lagergren@20: return ret; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 57775; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'date-format-tofte.js', lagergren@20: actual: function() { lagergren@20: return shortFormat + longFormat; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return "2008-05-01Thursday, May 01, 2008 6:31:22 PM"; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'string-tagcloud.js', lagergren@20: actual: function() { lagergren@20: // The result string embeds floating-point numbers, which can vary a bit on different platforms, lagergren@20: // so we truncate them a bit before comparing. lagergren@20: var tagcloud_norm = tagcloud.replace(/([0-9.]+)px/g, function(str, p1) { return p1.substr(0, 10) + 'px' }) lagergren@20: return tagcloud_norm.length; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return 295906; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'string-unpack-code.js', lagergren@20: actual: function() { lagergren@20: return decompressedMochiKit.length == 106415 && lagergren@20: decompressedMochiKit[2000] == '5' && lagergren@20: decompressedMochiKit[12000] == '_' && lagergren@20: decompressedMochiKit[82556] == '>'; lagergren@20: }, lagergren@20: expected: function() { lagergren@20: return true; lagergren@20: } lagergren@20: }, lagergren@20: //TODO no easy way to sanity check result lagergren@20: { name: 'string-fasta.js' }, lagergren@20: //TODO no easy way to sanity check result lagergren@20: { name: 'math-partial-sums.js' }, lagergren@20: //TODO no easy way to sanity check result lagergren@20: { name: 'access-nsieve.js' }, lagergren@20: //TODO no easy way to sanity check result lagergren@20: { name: '3d-cube.js' }, lagergren@20: ]; jlaskey@3: jlaskey@3: // handle the case this script may be run by a JS engine that doesn't jlaskey@3: // support __DIR__ global variable. lagergren@20: var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__; jlaskey@3: jlaskey@3: for (i in tests) { lagergren@20: tests[i].name = dir + '../external/sunspider/tests/sunspider-1.0/' + tests[i].name; jlaskey@3: } jlaskey@3: jlaskey@3: var verbose_run = false; jlaskey@3: lagergren@20: var args = []; lagergren@20: if (typeof $ARGS !== 'undefined') { lagergren@20: args = $ARGS; lagergren@20: } else if (typeof arguments !== 'undefined' && arguments.length != 0) { lagergren@20: args = arguments; lagergren@20: } jlaskey@3: jlaskey@3: for (i in args) { lagergren@20: if (args[i] === '--verbose') { lagergren@20: verbose_run = true; lagergren@20: break; jlaskey@3: } jlaskey@3: } jlaskey@3: lagergren@20: runsuite(tests); jlaskey@3: jlaskey@3: if (verbose_run) { lagergren@20: print('\n' + runs + "/" + tests.length + " tests were successfully run in " + total_time + " ms "); jlaskey@3: } jlaskey@3: jlaskey@3: print("Sunspider finished!");