<html>
<head>
<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
<script src="../../fast/js/resources/js-test-pre.js"></script>
<script src="../../fast/js/resources/js-test-post-function.js"></script>
<script src="resources/shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>

description("Test the basics of IndexedDB's IDBObjectStore.");
if (window.layoutTestController) 
    layoutTestController.waitUntilDone();

function test()
{
    request = evalAndLog("webkitIndexedDB.open('objectstore-basics')");
    request.onsuccess = openSuccess;
    request.onerror = unexpectedErrorCallback;
}

function openSuccess()
{
    debug("openSuccess():");
    window.db = evalAndLog("db = event.target.result");

    request = evalAndLog("db.setVersion('new version')");
    request.onsuccess = setVersionSuccess;
    request.onerror = unexpectedErrorCallback;
}

function setVersionSuccess()
{
    debug("setVersionSuccess():");
    window.trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.onabort = unexpectedAbortCallback;

    deleteAllObjectStores(db);

    debug("createObjectStore():");
    window.store = evalAndLog("store = db.createObjectStore('storeName', null)");
    var storeNames = evalAndLog("storeNames = db.objectStoreNames");

    shouldBeEqualToString("store.name", "storeName");
    shouldBeNull("store.keyPath");
    shouldBe("storeNames.contains('storeName')", "true");
    shouldBe("storeNames.length", "1");
    // FIXME: test all of object store's methods.

    debug("Ask for an index that doesn't exist:");
    try {
        debug("index = store.index('asdf')");
        index = store.index('asdf');
        testFailed("Asking for a store that doesn't exist should have thrown.");
    } catch (err) {
        testPassed("Exception thrown.");
        code = err.code;
        shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
    }

    createIndex();
}

function createIndex()
{
    debug("createIndex():");
    var index = evalAndLog("index = store.createIndex('indexName', 'x', {unique: true})"); // true == unique requirement.
    shouldBeTrue("index !== null");
    shouldBeTrue("store.indexNames.contains('indexName')");
    index = evalAndLog("index = store.index('indexName')");
    shouldBeTrue("index !== null");
 
    debug("Ask for an index that doesn't exist:");
    try {
        debug("index = store.index('asdf')");
        index = store.index('asdf');
        testFailed("Asking for a store that doesn't exist should have thrown.");
    } catch (err) {
        testPassed("Exception thrown.");
        code = err.code
        shouldBe("code", "webkitIDBDatabaseException.NOT_FOUND_ERR");
    }

    commitAndContinue();    
}

function commitAndContinue()
{
    window.setTimeout(testSetVersionAbort, 0);
}

function testSetVersionAbort()
{
    request = evalAndLog('db.setVersion("version fail")');
    request.onsuccess = createAnotherIndex;
    request.onerror = unexpectedErrorCallback;
}

function createAnotherIndex()
{
    shouldBeEqualToString("db.version", "version fail");

    var setVersionTrans = evalAndLog("setVersionTrans = event.target.result");
    shouldBeTrue("setVersionTrans !== null");
    setVersionTrans.oncomplete = unexpectedCompleteCallback;
    setVersionTrans.onabort = checkMetadata;
    window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x')");

    setVersionTrans.abort();
}

function checkMetadata()
{
    shouldBeEqualToString("db.version", "new version");
    shouldBe("store.indexNames", "['indexName']");
    shouldBe("store.indexNames.length", "1");
    shouldBe("store.indexNames.contains('')", "false");
    shouldBe("store.indexNames.contains('indexFail')", "false");
    shouldBe("store.indexNames.contains('indexName')", "true");
    shouldBeEqualToString("store.indexNames[0]", "indexName");
    shouldBeNull("store.indexNames[1]");
    shouldBeNull("store.indexNames[100]");
    shouldBeNull("store.indexNames.item(1)");
    shouldBeNull("store.indexNames.item(100)");
    addData();
}

var testDate = new Date("August 25, 1991 20:57:08");
var testDateB = new Date("Wed Jan 05 2011 15:54:49");

function addData()
{
    var transaction = evalAndLog("transaction = db.transaction([], webkitIDBTransaction.READ_WRITE)");
    transaction.onabort = unexpectedAbortCallback;
    window.store = evalAndLog("store = transaction.objectStore('storeName')");

    debug("Try to insert data with a Date key:");
    request = evalAndLog("store.add({x: 'foo'}, testDate)");
    request.onsuccess = addDateSuccess;
    request.onerror = unexpectedErrorCallback;
}

function addDateSuccess()
{
    debug("Try to insert a value not handled by structured clone:");
    try {
        debug("store.add({x: 'bar', y: document.getElementById('console')}, 'bar')");
        store.add({x: 'bar', y: document.getElementById('console')}, 'bar');
        testFailed("Passing a DOM node as value should have thrown.");
    } catch (err) {
        testPassed("Exception thrown");
        code = err.code;
        shouldBe("code", "DOMException.NOT_SUPPORTED_ERR");
    }

    debug("Try to insert data where key path yields a Date key:");
    request = evalAndLog("store.add({x: testDateB, y: 'value'}, 'key')");
    request.onsuccess = addSuccess;
    request.onerror = unexpectedErrorCallback;
}

function addSuccess()
{
    debug("addSuccess():");
    shouldBeEqualToString("event.target.result", "key");

    request = evalAndLog("event.target.source.add({x: 'foo'}, 'zzz')");
    request.onsuccess = unexpectedSuccessCallback;
    request.addEventListener('error', addAgainFailure, false);
}

function addAgainFailure()
{
    debug("addAgainFailure():");
    // FIXME: This error code needs to be specced.
    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.UNKNOWN_ERR");

    evalAndLog("event.preventDefault()");

    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
    transaction.onabort = unexpectedErrorCallback;
    var store = evalAndLog("store = transaction.objectStore('storeName')");

    request = evalAndLog("store.add({x: 'othervalue'}, null)");
    request.onsuccess = unexpectedSuccessCallback;
    request.addEventListener('error', addWithNullKeyFailure, true);
}

function addWithNullKeyFailure()
{
    debug("addWithNullKeyFailre():");
    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");

    evalAndLog("event.preventDefault()");

    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
    transaction.onabort = unexpectedErrorCallback;
    var store = evalAndLog("store = transaction.objectStore('storeName')");

    request = evalAndLog("store.add({x: null}, 'validkey')");
    request.onsuccess = unexpectedSuccessCallback;
    request.onerror = addWithNullIndexFailure;
}

function addWithNullIndexFailure()
{
    shouldBeTrue("event.cancelable");
    debug("addWithNullIndexFailure():");
    shouldBe("event.target.errorCode", "webkitIDBDatabaseException.DATA_ERR");

    evalAndLog("event.preventDefault()");

    transaction = evalAndLog("db.transaction([], webkitIDBTransaction.READ_WRITE)");
    transaction.onabort = unexpectedErrorCallback;
    var store = evalAndLog("store = transaction.objectStore('storeName')");

    request = evalAndLog("store.get('key')");
    request.addEventListener('success', getSuccess, true);
    request.onerror = unexpectedErrorCallback;
}

function getSuccess()
{
    debug("getSuccess():");
    shouldBeEqualToString("event.target.result.y", "value");

    var store = evalAndLog("store = event.target.source");
    request = evalAndLog("store.get(testDate)");
    request.addEventListener('success', getSuccessDateKey, false);
    request.onerror = unexpectedErrorCallback;
}

function getSuccessDateKey()
{
    debug("getSuccessDateKey():");
    shouldBeEqualToString("event.target.result.x", "foo");

    request = evalAndLog("store.delete('key')");
    request.onsuccess = removeSuccess;
    request.onerror = unexpectedErrorCallback;
}

function removeSuccess()
{
    debug("removeSuccess():");
    shouldBeNull("event.target.result");
    var store = evalAndLog("store = event.target.source");

    try {
        debug("Passing an invalid key into store.get().");
        store.get([]);
        testFailed("No exception thrown");
    } catch (e) {
        testPassed("Caught exception: " + e.toString());
    }

    try {
        debug("Passing an invalid key into store.delete().");
        store.delete([]);
        testFailed("No exception thrown");
    } catch (e) {
        testPassed("Caught exception: " + e.toString());
    }

    try {
        debug("Passing an invalid key into store.add().");
        store.add(null, []);
        testFailed("No exception thrown");
    } catch (e) {
        testPassed("Caught exception: " + e.toString());
    }

    try {
        debug("Passing an invalid key into store.put().");
        store.put(null, []);
        testFailed("No exception thrown");
    } catch (e) {
        testPassed("Caught exception: " + e.toString());
    }

    done();
}

test();

var successfullyParsed = true;

</script>
</body>
</html>
