<!DOCTYPE html>
<title>IndexedDB: Exception Order of IDBObjectStore.createIndex()</title>
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="http://w3c.github.io/IndexedDB/#dom-idbobjectstore-createindex">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

indexeddb_test(
    function(t, db, txn) {
        var store = db.createObjectStore("s");
    },
    function(t, db) {
        var txn = db.transaction("s");
        var store = txn.objectStore("s");
        txn.oncomplete = function() {
            assert_throws("InvalidStateError", function() {
                store.createIndex("index", "foo");
            }, "Mode check should precede state check of the transaction");
            t.done();
        };
    },
    "InvalidStateError(Incorrect mode) vs. TransactionInactiveError"
);

var gDeletedObjectStore;
indexeddb_test(
    function(t, db, txn) {
        gDeletedObjectStore = db.createObjectStore("s");
        db.deleteObjectStore("s");
        txn.oncomplete = function() {
            assert_throws("InvalidStateError", function() {
                gDeletedObjectStore.createIndex("index", "foo");
            }, "Deletion check should precede transaction-state check");
            t.done();
        };
    },
    null,
    "InvalidStateError(Deleted ObjectStore) vs. TransactionInactiveError"
);

indexeddb_test(
    function(t, db, txn) {
        var store = db.createObjectStore("s");
        store.createIndex("index", "foo");
        txn.oncomplete = function() {
            assert_throws("TransactionInactiveError", function() {
                store.createIndex("index", "foo");
            }, "Transaction-state check should precede index name check");
            t.done();
        };
    },
    null,
    "TransactionInactiveError vs. ConstraintError"
);

indexeddb_test(
    function(t, db) {
        var store = db.createObjectStore("s");
        store.createIndex("index", "foo");
        assert_throws("ConstraintError", function() {
            store.createIndex("index", "invalid key path");
        }, "Index name check should precede syntax check of the key path");
        assert_throws("ConstraintError", function() {
            store.createIndex("index",
                              ["invalid key path 1", "invalid key path 2"]);
        }, "Index name check should precede syntax check of the key path");
        t.done();
    },
    null,
    "ConstraintError vs. SyntaxError"
);

indexeddb_test(
    function(t, db) {
        var store = db.createObjectStore("s");
        assert_throws("SyntaxError", function() {
            store.createIndex("index",
                              ["invalid key path 1", "invalid key path 2"],
                              { multiEntry: true });
        }, "Syntax check should precede multiEntry check of the key path");
        t.done();
    },
    null,
    "SyntaxError vs. InvalidAccessError"
);

</script>
