<!DOCTYPE html><!-- webkit-test-runner [ WebAuthenticationModernEnabled=true ] -->
<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: asciiToUint8Array(""), displayName: user.displayName}, challenge, [pubKeyCredParam]],
        [rp, { name: user.name, id: asciiToUint8Array("12345678123456781234567812345678123456781234567812345678123456781"), 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_js(t, 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>
