Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/testharness-helpers.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/testharness-helpers.js b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/testharness-helpers.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4d7af1ff9ca77c85696f35368ff3a7a1c4b2480b |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/testharness-helpers.js |
@@ -0,0 +1,163 @@ |
+/* |
+ * testharness-helpers contains various useful extensions to testharness.js to |
+ * allow them to be used across multiple tests before they have been |
+ * upstreamed. This file is intended to be usable from both document and worker |
+ * environments, so code should for example not rely on the DOM. |
+ */ |
+ |
+// Returns a promise that fulfills after the provided |promise| is fulfilled. |
+// The |test| succeeds only if |promise| rejects with an exception matching |
+// |code|. Accepted values for |code| follow those accepted for assert_throws(). |
+// The optional |description| describes the test being performed. |
+// |
+// E.g.: |
+// assert_promise_rejects( |
+// new Promise(...), // something that should throw an exception. |
+// 'NotFoundError', |
+// 'Should throw NotFoundError.'); |
+// |
+// assert_promise_rejects( |
+// new Promise(...), |
+// new TypeError(), |
+// 'Should throw TypeError'); |
+function assert_promise_rejects(promise, code, description) { |
+ return promise.then( |
+ function() { |
+ throw 'assert_promise_rejects: ' + description + ' Promise did not reject.'; |
+ }, |
+ function(e) { |
+ if (code !== undefined) { |
+ assert_throws(code, function() { throw e; }, description); |
+ } |
+ }); |
+} |
+ |
+// Asserts that two objects |actual| and |expected| are weakly equal under the |
+// following definition: |
+// |
+// |a| and |b| are weakly equal if any of the following are true: |
+// 1. If |a| is not an 'object', and |a| === |b|. |
+// 2. If |a| is an 'object', and all of the following are true: |
+// 2.1 |a.p| is weakly equal to |b.p| for all own properties |p| of |a|. |
+// 2.2 Every own property of |b| is an own property of |a|. |
+// |
+// This is a replacement for the the version of assert_object_equals() in |
+// testharness.js. The latter doesn't handle own properties correctly. I.e. if |
+// |a.p| is not an own property, it still requires that |b.p| be an own |
+// property. |
+// |
+// Note that |actual| must not contain cyclic references. |
+self.assert_object_equals = function(actual, expected, description) { |
+ var object_stack = []; |
+ |
+ function _is_equal(actual, expected, prefix) { |
+ if (typeof actual !== 'object') { |
+ assert_equals(actual, expected, prefix); |
+ return; |
+ } |
+ assert_true(typeof expected === 'object', prefix); |
+ assert_equals(object_stack.indexOf(actual), -1, |
+ prefix + ' must not contain cyclic references.'); |
+ |
+ object_stack.push(actual); |
+ |
+ Object.getOwnPropertyNames(expected).forEach(function(property) { |
+ assert_own_property(actual, property, prefix); |
+ _is_equal(actual[property], expected[property], |
+ prefix + '.' + property); |
+ }); |
+ Object.getOwnPropertyNames(actual).forEach(function(property) { |
+ assert_own_property(expected, property, prefix); |
+ }); |
+ |
+ object_stack.pop(); |
+ } |
+ |
+ function _brand(object) { |
+ return Object.prototype.toString.call(object).match(/^\[object (.*)\]$/)[1]; |
+ } |
+ |
+ _is_equal(actual, expected, |
+ (description ? description + ': ' : '') + _brand(expected)); |
+}; |
+ |
+// Equivalent to assert_in_array, but uses a weaker equivalence relation |
+// (assert_object_equals) than '==='. |
+function assert_object_in_array(actual, expected_array, description) { |
+ assert_true(expected_array.some(function(element) { |
+ try { |
+ assert_object_equals(actual, element); |
+ return true; |
+ } catch (e) { |
+ return false; |
+ } |
+ }), description); |
+} |
+ |
+// Assert that the two arrays |actual| and |expected| contain the same set of |
+// elements as determined by assert_object_equals. The order is not significant. |
+// |
+// |expected| is assumed to not contain any duplicates as determined by |
+// assert_object_equals(). |
+function assert_array_equivalent(actual, expected, description) { |
+ assert_true(Array.isArray(actual), description); |
+ assert_equals(actual.length, expected.length, description); |
+ expected.forEach(function(expected_element) { |
+ // assert_in_array treats the first argument as being 'actual', and the |
+ // second as being 'expected array'. We are switching them around because |
+ // we want to be resilient against the |actual| array containing |
+ // duplicates. |
+ assert_object_in_array(expected_element, actual, description); |
+ }); |
+} |
+ |
+// Asserts that two arrays |actual| and |expected| contain the same set of |
+// elements as determined by assert_object_equals(). The corresponding elements |
+// must occupy corresponding indices in their respective arrays. |
+function assert_array_objects_equals(actual, expected, description) { |
+ assert_true(Array.isArray(actual), description); |
+ assert_equals(actual.length, expected.length, description); |
+ actual.forEach(function(value, index) { |
+ assert_object_equals(value, expected[index], |
+ description + ' : object[' + index + ']'); |
+ }); |
+} |
+ |
+// Asserts that |object| that is an instance of some interface has the attribute |
+// |attribute_name| following the conditions specified by WebIDL, but it's |
+// acceptable that the attribute |attribute_name| is an own property of the |
+// object because we're in the middle of moving the attribute to a prototype |
+// chain. Once we complete the transition to prototype chains, |
+// assert_will_be_idl_attribute must be replaced with assert_idl_attribute |
+// defined in testharness.js. |
+// |
+// FIXME: Remove assert_will_be_idl_attribute once we complete the transition |
+// of moving the DOM attributes to prototype chains. (http://crbug.com/43394) |
+function assert_will_be_idl_attribute(object, attribute_name, description) { |
+ assert_true(typeof object === "object", description); |
+ |
+ assert_true("hasOwnProperty" in object, description); |
+ |
+ // Do not test if |attribute_name| is not an own property because |
+ // |attribute_name| is in the middle of the transition to a prototype |
+ // chain. (http://crbug.com/43394) |
+ |
+ assert_true(attribute_name in object, description); |
+} |
+ |
+// Stringifies a DOM object. This function stringifies not only own properties |
+// but also DOM attributes which are on a prototype chain. Note that |
+// JSON.stringify only stringifies own properties. |
+function stringifyDOMObject(object) |
+{ |
+ function deepCopy(src) { |
+ if (typeof src != "object") |
+ return src; |
+ var dst = Array.isArray(src) ? [] : {}; |
+ for (var property in src) { |
+ dst[property] = deepCopy(src[property]); |
+ } |
+ return dst; |
+ } |
+ return JSON.stringify(deepCopy(object)); |
+} |