<!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 throwfor 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>
