<!doctype html>
<meta charset="utf-8">
<title>FormData.append</title>
<link rel="help" href="https://xhr.spec.whatwg.org/#dom-formdata-append">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<form id="form" />
<script>
    function test_formdata(creator, verifier, description) {
        async_test(description).step(function() {
            var fd = creator();
            var xhr = new XMLHttpRequest();
            xhr.onload = this.step_func(function() {
                verifier(xhr.responseText);
                this.done();
            });
            xhr.open("POST", "resources/upload.py");
            xhr.send(fd);
        });
    }

    test_formdata(function() {
        var fd = new FormData();
        fd.append("name", new String("value"));
        return fd;
    }, function(data) {
        assert_equals(data, "name=value,\n");
    }, "Passing a String object to FormData.append should work.");

    test(function() {
        assert_equals(create_formdata(['key', 'value1']).get('key'), "value1");
    }, 'testFormDataAppend1');
    test(function() {
        assert_equals(create_formdata(['key', 'value2'], ['key', 'value1']).get('key'), "value2");
    }, 'testFormDataAppend2');
    test(function() {
        assert_equals(create_formdata(['key', undefined]).get('key'), "undefined");
    }, 'testFormDataAppendUndefined1');
    test(function() {
        assert_equals(create_formdata(['key', undefined], ['key', 'value1']).get('key'), "undefined");
    }, 'testFormDataAppendUndefined2');
    test(function() {
        assert_equals(create_formdata(['key', null]).get('key'), "null");
    }, 'testFormDataAppendNull1');
    test(function() {
        assert_equals(create_formdata(['key', null], ['key', 'value1']).get('key'), "null");
    }, 'testFormDataAppendNull2');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', 'value1');
        assert_equals(fd.get('key'), "value1");
    }, 'testFormDataAppendToForm1');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', 'value2');
        fd.append('key', 'value1');
        assert_equals(fd.get('key'), "value2");
    }, 'testFormDataAppendToForm2');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', undefined);
        assert_equals(fd.get('key'), "undefined");
    }, 'testFormDataAppendToFormUndefined1');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', undefined);
        fd.append('key', 'value1');
        assert_equals(fd.get('key'), "undefined");
    }, 'testFormDataAppendToFormUndefined2');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', null);
        assert_equals(fd.get('key'), "null");
    }, 'testFormDataAppendToFormNull1');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        fd.append('key', null);
        fd.append('key', 'value1');
        assert_equals(fd.get('key'), "null");
    }, 'testFormDataAppendToFormNull2');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        assert_throws_js(TypeError, () => {fd.append('name', "string", 'filename')});
    }, 'testFormDataAppendToFormString');
    test(function() {
        var fd = new FormData(document.getElementById("form"));
        assert_throws_js(TypeError, () => {fd.append('name', new URLSearchParams(), 'filename')});
    }, 'testFormDataAppendToFormWrongPlatformObject');
    test(function() {
        var before = new Date(new Date().getTime() - 2000); // two seconds ago, in case there's clock drift
        var fd = create_formdata(['key', new Blob(), 'blank.txt']).get('key');
        assert_equals(fd.name, "blank.txt");
        assert_equals(fd.type, "");
        assert_equals(fd.size, 0);
        assert_greater_than_equal(fd.lastModified, before);
        assert_less_than_equal(fd.lastModified, new Date());
    }, 'testFormDataAppendEmptyBlob');

    function create_formdata() {
        var fd = new FormData();
        for (var i = 0; i < arguments.length; i++) {
            fd.append.apply(fd, arguments[i]);
        };
        return fd;
    }
</script>
