<!DOCTYPE html>
<head>
<title>Testcases from the previous Sanitizer API</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/html5lib-testcase-support.js"></script>
<script>

// Testcases from the old(er) support/testcases.sub.js file, ported over to
// the HTML5Lib testcase format.
promise_test(_ => {
  return html5lib_testcases_from_response(fetch("sethtml-tree-construction.sub.dat")).
      then(testcases => {
        testcases.forEach((testcase, index) => {
          test(_ => {
            const div = document.createElement("div");
            let config = undefined;
            try {
              config = JSON.parse(testcase.config);
            } catch { }
            try {
              div.setHTML(testcase.data, { sanitizer: config });
            } catch (error) {
              assert_equals(
                error.name, testcase.error,
                `Expect exception ${testcase.error}, but got ${error}.`);
              return;  // Early return in order to not trigger the subsequent
                       // assertions.
            }
            assert_false(
              !!testcase.error,
              `Expect exception ${testcase.error}, but nothing was thrown.`);
            assert_testcase(div, testcase);
          }, `Testcase #${index}, "${testcase.data}", config: "${testcase.config}".`);
        });
      });
}, "wrapper");

// support/testcases.sub.js contained a few testcases with non-strings as
// input. The html5lib format doesn't support that, so we'll just add them here:
test(_ => {
  const div = document.createElement("div");
  div.setHTML({});
  assert_equals(div.outerHTML, "<div>[object Object]</div>");
}, "Non-string input: empty object.");
test(_ => {
  const div = document.createElement("div");
  div.setHTML(1);
  assert_equals(div.outerHTML, "<div>1</div>");
}, "Non-string input: number.");
test(_ => {
  const div = document.createElement("div");
  div.setHTML(000);
  assert_equals(div.outerHTML, "<div>0</div>");
}, "Non-string input: octal number.");
test(_ => {
  const div = document.createElement("div");
  div.setHTML(1 + 2);
  assert_equals(div.outerHTML, "<div>3</div>");
}, "Non-string input: expression.");
test(_ => {
  const div = document.createElement("div");
  div.setHTML(undefined);
  assert_equals(div.outerHTML, "<div>undefined</div>");
}, "Non-string input: undefined.");

</script>
</head>
<body>
</body>
