blob: 904a973519e5c1cf22073a9179ef82ece05dbd06 [file] [log] [blame]
// Copyright 2018 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.
// Implementations of some functions from testharness.js
// See https://github.com/web-platform-tests/wpt/blob/master/resources/testharness.js
// Licensed as follows:
//
// Distributed under both the W3C Test Suite License [1] and the W3C
// 3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
// policies and contribution forms [3].
// [1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
// [2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
// [3] http://www.w3.org/2004/10/27-testcases
const failures = [];
let lastPromise = Promise.resolve();
function test(func, description) {
let maybeErr;
try { func({unreached_func: unreached_func}); }
catch(e) { maybeErr = e; }
if (typeof maybeErr !== 'undefined') {
console.log(`${description}: FAIL. ${maybeErr}`);
failures.push(description);
} else {
console.log(`${description}: PASS.`);
}
}
function promise_test(func, description) {
lastPromise = lastPromise.then(func)
.then(_ => {
console.log(`${description}: PASS.`);
})
.catch(err => {
console.log(`${description}: FAIL. ${err}`);
failures.push(description);
});
}
const assert_true = assertEquals.bind(null, true);
const 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;
}
function assert_equals(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});
}
function assert_not_equals(expected, found, description) {
assert_true(!same_value(found, expected), "assert_not_equals", description,
"got disallowed value ${found}", {found:found});
}
function assert_array_equals(actual, expected, description) {
assert_true(
typeof actual === 'object' && actual !== null && 'length' in actual,
'assert_array_equals', description, 'value is ${actual}, expected array',
{actual: actual});
assert_true(
actual.length === expected.length, 'assert_array_equals', description,
'lengths differ, expected ${expected} got ${actual}',
{expected: expected.length, actual: actual.length});
for (let i = 0; i < actual.length; i++) {
assert_true(
actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
'assert_array_equals', description,
'property ${i}, property expected to be ${expected} but was ${actual}',
{
i: i,
expected: expected.hasOwnProperty(i) ? 'present' : 'missing',
actual: actual.hasOwnProperty(i) ? 'present' : 'missing'
});
assert_true(
same_value(expected[i], actual[i]), 'assert_array_equals', description,
'property ${i}, expected ${expected} but got ${actual}',
{i: i, expected: expected[i], actual: actual[i]});
}
}
function unreached_func(msg) {
return function trap() {
assert_unreached(msg);
};
}
function assert_unreached(description) {
throw new Error(`unreachable:\n${description}`);
}
function format_value(s) {
// TODO
try {
return String(s);
} catch(e) {
return `<String(e) for type ${typeof(e)} threw>`;
}
}
function promise_rejects(test, expected, promise, description) {
return promise
.then(() => assert_unreached('Should have rejected: ' + description))
.catch(function(e) {
assert_throws(expected, function() {
throw e;
}, description);
});
}
function assert_class_string(object, class_string, description) {
assert_equals(
{}.toString.call(object), '[object ' + class_string + ']', description);
}
function assert_throws(code, func, description) {
try {
func();
} catch (e) {
assert_true(e.name === code.name, "expected exception " + code.name + ", got " + e.name);
return;
}
assert_true(false, "expected exception " + code.name + ", no exception thrown");
}
function setup(func) {
// TODO need to do anything fancier here?
func();
}