description("This tests basic IDBCursor functionality");

indexedDBTest(prepareDatabase);


function done()
{
    finishJSTest();
}

function log(message)
{
    debug(message);
}

function logCursor(cursor)
{
    debug("Cursor is: " + cursor);
    debug("Cursor direction is: " + cursor.direction);
    debug("Cursor source is: " + cursor.source + " (" + cursor.source.name + ")");    
    debug("Cursor key is: " + cursor.key);    
    debug("Cursor primary key is: " + cursor.primaryKey);    
}

function setupRequest(request)
{
    // FIXME: Right now (until https://bugs.webkit.org/show_bug.cgi?id=151196 is resolved) what should be successful cursor operations will actually always fail.
    request.onsuccess = function() {
        debug("Success opening cursor");
        logCursor(request.result);  
    }
    request.onerror = function(e) {
        debug("Error opening cursor (expected for now)");
        logCursor(request.result);
        e.stopPropagation();
    } 
}

var objectStore;
var index;

function testCursorDirection(direction)
{
    var range = IDBKeyRange.lowerBound(-Infinity);
    var request = objectStore.openCursor(range, direction);
    setupRequest(request);
    request = objectStore.openKeyCursor(range, direction);
    setupRequest(request);
    request = index.openCursor(range, direction);
    setupRequest(request);
    request = index.openKeyCursor(range, direction);
    setupRequest(request);
}

function prepareDatabase(event)
{
    debug("Initial upgrade needed: Old version - " + event.oldVersion + " New version - " + event.newVersion);

    var versionTransaction = event.target.transaction;
    var database = event.target.result;
    objectStore = database.createObjectStore("TestObjectStore");
    index = objectStore.createIndex("TestIndex1", "bar");

    for (var i = 0; i < 10; ++i) {
        objectStore.put("Record " + i, i);
    }
    objectStore.put({ bar: "Hello" }, "foo");

    testCursorDirection("next");
    testCursorDirection("nextunique");
    testCursorDirection("prev");
    testCursorDirection("prevunique");
      
    versionTransaction.onabort = function(event) {
        debug("Initial upgrade versionchange transaction unexpected aborted");
        done();
    }

    versionTransaction.oncomplete = function(event) {
        debug("Initial upgrade versionchange transaction complete");
        done();
    }

    versionTransaction.onerror = function(event) {
        debug("Initial upgrade versionchange transaction unexpected error" + event);
        done();
    }
}
