// Copyright 2017 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. // // TODO(eholk): Once we have stable test IDs, use those as the key instead. // See https://github.com/WebAssembly/spec/issues/415 // // Flags: --expose-wasm --allow-natives-syntax const known_failures = { // Enter failing tests like follows: // "'WebAssembly.Instance.prototype.exports' accessor property": // 'https://bugs.chromium.org/p/v8/issues/detail?id=5507', }; let failures = []; let unexpected_successes = []; let last_promise = new Promise((resolve, reject) => { resolve(); }); function test(func, description) { let maybeErr; try { func(); } catch(e) { maybeErr = e; } if (typeof maybeErr !== 'undefined') { var known = ""; if (known_failures[description]) { known = " (known)"; } print(`${description}: FAIL${known}. ${maybeErr}`); failures.push(description); } else { if (known_failures[description]) { unexpected_successes.push(description); } print(`${description}: PASS.`); } } function promise_test(func, description) { last_promise = last_promise.then(func) .then(_ => { if (known_failures[description]) { unexpected_successes.push(description); } print(`${description}: PASS.`); }) .catch(err => { var known = ""; if (known_failures[description]) { known = " (known)"; } print(`${description}: FAIL${known}. ${err}`); failures.push(description); }); } let assert_true = assertEquals.bind(null, true); let assert_false = assertEquals.bind(null, false); function same_value(x, y) { if (y !== y) { // NaN case return x!==x; } if (x === 0 && y === 0) { // Distinguish +0 and -0 return 1/x === 1/y; } return x === y; } let assert_equals = function(expected, found, description) { if (typeof found != typeof expected) { assert_true(false, "assert_equals", description, "expected (" + typeof expected + ") ${expected} but got (" + typeof found + ") ${found}", {expected:expected, found:found}); } assert_true(same_value(found, expected), "assert_equals", description, "expected ${expected} but got ${found}", {expected:expected, found:found}); } let assert_not_equals = function(expected, found, description) { assert_true(!same_value(found, expected), "assert_not_equals", description, "got disallowed value ${found}", {found:found}); } function assert_unreached(description) { throw new Error(`unreachable:\n${description}`); } function assertErrorMessage(f, ctor, test) { try { f(); } catch (e) { assert_true(e instanceof ctor, "expected exception " + ctor.name + ", got " + e); return; } assert_true(false, "expected exception " + ctor.name + ", no exception thrown"); }; load("test/wasm-js/test/harness/wasm-constants.js"); load("test/wasm-js/test/harness/wasm-module-builder.js"); load("test/wasm-js/test/js-api/jsapi.js"); assertPromiseResult(last_promise, _ => { if (failures.length > 0) { let unexpected = false; print("Some tests FAILED:"); for (let i in failures) { if (known_failures[failures[i]]) { print(` ${failures[i]} [KNOWN: ${known_failures[failures[i]]}]`); } else { print(` ${failures[i]}`); unexpected = true; } } if (unexpected_successes.length > 0) { unexpected = true; print(""); print("Unexpected successes:"); for(let i in unexpected_successes) { print(` ${unexpected_successes[i]}`); } print("Some tests SUCCEEDED but were known failures. If you've fixed " + "the bug, please remove the test from the known failures list.") } if (unexpected) { print("\n"); print(" #############################################################"); print(" # #"); print(" # Unexpected outcome. Did you forget to run 'gclient sync'? #"); print(" # #"); print(" #############################################################"); print("\n"); assertUnreachable("Unexpected outcome"); } } });