<html>
<head>
<script>

var TOTAL_STATEMENTS = 8;
var statements = 0;
var db = null;

function log(message)
{
    document.body.innerText += message + "\n";
}

function terminateTest()
{
    if (window.layoutTestController)
        layoutTestController.notifyDone();
}

function executeStatement(expectedToPass, statement)
{
    db.transaction(function(tx) {
        tx.executeSql(statement, [],
            function(tx, data) {
                if (!expectedToPass) {
                    log("Statement " + statement + " was expected to fail, but passed.");
                    terminateTest();
                }
                if (++statements == TOTAL_STATEMENTS) {
                    log("Test passed.");
                    terminateTest();
                }
            }, function(tx, error) {
                if (expectedToPass) {
                    log("Statement " + statement + " was expected to pass, but failed.");
                    terminateTest();
                }
                if (++statements == TOTAL_STATEMENTS) {
                    log("Test passed.");
                    terminateTest();
                }
            });
    });
}

function runTest()
{
    if (window.layoutTestController) {
        layoutTestController.clearAllDatabases();
        layoutTestController.dumpAsText();
        layoutTestController.waitUntilDone();
    }

    db = openDatabase("ExecuteSQLAcceptsOnlyOneStatementTest", "1.0", "", 1);
    db.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS Test (Foo INT)");
    }, function(error) {
        log("Test failed: " + error.message);
        terminateTest();
    }, function() {
        executeStatement(true, "INSERT INTO Test VALUES (1)");
        executeStatement(true, "INSERT INTO Test VALUES (2);");
        executeStatement(true, "   INSERT INTO Test VALUES (3)    ");
        executeStatement(true, "   INSERT INTO Test VALUES (4);   ");
        executeStatement(true, "INSERT INTO Test VALUES (5)   ;");
        executeStatement(false, "INSERT INTO Test VALUES (6); garbage");
        executeStatement(false, "INSERT INTO Test VALUES (7); INSERT INTO Test VALUES (8)");
        executeStatement(false, "  INSERT INTO Test VALUES (9);   INSERT INTO Test VALUES (10);   ");
    });
}

</script>
</head>
<body onload="runTest();">
This test tests that executeSql() fails when called with a string that has more than one valid statement in it.<br>
</body>
</body>
</html>
