2018-10-19 20:45:00 +02:00
|
|
|
// 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;
|
2018-11-28 20:08:28 +01:00
|
|
|
try { func({unreached_func: unreached_func}); }
|
2018-10-19 20:45:00 +02:00
|
|
|
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]});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-28 20:08:28 +01:00
|
|
|
function unreached_func(msg) {
|
|
|
|
return function trap() {
|
|
|
|
assert_unreached(msg);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-10-19 20:45:00 +02:00
|
|
|
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();
|
|
|
|
}
|