<html>

<head>
<script>

var throwOnToStringObject = { };
throwOnToStringObject.toString = function () { throw "Cannot call toString on this object." };

var throwOnGetLengthObject = { };
throwOnGetLengthObject.__defineGetter__("length", function () { throw "Cannot get length of this object."; });

var throwOnGetZeroObject = { length: 1 };
throwOnGetZeroObject.__defineGetter__("0", function () { throw "Cannot get 0 property of this object."; });

var expectNoException = [
    '',
    'null',
    'undefined',
    '0',
    '""',
    '"", null',
    '"", undefined',
    '"", []',
    '"", [ "arg0" ]',
    '"", { }',
    '"", { length: 0 }',
    '"", { length: 1, 0: "arg0" }',
    '"", null, null',
    '"", null, undefined',
    '"", null, { }',
    '"", null, null, null',
    '"", null, null, undefined',
    '"", null, null, { }',
];

var expectException = [
    'throwOnToStringObject',
    '"", throwOnGetLengthObject',
    '"", throwOnGetZeroObject',
    '"", [ throwOnToStringObject ]',
    '"", 0',
    '"", ""',
    '"", null, 0',
    '"", null, ""',
    '"", null, null, 0',
    '"", null, null, ""',
];

function writeMessageToLog(message)
{
    document.getElementById("console").innerText += message + "\n";
}

function tryExecuteSql(transaction, parameterList)
{
    try {
        eval('transaction.executeSql(' + parameterList + ')');
        return null;
    } catch (exception) {
        return exception;
    }
}

function runTransactionTest(transaction, parameterList, expectException)
{
    var exception = tryExecuteSql(transaction, parameterList);
    if (expectException) {
        if (exception)
            writeMessageToLog("PASS. executeSql(" + parameterList + ") threw an exception as expected: " + exception);
        else
            writeMessageToLog("*FAIL*. executeSql(" + parameterList + ") did not throw an exception");
    } else {
        if (exception)
            writeMessageToLog("*FAIL*. executeSql(" + parameterList + ") threw an exception: " + exception);
        else
            writeMessageToLog("PASS. executeSql(" + parameterList + ") did not throw an exception");
    }
}

function runTransactionTests(transaction)
{
    for (i in expectNoException)
        runTransactionTest(transaction, expectNoException[i], false);
    for (i in expectException)
        runTransactionTest(transaction, expectException[i], true);

    if (window.layoutTestController)
        layoutTestController.notifyDone();
}

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

    var db = openDatabase("ExecuteSQLArgsTest", "1.0", "Test of handling of the arguments to SQLTransaction.executeSql", 1);
    db.transaction(runTransactionTests);
}

</script>
</head>

<body onload="runTest()">
<pre id="console"></pre>
</body>

</html>
