<!DOCTYPE html>
<html>
    <head>
        <script src="harness.js"></script>
        <script>
            function check_copy(orig, copy, type) {
                is_not(orig, copy);
                is_a(orig, type);
                is_a(copy, type);
            }

            function create_element_and_check(localName, type) {
                var element = document.createElement(localName);
                var copy = element.cloneNode();
                check_copy(element, copy, type);
            }

            // test1: createElement
            {
                create_element_and_check("a",         HTMLAnchorElement);
                create_element_and_check("abbr",      HTMLElement);
                create_element_and_check("acronym",   HTMLElement);
                create_element_and_check("address",   HTMLElement);
                create_element_and_check("applet",    HTMLAppletElement);
                create_element_and_check("area",      HTMLAreaElement);
                create_element_and_check("article",   HTMLElement);
                create_element_and_check("aside",     HTMLElement);
                create_element_and_check("audio",     HTMLAudioElement);
                create_element_and_check("b",         HTMLElement);
                create_element_and_check("base",      HTMLBaseElement);
                create_element_and_check("bdi",       HTMLElement);
                create_element_and_check("bdo",       HTMLElement);
                create_element_and_check("bgsound",   HTMLElement);
                create_element_and_check("big",       HTMLElement);
                create_element_and_check("blockquote",HTMLElement);
                create_element_and_check("body",      HTMLBodyElement);
                create_element_and_check("br",        HTMLBRElement);
                create_element_and_check("button",    HTMLButtonElement);
                create_element_and_check("canvas",    HTMLCanvasElement);
                create_element_and_check("caption",   HTMLTableCaptionElement);
                create_element_and_check("center",    HTMLElement);
                create_element_and_check("cite",      HTMLElement);
                create_element_and_check("code",      HTMLElement);
                create_element_and_check("col",       HTMLTableColElement);
                create_element_and_check("colgroup",  HTMLTableColElement);
                create_element_and_check("data",      HTMLDataElement);
                create_element_and_check("datalist",  HTMLDataListElement);
                create_element_and_check("dd",        HTMLElement);
                create_element_and_check("del",       HTMLModElement);
                create_element_and_check("details",   HTMLElement);
                create_element_and_check("dfn",       HTMLElement);
                create_element_and_check("dir",       HTMLDirectoryElement);
                create_element_and_check("div",       HTMLDivElement);
                create_element_and_check("dl",        HTMLDListElement);
                create_element_and_check("dt",        HTMLElement);
                create_element_and_check("embed",     HTMLEmbedElement);
                create_element_and_check("fieldset",  HTMLFieldSetElement);
                create_element_and_check("figcaption",HTMLElement);
                create_element_and_check("figure",    HTMLElement);
                create_element_and_check("font",      HTMLFontElement);
                create_element_and_check("footer",    HTMLElement);
                create_element_and_check("form",      HTMLFormElement);
                create_element_and_check("frame",     HTMLFrameElement);
                create_element_and_check("frameset",  HTMLFrameSetElement);
                create_element_and_check("h1",        HTMLHeadingElement);
                create_element_and_check("h2",        HTMLHeadingElement);
                create_element_and_check("h3",        HTMLHeadingElement);
                create_element_and_check("h4",        HTMLHeadingElement);
                create_element_and_check("h5",        HTMLHeadingElement);
                create_element_and_check("h6",        HTMLHeadingElement);
                create_element_and_check("head",      HTMLHeadElement);
                create_element_and_check("header",    HTMLElement);
                create_element_and_check("hgroup",    HTMLElement);
                create_element_and_check("hr",        HTMLHRElement);
                create_element_and_check("html",      HTMLHtmlElement);
                create_element_and_check("i",         HTMLElement);
                create_element_and_check("iframe",    HTMLIFrameElement);
                create_element_and_check("img",       HTMLImageElement);
                create_element_and_check("input",     HTMLInputElement);
                create_element_and_check("ins",       HTMLModElement);
                create_element_and_check("isindex",   HTMLElement);
                create_element_and_check("kbd",       HTMLElement);
                create_element_and_check("label",     HTMLLabelElement);
                create_element_and_check("legend",    HTMLLegendElement);
                create_element_and_check("li",        HTMLLIElement);
                create_element_and_check("link",      HTMLLinkElement);
                create_element_and_check("main",      HTMLElement);
                create_element_and_check("map",       HTMLMapElement);
                create_element_and_check("mark",      HTMLElement);
                create_element_and_check("marquee",   HTMLElement);
                create_element_and_check("meta",      HTMLMetaElement);
                create_element_and_check("meter",     HTMLMeterElement);
                create_element_and_check("nav",       HTMLElement);
                create_element_and_check("nobr",      HTMLElement);
                create_element_and_check("noframes",  HTMLElement);
                create_element_and_check("noscript",  HTMLElement);
                create_element_and_check("object",    HTMLObjectElement);
                create_element_and_check("ol",        HTMLOListElement);
                create_element_and_check("optgroup",  HTMLOptGroupElement);
                create_element_and_check("option",    HTMLOptionElement);
                create_element_and_check("output",    HTMLOutputElement);
                create_element_and_check("p",         HTMLParagraphElement);
                create_element_and_check("param",     HTMLParamElement);
                create_element_and_check("pre",       HTMLPreElement);
                create_element_and_check("progress",  HTMLProgressElement);
                create_element_and_check("q",         HTMLQuoteElement);
                create_element_and_check("rp",        HTMLElement);
                create_element_and_check("rt",        HTMLElement);
                create_element_and_check("ruby",      HTMLElement);
                create_element_and_check("s",         HTMLElement);
                create_element_and_check("samp",      HTMLElement);
                create_element_and_check("script",    HTMLScriptElement);
                create_element_and_check("section",   HTMLElement);
                create_element_and_check("select",    HTMLSelectElement);
                create_element_and_check("small",     HTMLElement);
                create_element_and_check("source",    HTMLSourceElement);
                create_element_and_check("spacer",    HTMLElement);
                create_element_and_check("span",      HTMLSpanElement);
                create_element_and_check("strike",    HTMLElement);
                create_element_and_check("style",     HTMLStyleElement);
                create_element_and_check("sub",       HTMLElement);
                create_element_and_check("summary",   HTMLElement);
                create_element_and_check("sup",       HTMLElement);
                create_element_and_check("table",     HTMLTableElement);
                create_element_and_check("tbody",     HTMLTableSectionElement);
                create_element_and_check("td",        HTMLTableDataCellElement);
                create_element_and_check("template",  HTMLTemplateElement);
                create_element_and_check("textarea",  HTMLTextAreaElement);
                create_element_and_check("th",        HTMLTableHeaderCellElement);
                create_element_and_check("time",      HTMLTimeElement);
                create_element_and_check("title",     HTMLTitleElement);
                create_element_and_check("tr",        HTMLTableRowElement);
                create_element_and_check("tt",        HTMLElement);
                create_element_and_check("track",     HTMLTrackElement);
                create_element_and_check("u",         HTMLElement);
                create_element_and_check("ul",        HTMLUListElement);
                create_element_and_check("var",       HTMLElement);
                create_element_and_check("video",     HTMLVideoElement);
                create_element_and_check("unknown",   HTMLUnknownElement);
                create_element_and_check("wbr",       HTMLElement);
            }

            // test2: createDocumentFragment
            {
                var fragment = document.createDocumentFragment();
                var copy = fragment.cloneNode();
                check_copy(fragment, copy, DocumentFragment);
            }

            // test3: createTextNode
            {
                var text = document.createTextNode("hello world");
                var copy = text.cloneNode();
                check_copy(text, copy, Text);
                is(text.data, copy.data);
                is(text.wholeText, copy.wholeText);
            }

            // test4: createComment
            {
                var comment = document.createComment("a comment");
                var copy = comment.cloneNode();
                check_copy(comment, copy, Comment);
                is(comment.data, copy.data);
            }

            // test5: createProcessingInstruction
            {
                var pi = document.createProcessingInstruction("target", "data");
                var copy = pi.cloneNode();
                check_copy(pi, copy, ProcessingInstruction);
                is(pi.data, copy.data);
                is(pi.target, pi.target);
            }

            // test6: implementation.createDocumentType
            {
                var doctype = document.implementation.createDocumentType("html", "public", "system");
                var copy = doctype.cloneNode();
                check_copy(doctype, copy, DocumentType);
                is(doctype.name, copy.name);
                is(doctype.publicId, copy.publicId);
                is(doctype.systemId, copy.systemId);
            }

            // test7: implementation.createDocument
            {
                // FIXME: https://github.com/mozilla/servo/issues/1509
            }

            // test8: implementation.createHTMLDocument
            {
                var html = document.implementation.createHTMLDocument("title");
                var copy = html.cloneNode();
                check_copy(html, copy, Document);
                is(html.title, copy.title);
            }

            // test9: node with children
            {
                var parent = document.createElement("div");
                var child1 = document.createElement("div");
                var child2 = document.createElement("div");
                var grandChild = document.createElement("div");

                child2.appendChild(grandChild);
                parent.appendChild(child1);
                parent.appendChild(child2);

                var deep = true;
                var copy = parent.cloneNode(deep);

                check_copy(parent, copy, HTMLDivElement);
                is(copy.childNodes.length, 2);

                check_copy(child1, copy.childNodes[0], HTMLDivElement);
                is(copy.childNodes[0].childNodes.length, 0);

                check_copy(child2, copy.childNodes[1], HTMLDivElement);
                is(copy.childNodes[1].childNodes.length, 1);
                check_copy(grandChild, copy.childNodes[1].childNodes[0], HTMLDivElement);

                deep = false;
                copy = parent.cloneNode(deep);

                check_copy(parent, copy, HTMLDivElement);
                is(copy.childNodes.length, 0);
            }
        </script>
    </head>
</html>