<head>
<script>

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function log(msg)
{
    document.getElementById("logger").innerHTML += msg + "<br>";
}

function finishTest()
{
    if (testRunner)
        testRunner.notifyDone();
}

function handleGamepadConnect(evt)
{
    log("Connecting gamepad:");
    log(navigator.getGamepads());
    logGamepad(evt.gamepad);
    testGenerator.next();
}

function handleGamepadDisconnect(evt)
{
    log("Disconnecting gamepad:");
    log(navigator.getGamepads());
    testGenerator.next();
}

function logGamepad(gp)
{
    log("Name: " + gp.id);
    log("Index: " + gp.index);
    log("Mapping: " + gp.mapping);
    log("Axes: " + gp.axes);
    
    var buttonString = "";
    for (button in gp.buttons) {
        buttonString += gp.buttons[button].pressed + "-" + gp.buttons[button].value + " ";
    }
    
    log("Buttons: " + buttonString);
}

function* testSteps() {
    addEventListener("gamepadconnected", handleGamepadConnect);
    addEventListener("gamepaddisconnected", handleGamepadDisconnect);

    log("Initial gamepads length: " + navigator.getGamepads().length);
    log("Connecting 20 different gamepads");
    for (var i = 0; i < 20; ++i) {
        testRunner.setMockGamepadDetails(i, i, "", i, i);
        testRunner.connectMockGamepad(i);
        yield;
    }
    
    log("Verifying there are 20 connected gamepads in the set of all gamepads");
    var gamepads = navigator.getGamepads();
    log(gamepads);
    for (i in gamepads) {
        logGamepad(gamepads[i]);
    }

    log("Disconnecting gamepads in reverse order, making sure gamepads array remains as expected");
    for (var i = 19; i >= 0; --i) {
        testRunner.disconnectMockGamepad(i);
        yield;
    }

    log("Checking non-zero'ed details for a gamepad");

    testRunner.setMockGamepadDetails(10, "Awesome Joystick 5000", "standard", 4, 16);
    testRunner.setMockGamepadAxisValue(10, 0, 0.7);
    testRunner.setMockGamepadAxisValue(10, 1, -0.9);
    testRunner.setMockGamepadAxisValue(10, 2, 1.0);
    testRunner.setMockGamepadAxisValue(10, 3, -1.0);
    for (var i = 0; i < 16; ++i)
        testRunner.setMockGamepadButtonValue(10, i, 1.0);
        
    testRunner.connectMockGamepad(10);
    yield;

    finishTest();
}

function runTest()
{
    testGenerator = testSteps();
    testGenerator.next();
}

</script>
</head>
<body onload="runTest();">
<div id="logger"></div>
</body>
