/**
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

if (!this.window) {
  this.runTest = function() {
    todo(false, "Test disabled in xpcshell test suite for now");
    finishTest();
  }
}

var testGenerator = testSteps();

function testSteps()
{
  const name = this.window ? window.location.pathname : "Splendid Test";
  const osName = "foo";

  let request = indexedDB.open(name, 1);
  request.onerror = errorHandler;
  request.onupgradeneeded = grabEventAndContinueHandler;
  request.onsuccess = grabEventAndContinueHandler;
  let event = yield;

  let db = event.target.result;
  is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");

  db.createObjectStore(osName, { autoIncrement: "true" });

  yield;

  let key1, key2;

  request = db.transaction([osName], "readwrite")
              .objectStore(osName)
              .add({});
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    key1 = event.target.result;
    testGenerator.next();
  }
  yield;

  request = db.transaction(osName, "readwrite").objectStore(osName).add({});
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    key2 = event.target.result;
    testGenerator.next();
  }
  yield;

  request = db.transaction([osName], "readwrite")
              .objectStore(osName)
              .put({}, key1);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  request = db.transaction(osName, "readwrite")
              .objectStore(osName)
              .put({}, key2);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  request = db.transaction([osName], "readwrite")
              .objectStore(osName)
              .put({}, key1);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  request = db.transaction(osName, "readwrite")
              .objectStore(osName)
              .put({}, key1);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  request = db.transaction([osName], "readwrite")
              .objectStore(osName)
              .delete(key1);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  request = db.transaction(osName, "readwrite")
              .objectStore(osName)
              .delete(key2);
  request.onerror = errorHandler;
  request.onsuccess = function(event) {
    is(event.target.transaction.mode, "readwrite", "Correct mode");
    testGenerator.next();
  }
  yield;

  try {
    request = db.transaction([osName]).objectStore(osName).add({});
    ok(false, "Adding to a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Adding to a readonly transaction failed");
  }

  try {
    request = db.transaction(osName).objectStore(osName).add({});
    ok(false, "Adding to a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Adding to a readonly transaction failed");
  }

  try {
    request = db.transaction([osName]).objectStore(osName).put({});
    ok(false, "Adding or modifying a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Adding or modifying a readonly transaction failed");
  }

  try {
    request = db.transaction(osName).objectStore(osName).put({});
    ok(false, "Adding or modifying a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Adding or modifying a readonly transaction failed");
  }

  try {
    request = db.transaction([osName]).objectStore(osName).put({}, key1);
    ok(false, "Modifying a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Modifying a readonly transaction failed");
  }

  try {
    request = db.transaction(osName).objectStore(osName).put({}, key1);
    ok(false, "Modifying a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Modifying a readonly transaction failed");
  }

  try {
    request = db.transaction([osName]).objectStore(osName).delete(key1);
    ok(false, "Removing from a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Removing from a readonly transaction failed");
  }

  try {
    request = db.transaction(osName).objectStore(osName).delete(key2);
    ok(false, "Removing from a readonly transaction should fail!");
  }
  catch (e) {
    ok(true, "Removing from a readonly transaction failed");
  }

  finishTest();
  yield;
}
