<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("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", 4, 20);
    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 < 20; ++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>
