diff --git a/urlpattern/resources/urlpattern-compare-test-data.json b/urlpattern/resources/urlpattern-compare-test-data.json new file mode 100644 index 00000000000000..1bde50e73fce25 --- /dev/null +++ b/urlpattern/resources/urlpattern-compare-test-data.json @@ -0,0 +1,132 @@ +[ + { + "left": { "pathname": "/foo/a" }, + "right": { "pathname": "/foo/b" }, + "expected": -1 + }, + { + "left": { "pathname": "/foo/b" }, + "right": { "pathname": "/foo/bar" }, + "expected": -1 + }, + { + "left": { "pathname": "/foo/bar" }, + "right": { "pathname": "/foo/:bar" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/" }, + "right": { "pathname": "/foo/:bar" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/:bar" }, + "right": { "pathname": "/foo/*" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/{bar}" }, + "right": { "pathname": "/foo/(bar)" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/{bar}" }, + "right": { "pathname": "/foo/{bar}+" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/{bar}+" }, + "right": { "pathname": "/foo/{bar}?" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/{bar}?" }, + "right": { "pathname": "/foo/{bar}*" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/(123)" }, + "right": { "pathname": "/foo/(12)" }, + "expected": 1 + }, + { + "left": { "pathname": "/foo/:b" }, + "right": { "pathname": "/foo/:a" }, + "expected": 0 + }, + { + "left": { "pathname": "*/foo" }, + "right": { "pathname": "*" }, + "expected": 1 + }, + { + "left": { "protocol": "https", "pathname": "*/foo" }, + "right": { "protocol": "https" }, + "expected": 1 + }, + { + "left": { "protocol": "https" }, + "right": { "protocol": "https", "pathname": "*" }, + "expected": 0 + }, + { + "left": { "hash": "b", "search": "a" }, + "right": { "hash": "a", "search": "b" }, + "expected": 1 + }, + { + "left": { "search": "b", "pathname": "a" }, + "right": { "search": "a", "pathname": "b" }, + "expected": 1 + }, + { + "left": { "pathname": "b", "port": "1" }, + "right": { "pathname": "a", "port": "2" }, + "expected": 1 + }, + { + "left": { "port": "2", "hostname": "a" }, + "right": { "port": "1", "hostname": "b" }, + "expected": 1 + }, + { + "left": { "hostname": "b", "password": "a" }, + "right": { "hostname": "a", "password": "b" }, + "expected": 1 + }, + { + "left": { "password": "b", "username": "a" }, + "right": { "password": "a", "username": "b" }, + "expected": 1 + }, + { + "left": { "username": "b", "protocol": "a" }, + "right": { "username": "a", "protocol": "b" }, + "expected": 1 + }, + { + "left": { "port": "9" }, + "right": { "port": "100" }, + "expected": 1 + }, + { + "left": { "pathname": "foo/:bar?/baz" }, + "right": { "pathname": "foo/{:bar}?/baz" }, + "expected": -1 + }, + { + "left": { "pathname": "foo/:bar?/baz" }, + "right": { "pathname": "foo{/:bar}?/baz" }, + "expected": 0 + }, + { + "left": { "pathname": "foo/:bar?/baz" }, + "right": { "pathname": "fo{o/:bar}?/baz" }, + "expected": 1 + }, + { + "left": { "pathname": "foo/:bar?/baz" }, + "right": { "pathname": "foo{/:bar/}?baz" }, + "expected": -1 + } +] diff --git a/urlpattern/resources/urlpattern-compare-tests.js b/urlpattern/resources/urlpattern-compare-tests.js new file mode 100644 index 00000000000000..4231fc55042f1e --- /dev/null +++ b/urlpattern/resources/urlpattern-compare-tests.js @@ -0,0 +1,25 @@ +function runTests(data) { + for (let entry of data) { + test(function() { + const left = new URLPattern(entry.left); + const right = new URLPattern(entry.right); + + assert_equals(URLPattern.compare(left, right), entry.expected); + + // We have to coerce to an integer here in order to avoid asserting + // that `+0` is `-0`. + const reverse_expected = ~~(entry.expected * -1); + assert_equals(URLPattern.compare(right, left), reverse_expected, "reverse order"); + + assert_equals(URLPattern.compare(left, left), 0, "left equality"); + assert_equals(URLPattern.compare(right, right), 0, "right equality"); + }, `Pattern: ${JSON.stringify(entry.left)} ` + + `Inputs: ${JSON.stringify(entry.right)}`); + } +} + +promise_test(async function() { + const response = await fetch('resources/urlpattern-compare-test-data.json'); + const data = await response.json(); + runTests(data); +}, 'Loading data...'); diff --git a/urlpattern/urlpattern-compare.any.js b/urlpattern/urlpattern-compare.any.js new file mode 100644 index 00000000000000..8db38adfd41d47 --- /dev/null +++ b/urlpattern/urlpattern-compare.any.js @@ -0,0 +1,2 @@ +// META: global=window,worker +// META: script=resources/urlpattern-compare-tests.js diff --git a/urlpattern/urlpattern-compare.https.any.js b/urlpattern/urlpattern-compare.https.any.js new file mode 100644 index 00000000000000..8db38adfd41d47 --- /dev/null +++ b/urlpattern/urlpattern-compare.https.any.js @@ -0,0 +1,2 @@ +// META: global=window,worker +// META: script=resources/urlpattern-compare-tests.js