<!DOCTYPE html>
<title>Tests for configs as arguments to `deprecatedReplaceInURN` and `deprecatedURNToURL`.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>

<body>
<script>

promise_test(async () => {
  const expected_url = location.href + '?foo';
  const config = await generateURNFromFledgeRawURL(location.href + '?${X}', [], true);
  await navigator.deprecatedReplaceInURN(config, {'${X}': 'foo'});
  const url = await navigator.deprecatedURNToURL(config, false);
  assert_equals(url, expected_url, 'The retrieved mapped url should match.');
}, 'deprecated urn APIs should work with configs generated by an API');

promise_test(async () => {
  const config = new FencedFrameConfig(location.href);
  try {
    await navigator.deprecatedReplaceInURN(config, {});
    assert_unreached('deprecatedReplaceInURN must throw for default configs');
  } catch (e) {
    assert_equals(e.message,
                  "Failed to execute 'deprecatedReplaceInURN' on 'Navigator': "
                  + "Passed config must have a mapped URL.");
  }
  try {
    await navigator.deprecatedURNToURL(config, false);
    assert_unreached('deprecatedURNToURL must throw for default configs');
  } catch (e) {
    assert_equals(e.message,
                  "Failed to execute 'deprecatedURNToURL' on 'Navigator': "
                  + "Passed config must have a mapped URL.");
  }
}, 'deprecated urn APIs should not work with configs generated by a WebIDL constructor');

</script>
</body>
</html>
