servo/tests/wpt/web-platform-tests/urlpattern/urlpattern.https.any.js

82 lines
2.9 KiB
JavaScript

// META: global=window,worker
function runTests(data) {
for (let entry of data) {
test(function() {
if (entry.error) {
assert_throws_js(TypeError, _ => new URLPattern(entry.pattern),
'URLPattern() constructor');
return;
}
const pattern = new URLPattern(entry.pattern);
// First, validate the test() method by converting the expected result to
// a truthy value.
assert_equals(pattern.test(entry.input), !!entry.expected,
'test() result');
// Next, start validating the exec() method.
const result = pattern.exec(entry.input);
// On a failed match exec() returns null.
if (!entry.expected) {
assert_equals(result, entry.expected, 'exec() failed match result');
return;
}
// Next verify the result.input is correct. This may be a structured
// URLPatternInit dictionary object or a URL string.
if (typeof entry.expected.input === 'object') {
assert_object_equals(result.input, entry.expected.input,
'exec() result.input');
} else {
assert_equals(result.input, entry.expected.input,
'exec() result.input');
}
// Next we will compare the URLPatternComponentResult for each of these
// expected components.
const component_list = [
'protocol',
'username',
'password',
'hostname',
'password',
'pathname',
'search',
'hash',
];
for (let component of component_list) {
let expected_obj = entry.expected[component];
// If the test expectations don't include a component object, then
// we auto-generate one. This is convenient for the many cases
// where the pattern has a default wildcard or empty string pattern
// for a component and the input is essentially empty.
if (!expected_obj) {
expected_obj = { input: '', groups: {} };
// Next, we must treat default wildcards differently than empty string
// patterns. The wildcard results in a capture group, but the empty
// string pattern does not. The expectation object must list which
// components should be empty instead of wildcards in
// |exactly_empty_components|.
if (!entry.expected.exactly_empty_components ||
!entry.expected.exactly_empty_components.includes(component)) {
expected_obj.groups['0'] = '';
}
}
assert_object_equals(result[component], expected_obj,
`exec() result for ${component}`);
}
}, `Pattern: ${JSON.stringify(entry.pattern)} Input: ${JSON.stringify(entry.input)}`);
}
}
promise_test(async function() {
const response = await fetch('resources/urlpatterntestdata.json');
const data = await response.json();
runTests(data);
}, 'Loading data...');