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

function test_prepend(node, nodeName) {

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

    test(function() {
        var 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() {
        var 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() {
        var 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() {
        var parent = node.cloneNode();
        var 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() {
        var parent = node.cloneNode();
        var 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() {
        var parent = node.cloneNode();
        var x = document.createElement('x');
        var 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(), 'DocumentFrgment');
</script>
</html>
