1// META: script=/common/subset-tests-by-key.js
2// META: timeout=long
3// META: variant=?include=file
4// META: variant=?include=javascript
5// META: variant=?include=mailto
6// META: variant=?exclude=(file|javascript|mailto)
7
8function runURLTests(urlTests) {
9  for (const expected of urlTests) {
10    // Skip comments
11    if (typeof expected === "string")
12      continue;
13
14    const base = expected.base !== null ? expected.base : undefined;
15
16    function getKey(expected) {
17      if (expected.protocol) {
18        return expected.protocol.replace(":", "");
19      }
20      if (expected.failure) {
21        return expected.input.split(":")[0];
22      }
23      return "other";
24    }
25
26    subsetTestByKey(getKey(expected), test, function() {
27      if (expected.failure) {
28        assert_throws_js(TypeError, function() {
29          new URL(expected.input, base);
30        });
31        return;
32      }
33
34      const url = new URL(expected.input, base);
35      assert_equals(url.href, expected.href, "href")
36      assert_equals(url.protocol, expected.protocol, "protocol")
37      assert_equals(url.username, expected.username, "username")
38      assert_equals(url.password, expected.password, "password")
39      assert_equals(url.host, expected.host, "host")
40      assert_equals(url.hostname, expected.hostname, "hostname")
41      assert_equals(url.port, expected.port, "port")
42      assert_equals(url.pathname, expected.pathname, "pathname")
43      assert_equals(url.search, expected.search, "search")
44      if ("searchParams" in expected) {
45        assert_true("searchParams" in url)
46        assert_equals(url.searchParams.toString(), expected.searchParams, "searchParams")
47      }
48      assert_equals(url.hash, expected.hash, "hash")
49    }, `Parsing: <${expected.input}> ${base ? "against <" + base + ">" : "without base"}`)
50  }
51}
52
53promise_test(() => fetch("resources/urltestdata.json").then(res => res.json()).then(runURLTests), "Loading data…");
54