test/script/basic/runsunspider.js

Thu, 10 Jan 2013 10:28:57 +0100

author
lagergren
date
Thu, 10 Jan 2013 10:28:57 +0100
changeset 20
9f59ba5090f2
parent 19
4cd65798ec70
child 139
390d44ba90cf
permissions
-rw-r--r--

8005971: runsunspider.js should check results of benchmarks
Reviewed-by: attila, hannesw

jlaskey@3 1 /*
jlaskey@7 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
jlaskey@3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jlaskey@3 4 *
jlaskey@3 5 * This code is free software; you can redistribute it and/or modify it
jlaskey@3 6 * under the terms of the GNU General Public License version 2 only, as
jlaskey@3 7 * published by the Free Software Foundation.
jlaskey@3 8 *
jlaskey@3 9 * This code is distributed in the hope that it will be useful, but WITHOUT
jlaskey@3 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jlaskey@3 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jlaskey@3 12 * version 2 for more details (a copy is included in the LICENSE file that
jlaskey@3 13 * accompanied this code).
jlaskey@3 14 *
jlaskey@3 15 * You should have received a copy of the GNU General Public License version
jlaskey@3 16 * 2 along with this work; if not, write to the Free Software Foundation,
jlaskey@3 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jlaskey@3 18 *
jlaskey@3 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jlaskey@3 20 * or visit www.oracle.com if you need additional information or have any
jlaskey@3 21 * questions.
jlaskey@3 22 */
jlaskey@3 23
jlaskey@3 24 /**
jlaskey@3 25 * runsunspider : runs the sunspider tests and checks for compliance
jlaskey@3 26 *
jlaskey@3 27 * @test
jlaskey@3 28 * @option -timezone=PST
jlaskey@3 29 * @runif external.sunspider
jlaskey@3 30 */
jlaskey@3 31
jlaskey@3 32 /*
jlaskey@3 33 * Copyright (c) 2010-2011, Oracle and/or its affiliates. All rights reserved.
jlaskey@3 34 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jlaskey@3 35 *
jlaskey@3 36 * This code is free software; you can redistribute it and/or modify it
jlaskey@3 37 * under the terms of the GNU General Public License version 2 only, as
jlaskey@3 38 * published by the Free Software Foundation. Oracle designates this
jlaskey@3 39 * particular file as subject to the "Classpath" exception as provided
jlaskey@3 40 * by Oracle in the LICENSE file that accompanied this code.
jlaskey@3 41 *
jlaskey@3 42 * This code is distributed in the hope that it will be useful, but WITHOUT
jlaskey@3 43 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jlaskey@3 44 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jlaskey@3 45 * version 2 for more details (a copy is included in the LICENSE file that
jlaskey@3 46 * accompanied this code).
jlaskey@3 47 *
jlaskey@3 48 * You should have received a copy of the GNU General Public License version
jlaskey@3 49 * 2 along with this work; if not, write to the Free Software Foundation,
jlaskey@3 50 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jlaskey@3 51 *
jlaskey@3 52 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jlaskey@3 53 * or visit www.oracle.com if you need additional information or have any
jlaskey@3 54 * questions.
jlaskey@3 55 */
jlaskey@3 56
jlaskey@3 57 /**
jlaskey@3 58 * This is not a test, but a test "framework" for running sunspider tests.
jlaskey@3 59 *
jlaskey@3 60 */
jlaskey@3 61
jlaskey@3 62 function assertEq(a, b) {
jlaskey@3 63 if (a !== b) {
jlaskey@3 64 throw "ASSERTION FAILED: " + a + " should be " + b;
jlaskey@3 65 }
jlaskey@3 66 }
jlaskey@3 67
jlaskey@3 68 var runs = 0;
jlaskey@3 69 var iterations__ = 1;
jlaskey@3 70 var total_time = 0;
jlaskey@3 71
jlaskey@3 72 function runbench(name) {
jlaskey@3 73 var filename = name.split("/").pop();
jlaskey@3 74 if (verbose_run) {
jlaskey@3 75 print("Running " + filename);
jlaskey@3 76 }
jlaskey@3 77
jlaskey@3 78 var start = new Date;
jlaskey@3 79 for (var i = 0; i < iterations__; i++) {
jlaskey@3 80 load(name);
jlaskey@3 81 }
jlaskey@3 82 var stop = new Date - start;
jlaskey@3 83 total_time += stop;
jlaskey@3 84
jlaskey@3 85 if (verbose_run) {
jlaskey@3 86 print(filename + " done in " + stop + " ms");
jlaskey@3 87 }
jlaskey@3 88 runs++;
jlaskey@3 89 }
lagergren@20 90
lagergren@20 91 var m_w = 4711;
lagergren@20 92 var m_z = 17;
lagergren@20 93 var MAXINT = 0x7fffffff;
lagergren@20 94
lagergren@20 95 //produce deterministic random numbers for test suite
lagergren@20 96 function pseudorandom() {
lagergren@20 97 m_z = 36969 * (m_z & 65535) + (m_z >> 16);
lagergren@20 98 m_w = 18000 * (m_w & 65535) + (m_w >> 16);
lagergren@20 99 return (Math.abs((m_z << 16) + m_w) & MAXINT) / MAXINT;
lagergren@20 100 }
lagergren@20 101
lagergren@20 102 function runsuite(tests) {
lagergren@20 103 var changed = false;
jlaskey@3 104
lagergren@20 105 var oldRandom = Math.random;
lagergren@20 106 Math.random = pseudorandom;
lagergren@20 107
jlaskey@3 108 try {
lagergren@20 109 for (var n = 0; n < tests.length; n++) {
lagergren@20 110 runbench(tests[n].name);
lagergren@20 111 if (typeof tests[n].actual !== 'undefined') {
lagergren@20 112 assertEq(tests[n].actual(), tests[n].expected());
jlaskey@3 113 }
jlaskey@3 114 changed = true;
jlaskey@3 115 }
jlaskey@3 116 } catch (e) {
jlaskey@3 117 print("error: " + e);
lagergren@20 118 if (e.toString().indexOf(tests) == 1) {
jlaskey@3 119 throw e;
jlaskey@3 120 }
jlaskey@3 121 // no scripting or something, silently fail
lagergren@20 122 } finally {
lagergren@20 123 Math.random = oldRandom;
jlaskey@3 124 }
lagergren@20 125
jlaskey@3 126 return changed;
jlaskey@3 127 }
jlaskey@3 128
lagergren@20 129 function hash(str) {
lagergren@20 130 var s = "" + str;
lagergren@20 131 var h = 0;
lagergren@20 132 var off = 0;
lagergren@20 133 for (var i = 0; i < s.length; i++) {
lagergren@20 134 h = 31 * h + s.charCodeAt(off++);
lagergren@20 135 h &= 0x7fffffff;
lagergren@20 136 }
lagergren@20 137 return h ^ s.length;
lagergren@20 138 }
jlaskey@3 139
jlaskey@3 140 var tests = [
lagergren@20 141 { name: 'string-base64.js',
lagergren@20 142 actual: function() {
lagergren@20 143 return hash(str);
lagergren@20 144 },
lagergren@20 145 expected: function() {
lagergren@20 146 return 1544571068;
lagergren@20 147 }
lagergren@20 148 },
lagergren@20 149 { name: 'string-validate-input.js',
lagergren@20 150 actual: function() {
lagergren@20 151 return hash(endResult);
lagergren@20 152 },
lagergren@20 153 expected: function() {
lagergren@20 154 return 2016572373;
lagergren@20 155 }
lagergren@20 156 },
lagergren@20 157 { name: 'date-format-xparb.js',
lagergren@20 158 actual: function() {
lagergren@20 159 return shortFormat + longFormat;
lagergren@20 160 },
lagergren@20 161 expected: function() {
lagergren@20 162 return "2017-09-05Tuesday, September 05, 2017 8:43:48 AM";
lagergren@20 163 }
lagergren@20 164 },
lagergren@20 165 { name: '3d-morph.js',
lagergren@20 166 actual: function() {
lagergren@20 167 var acceptableDelta = 4e-15;
lagergren@20 168 return (testOutput - 6.394884621840902e-14) < acceptableDelta;
lagergren@20 169 },
lagergren@20 170 expected: function() {
lagergren@20 171 return true;
lagergren@20 172 }
lagergren@20 173 },
lagergren@20 174 { name: 'crypto-aes.js',
lagergren@20 175 actual: function() {
lagergren@20 176 return plainText;
lagergren@20 177 },
lagergren@20 178 expected: function() {
lagergren@20 179 return decryptedText;
lagergren@20 180 }
lagergren@20 181 },
lagergren@20 182 { name: 'crypto-md5.js',
lagergren@20 183 actual: function() {
lagergren@20 184 return md5Output;
lagergren@20 185 },
lagergren@20 186 expected: function() {
lagergren@20 187 return "a831e91e0f70eddcb70dc61c6f82f6cd";
lagergren@20 188 }
lagergren@20 189 },
lagergren@20 190 { name: 'crypto-sha1.js',
lagergren@20 191 actual: function() {
lagergren@20 192 return sha1Output;
lagergren@20 193 },
lagergren@20 194 expected: function() {
lagergren@20 195 return "2524d264def74cce2498bf112bedf00e6c0b796d";
lagergren@20 196 }
lagergren@20 197 },
lagergren@20 198 { name: 'bitops-bitwise-and.js',
lagergren@20 199 actual: function() {
lagergren@20 200 return result;
lagergren@20 201 },
lagergren@20 202 expected: function() {
lagergren@20 203 return 0;
lagergren@20 204 }
lagergren@20 205 },
lagergren@20 206 { name: 'bitops-bits-in-byte.js',
lagergren@20 207 actual: function() {
lagergren@20 208 return result;
lagergren@20 209 },
lagergren@20 210 expected: function() {
lagergren@20 211 return 358400;
lagergren@20 212 }
lagergren@20 213 },
lagergren@20 214 { name: 'bitops-nsieve-bits.js',
lagergren@20 215 actual: function() {
lagergren@20 216 var ret = 0;
lagergren@20 217 for (var i = 0; i < result.length; ++i) {
lagergren@20 218 ret += result[i];
lagergren@20 219 }
lagergren@20 220 ret += result.length;
lagergren@20 221 return ret;
lagergren@20 222 },
lagergren@20 223 expected: function() {
lagergren@20 224 return -1286749539853;
lagergren@20 225 }
lagergren@20 226 },
lagergren@20 227 { name: 'bitops-3bit-bits-in-byte.js',
lagergren@20 228 actual: function() {
lagergren@20 229 return sum;
lagergren@20 230 },
lagergren@20 231 expected: function() {
lagergren@20 232 return 512000;
lagergren@20 233 }
lagergren@20 234 },
lagergren@20 235 { name: 'access-nbody.js',
lagergren@20 236 actual: function() {
lagergren@20 237 return ret;
lagergren@20 238 },
lagergren@20 239 expected: function() {
lagergren@20 240 return -0.16906933525822856;
lagergren@20 241 }
lagergren@20 242 },
lagergren@20 243 { name: 'access-binary-trees.js',
lagergren@20 244 actual: function() {
lagergren@20 245 return ret;
lagergren@20 246 },
lagergren@20 247 expected: function() {
lagergren@20 248 return -1;
lagergren@20 249 }
lagergren@20 250 },
lagergren@20 251 { name: 'access-fannkuch.js',
lagergren@20 252 actual: function() {
lagergren@20 253 return ret;
lagergren@20 254 },
lagergren@20 255 expected: function() {
lagergren@20 256 return 22;
lagergren@20 257 }
lagergren@20 258 },
lagergren@20 259 { name: 'math-spectral-norm.js',
lagergren@20 260 actual: function() {
lagergren@20 261 var ret = '';
lagergren@20 262 for (var i = 6; i <= 48; i *= 2) {
lagergren@20 263 ret += spectralnorm(i) + ',';
lagergren@20 264 }
lagergren@20 265 return ret;
lagergren@20 266 },
lagergren@20 267 expected: function() {
lagergren@20 268 return "1.2657786149754053,1.2727355112619148,1.273989979775574,1.274190125290389,";
lagergren@20 269 }
lagergren@20 270 },
lagergren@20 271 { name: '3d-raytrace.js',
lagergren@20 272 actual: function() {
lagergren@20 273 return hash(testOutput);
lagergren@20 274 },
lagergren@20 275 expected: function() {
lagergren@20 276 return 230692593;
lagergren@20 277 }
lagergren@20 278 },
lagergren@20 279 { name: 'regexp-dna.js',
lagergren@20 280 actual: function() {
lagergren@20 281 return dnaOutputString;
lagergren@20 282 },
lagergren@20 283 expected: function() {
lagergren@20 284 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 285 }
lagergren@20 286 },
lagergren@20 287 { name: 'math-cordic.js',
lagergren@20 288 actual: function() {
lagergren@20 289 return total;
lagergren@20 290 },
lagergren@20 291 expected: function() {
lagergren@20 292 return 10362.570468755888;
lagergren@20 293 }
lagergren@20 294 },
lagergren@20 295 { name: 'controlflow-recursive.js',
lagergren@20 296 actual: function() {
lagergren@20 297 var ret = 0;
lagergren@20 298 for (var i = 3; i <= 5; i++) {
lagergren@20 299 ret += ack(3,i);
lagergren@20 300 ret += fib(17.0+i);
lagergren@20 301 ret += tak(3*i+3,2*i+2,i+1);
lagergren@20 302 }
lagergren@20 303 return ret;
lagergren@20 304 },
lagergren@20 305 expected: function() {
lagergren@20 306 return 57775;
lagergren@20 307 }
lagergren@20 308 },
lagergren@20 309 { name: 'date-format-tofte.js',
lagergren@20 310 actual: function() {
lagergren@20 311 return shortFormat + longFormat;
lagergren@20 312 },
lagergren@20 313 expected: function() {
lagergren@20 314 return "2008-05-01Thursday, May 01, 2008 6:31:22 PM";
lagergren@20 315 }
lagergren@20 316 },
lagergren@20 317 { name: 'string-tagcloud.js',
lagergren@20 318 actual: function() {
lagergren@20 319 // The result string embeds floating-point numbers, which can vary a bit on different platforms,
lagergren@20 320 // so we truncate them a bit before comparing.
lagergren@20 321 var tagcloud_norm = tagcloud.replace(/([0-9.]+)px/g, function(str, p1) { return p1.substr(0, 10) + 'px' })
lagergren@20 322 return tagcloud_norm.length;
lagergren@20 323 },
lagergren@20 324 expected: function() {
lagergren@20 325 return 295906;
lagergren@20 326 }
lagergren@20 327 },
lagergren@20 328 { name: 'string-unpack-code.js',
lagergren@20 329 actual: function() {
lagergren@20 330 return decompressedMochiKit.length == 106415 &&
lagergren@20 331 decompressedMochiKit[2000] == '5' &&
lagergren@20 332 decompressedMochiKit[12000] == '_' &&
lagergren@20 333 decompressedMochiKit[82556] == '>';
lagergren@20 334 },
lagergren@20 335 expected: function() {
lagergren@20 336 return true;
lagergren@20 337 }
lagergren@20 338 },
lagergren@20 339 //TODO no easy way to sanity check result
lagergren@20 340 { name: 'string-fasta.js' },
lagergren@20 341 //TODO no easy way to sanity check result
lagergren@20 342 { name: 'math-partial-sums.js' },
lagergren@20 343 //TODO no easy way to sanity check result
lagergren@20 344 { name: 'access-nsieve.js' },
lagergren@20 345 //TODO no easy way to sanity check result
lagergren@20 346 { name: '3d-cube.js' },
lagergren@20 347 ];
jlaskey@3 348
jlaskey@3 349 // handle the case this script may be run by a JS engine that doesn't
jlaskey@3 350 // support __DIR__ global variable.
lagergren@20 351 var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__;
jlaskey@3 352
jlaskey@3 353 for (i in tests) {
lagergren@20 354 tests[i].name = dir + '../external/sunspider/tests/sunspider-1.0/' + tests[i].name;
jlaskey@3 355 }
jlaskey@3 356
jlaskey@3 357 var verbose_run = false;
jlaskey@3 358
lagergren@20 359 var args = [];
lagergren@20 360 if (typeof $ARGS !== 'undefined') {
lagergren@20 361 args = $ARGS;
lagergren@20 362 } else if (typeof arguments !== 'undefined' && arguments.length != 0) {
lagergren@20 363 args = arguments;
lagergren@20 364 }
jlaskey@3 365
jlaskey@3 366 for (i in args) {
lagergren@20 367 if (args[i] === '--verbose') {
lagergren@20 368 verbose_run = true;
lagergren@20 369 break;
jlaskey@3 370 }
jlaskey@3 371 }
jlaskey@3 372
lagergren@20 373 runsuite(tests);
jlaskey@3 374
jlaskey@3 375 if (verbose_run) {
lagergren@20 376 print('\n' + runs + "/" + tests.length + " tests were successfully run in " + total_time + " ms ");
jlaskey@3 377 }
jlaskey@3 378
jlaskey@3 379 print("Sunspider finished!");

mercurial