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@475: * 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@475: * 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@475: * 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@475: * 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@475: 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@475: print("Running " + filename); jlaskey@3: } jlaskey@3: jlaskey@3: var start = new Date; jlaskey@3: for (var i = 0; i < iterations__; i++) { jlaskey@475: load(name); jlaskey@3: } jlaskey@3: var stop = new Date - start; jlaskey@3: total_time += stop; jlaskey@475: jlaskey@3: if (verbose_run) { jlaskey@475: print(filename + " done in " + stop + " ms"); jlaskey@475: } 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@475: lagergren@20: var oldRandom = Math.random; lagergren@20: Math.random = pseudorandom; jlaskey@475: jlaskey@3: try { jlaskey@475: for (var n = 0; n < tests.length; n++) { jlaskey@475: path = dir + '../external/sunspider/tests/sunspider-1.0/' + tests[n].name jlaskey@475: runbench(path); jlaskey@475: if (typeof tests[n].actual !== 'undefined') { jlaskey@475: assertEq(tests[n].actual(), tests[n].expected()); jlaskey@475: } jlaskey@475: changed = true; jlaskey@475: } jlaskey@475: // no scripting or something, silently fail lagergren@20: } finally { jlaskey@3: } jlaskey@475: Math.random = oldRandom; 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++) { jlaskey@475: h = 31 * h + s.charCodeAt(off++); jlaskey@475: h &= 0x7fffffff; lagergren@20: } lagergren@20: return h ^ s.length; lagergren@20: } jlaskey@3: jlaskey@3: var tests = [ lagergren@20: { name: 'string-base64.js', jlaskey@475: actual: function() { jlaskey@475: return hash(str); lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 1544571068; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'string-validate-input.js', jlaskey@475: actual: function() { jlaskey@475: return hash(endResult); lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 2016572373; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'date-format-xparb.js', jlaskey@475: actual: function() { jlaskey@475: return shortFormat + longFormat; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM"; lagergren@20: } jlaskey@475: }, lagergren@20: { name: '3d-morph.js', lagergren@20: actual: function() { jlaskey@475: var acceptableDelta = 4e-15; jlaskey@475: return (testOutput - 6.394884621840902e-14) < acceptableDelta; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return true; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'crypto-aes.js', lagergren@20: actual: function() { jlaskey@475: return plainText; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return decryptedText; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'crypto-md5.js', lagergren@20: actual: function() { jlaskey@475: return md5Output; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "a831e91e0f70eddcb70dc61c6f82f6cd"; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'crypto-sha1.js', lagergren@20: actual: function() { jlaskey@475: return sha1Output; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "2524d264def74cce2498bf112bedf00e6c0b796d"; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'bitops-bitwise-and.js', lagergren@20: actual: function() { jlaskey@475: return result; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 0; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'bitops-bits-in-byte.js', lagergren@20: actual: function() { jlaskey@475: return result; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 358400; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'bitops-nsieve-bits.js', lagergren@20: actual: function() { jlaskey@475: var ret = 0; jlaskey@475: for (var i = 0; i < result.length; ++i) { jlaskey@475: ret += result[i]; jlaskey@475: } jlaskey@475: ret += result.length; jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return -1286749539853; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'bitops-3bit-bits-in-byte.js', lagergren@20: actual: function() { jlaskey@475: return sum; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 512000; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'access-nbody.js', lagergren@20: actual: function() { jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return -1.3524862408537381; lagergren@20: } jlaskey@475: }, jlaskey@475: { name: 'access-binary-trees.js', lagergren@20: actual: function() { jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return -4; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'access-fannkuch.js', lagergren@20: actual: function() { jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 22; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'math-spectral-norm.js', jlaskey@475: actual: function() { jlaskey@475: var ret = ''; jlaskey@475: for (var i = 6; i <= 48; i *= 2) { jlaskey@475: ret += spectralnorm(i) + ','; jlaskey@475: } jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "1.2657786149754053,1.2727355112619148,1.273989979775574,1.274190125290389,"; lagergren@20: } jlaskey@475: }, lagergren@20: { name: '3d-raytrace.js', lagergren@20: actual: function() { jlaskey@475: return hash(testOutput); lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 230692593; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'regexp-dna.js', lagergren@20: actual: function() { jlaskey@475: return dnaOutputString; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return "agggtaaa|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: } jlaskey@475: }, lagergren@20: { name: 'math-cordic.js', lagergren@20: actual: function() { jlaskey@475: return total; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 10362.570468755888; lagergren@20: } lagergren@20: }, lagergren@20: { name: 'controlflow-recursive.js', lagergren@20: actual: function() { jlaskey@475: var ret = 0; jlaskey@475: for (var i = 3; i <= 5; i++) { jlaskey@475: ret += ack(3,i); jlaskey@475: ret += fib(17.0+i); jlaskey@475: ret += tak(3*i+3,2*i+2,i+1); jlaskey@475: } jlaskey@475: return ret; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 57775; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'date-format-tofte.js', lagergren@20: actual: function() { jlaskey@475: return shortFormat + longFormat; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: 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() { jlaskey@475: // The result string embeds floating-point numbers, which can vary a bit on different platforms, jlaskey@475: // so we truncate them a bit before comparing. jlaskey@475: var tagcloud_norm = tagcloud.replace(/([0-9.]+)px/g, function(str, p1) { return p1.substr(0, 10) + 'px' }) jlaskey@475: return tagcloud_norm.length; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return 295906; lagergren@20: } jlaskey@475: }, lagergren@20: { name: 'string-unpack-code.js', lagergren@20: actual: function() { jlaskey@475: return decompressedMochiKit.length == 106415 && jlaskey@475: decompressedMochiKit[2000] == '5' && jlaskey@475: decompressedMochiKit[12000] == '_' && jlaskey@475: decompressedMochiKit[82556] == '>'; lagergren@20: }, lagergren@20: expected: function() { jlaskey@475: return true; lagergren@20: } jlaskey@475: }, 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 jlaskey@475: { 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: 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; jlaskey@475: } jlaskey@3: jlaskey@3: for (i in args) { lagergren@20: if (args[i] === '--verbose') { jlaskey@475: verbose_run = true; jlaskey@475: 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!");