<!DOCTYPE html>
<meta charset=utf-8>
<title>ParentNode.prepend</title>
<link rel=help href="https://dom.spec.whatwg.org/#dom-parentnode-prepend">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="pre-insertion-validation-hierarchy.js"></script>
<script>
preInsertionValidateHierarchy("prepend");

function test_prepend(node, nodeName) {
    test(function() {
        const parent = node.cloneNode();
        parent.prepend();
        assert_array_equals(parent.childNodes, []);
    }, nodeName + '.prepend() without any argument, on a parent having no child.');

    test(function() {
        const parent = node.cloneNode();
        parent.prepend(null);
        assert_equals(parent.childNodes[0].textContent, 'null');
    }, nodeName + '.prepend() with null as an argument, on a parent having no child.');

    test(function() {
        const parent = node.cloneNode();
        parent.prepend(undefined);
        assert_equals(parent.childNodes[0].textContent, 'undefined');
    }, nodeName + '.prepend() with undefined as an argument, on a parent having no child.');

    test(function() {
        const parent = node.cloneNode();
        parent.prepend('text');
        assert_equals(parent.childNodes[0].textContent, 'text');
    }, nodeName + '.prepend() with only text as an argument, on a parent having no child.');

    test(function() {
        const parent = node.cloneNode();
        const x = document.createElement('x');
        parent.prepend(x);
        assert_array_equals(parent.childNodes, [x]);
    }, nodeName + '.prepend() with only one element as an argument, on a parent having no child.');

    test(function() {
        const parent = node.cloneNode();
        const child = document.createElement('test');
        parent.appendChild(child);
        parent.prepend(null);
        assert_equals(parent.childNodes[0].textContent, 'null');
        assert_equals(parent.childNodes[1], child);
    }, nodeName + '.prepend() with null as an argument, on a parent having a child.');

    test(function() {
        const parent = node.cloneNode();
        const x = document.createElement('x');
        const child = document.createElement('test');
        parent.appendChild(child);
        parent.prepend(x, 'text');
        assert_equals(parent.childNodes[0], x);
        assert_equals(parent.childNodes[1].textContent, 'text');
        assert_equals(parent.childNodes[2], child);
    }, nodeName + '.prepend() with one element and text as argument, on a parent having a child.');
}

test_prepend(document.createElement('div'), 'Element');
test_prepend(document.createDocumentFragment(), 'DocumentFragment');
</script>
</html>
