<!DOCTYPE html>
<title>Web Authentication API: PublicKeyCredential's [[create]] with invalid parameters.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/util.js"></script>
<script>
    const rp = {
        name: "example.com"
    };
    const user = {
        name: "John Appleseed",
        id: asciiToUint8Array("123456"),
        displayName: "Appleseed"
    };
    const challenge = asciiToUint8Array("123456");
    const pubKeyCredParam = { type: "public-key", alg: -7 };
    const excludeCredentials = { type: "public-key", id: asciiToUint8Array("123456") };

    const missingAttributeVector = [
        // missing top level attribute
        [undefined, user, challenge, [pubKeyCredParam]],
        [rp, undefined, challenge, [pubKeyCredParam]],
        [rp, user, undefined, [pubKeyCredParam]],
        [rp, user, challenge, undefined],
        // missing rp attribute
        [{ name: undefined }, user, challenge, [pubKeyCredParam]],
        // missing user attribute
        [rp, { name: undefined, id: user.id, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: undefined, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: user.id, displayName: undefined}, challenge, [pubKeyCredParam]],
        // missing pubKeyCredParams attribute
        [rp, user, challenge, [{ type: undefined, alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: pubKeyCredParam.type, alg: undefined }]],
        // missing excludeCredentials attribute
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: undefined, id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: undefined }]]
    ];

    const wrongTypeAttributeVector = [
        // wrong rp attribute type
        [{ name: Symbol() }, user, challenge, [pubKeyCredParam]],
        [{ name: rp.name, icon: Symbol() }, user, challenge, [pubKeyCredParam]],
        [{ name: rp.name, id: Symbol() }, user, challenge, [pubKeyCredParam]],
        // wrong user attribute type
        [rp, { name: Symbol(), id: user.id, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: 1, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: true, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: null, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: Symbol(), displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: { }, displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: "foo", displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: [ ], displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: user.id, displayName: Symbol()}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: user.id, displayName: user.displayName, icon: Symbol()}, challenge, [pubKeyCredParam]],
        // wrong challenge type
        [rp, user, 1, [pubKeyCredParam]],
        [rp, user, true, [pubKeyCredParam]],
        [rp, user, null, [pubKeyCredParam]],
        [rp, user, Symbol(), [pubKeyCredParam]],
        [rp, user, "foo", [pubKeyCredParam]],
        [rp, user, [ ], [pubKeyCredParam]],
        [rp, user, { }, [pubKeyCredParam]],
        // wrong pubKeyCredParam type
        [rp, user, challenge, [{ type: 1, alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: true, alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: null, alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: Symbol(), alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: "foo", alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: [ ], alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: { }, alg: pubKeyCredParam.alg }]],
        [rp, user, challenge, [{ type: pubKeyCredParam.type, alg: Symbol() }]],
        // wrong timeout type
        [rp, user, challenge, [pubKeyCredParam], Symbol(), undefined],
        // wrong excludeCredentials
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: 1, id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: true, id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: null, id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: Symbol(), id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: "foo", id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: [ ], id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: { }, id: excludeCredentials.id }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: 1 }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: true }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: null }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: Symbol() }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: "foo" }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: [ ] }]],
        [rp, user, challenge, [pubKeyCredParam], undefined, [{ type: excludeCredentials.type, id: { } }]]
    ];

    function makeOptions(attributes)
    {
        if (attributes.length == 4)
            return { publicKey: { rp: attributes[0], user: attributes[1], challenge: attributes[2], pubKeyCredParams: attributes[3] } };
        return { publicKey: { rp: attributes[0], user: attributes[1], challenge: attributes[2], pubKeyCredParams: attributes[3], timeout: attributes[4],  excludeCredentials: attributes[5]} };
    }

    let index = 1;
    function runTest(attributesVectors) {
        attributesVectors.forEach(function(attributesVector) {
            attributesVector.forEach(async function(attributes) {
                promise_test(function(t) {
                    return promise_rejects(t, new TypeError(),
                        navigator.credentials.create(makeOptions(attributes)));
                }, "PublicKeyCredential's [[create]] with with invalid parameters. " + index);
                index = index + 1;
            });
        });
    }

    const vectors = [];
    vectors.push(missingAttributeVector);
    vectors.push(wrongTypeAttributeVector);
    runTest(vectors);
</script>
