/// <reference path="../src/local-indexeddb.js" />
/// <reference path="common/djstest.js" />

// store-indexeddb-tests.js

(function (window, undefined) {
    // DATAJS INTERNAL START
    var unexpectedSuccess = function (key, value) {
        djstest.fail("Unexpected call to success handler: key = " + key + ", value = " + value);
        djstest.done();
    };

    var unexpectedError = function (e) {
        djstest.fail("Unexpected call to error handler: " + djstest.toString(e));
        djstest.done();
    };

    var storeCounter = 0;
    var storeName = "test";

    var getNextStoreName = function () {
        storeCounter++;
        return getCurrentStoreName();
    };

    var getCurrentStoreName = function(){
        return storeName + storeCounter;
    };

    var oldWindowOnError;

    if (djstest.indexedDB) {
        module("Unit", {
            setup: function () {
                djstest.wait(function (done) {
                    djstest.cleanStoreOnIndexedDb([{ name: getNextStoreName() }], done);
                });

                // FireFox 7.0.1 bubbles an error event when there is an IndexedDB error, even when the error has been handled graciously.
                // This is a work around to keep QUnit from reporting false failures in IndexedDB negative tests.
                oldWindowOnError = window.onerror;
                window.onerror = null;
            },
            teardown: function () {
                var store = this.store;
                if (store) {
                    store.close();
                }

                djstest.wait(function (done) {
                    djstest.cleanStoreOnIndexedDb([store], done);
                });


                // Restore QUnit's onerror handler.
                window.onerror = oldWindowOnError;
            }
        });

        djstest.addTest(function testIndexedDBStoreConstructor() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            djstest.assertAreEqual(store.name, getCurrentStoreName());
            djstest.assertAreEqual(store.mechanism, "indexeddb");
            djstest.done();
        });

        djstest.addTest(function testIndexedDBStoreAddGet() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                djstest.assertAreEqual(key, "key");
                djstest.assertAreEqual(value, "value");
                store.read("key", function (key, value) {
                    djstest.assertAreEqual(key, "key");
                    djstest.assertAreEqual(value, "value");
                    djstest.done();
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddUpdateGet() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.update("key", "value2", function (key, value) {
                    djstest.assertAreEqual(key, "key");
                    djstest.assertAreEqual(value, "value2");
                    store.read("key", function (key, value) {
                        djstest.assertAreEqual(key, "key");
                        djstest.assertAreEqual(value, "value2");
                        djstest.done();
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddOrUpdateGet() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.addOrUpdate("key", "value", function (key, value) {
                djstest.assertAreEqual(key, "key");
                djstest.assertAreEqual(value, "value");
                store.addOrUpdate("key", "value2", function (key, value) {
                    djstest.assertAreEqual(key, "key");
                    djstest.assertAreEqual(value, "value2");
                    store.read("key", function (key, value) {
                        djstest.assertAreEqual(key, "key");
                        djstest.assertAreEqual(value, "value2");
                        djstest.done();
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddRemoveContains() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.contains("key", function (result) {
                    djstest.assert(result);
                    store.remove("key", function () {
                        djstest.pass("key removed");
                        store.contains("key", function (result) {
                            djstest.assert(!result);
                            djstest.done();
                        }, unexpectedError);
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddConsecutiveGetAllKeys() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.add("key2", "value2", function (key, value) {
                    store.add("key3", "value3", function (key, value) {
                        store.getAllKeys(function (keys) {
                            djstest.assertAreEqualDeep(keys, ["key", "key2", "key3"]);
                            djstest.done();
                        }, unexpectedError);
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddArrayClear() {
            var addedKeys = ["key", "key2", "key3"];
            var addedValues = ["value", "value2", "value3"];
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add(addedKeys, addedValues, function (keys, values) {
                djstest.assertAreEqualDeep(keys, addedKeys);
                djstest.assertAreEqualDeep(values, addedValues);
                store.clear(function () {
                    store.getAllKeys(function (keys) {
                        djstest.assertAreEqualDeep(keys, []);
                        djstest.done();
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddArrayUpdateArrayGetArray() {
            var addedKeys = ["key", "key2", "key3"];
            var addedValues = ["value", "value2", "value3"];
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add(addedKeys, addedValues, function (keys, values) {
                djstest.assertAreEqualDeep(keys, addedKeys);
                djstest.assertAreEqualDeep(values, addedValues);
                var updatedKeys = ["key", "key3"];
                var updatedValues = ["newValue", "newValue3"];
                store.update(updatedKeys, updatedValues, function (keys, values) {
                    djstest.assertAreEqualDeep(keys, updatedKeys);
                    djstest.assertAreEqualDeep(values, updatedValues);
                    store.read(addedKeys, function (keys, values) {
                        djstest.assertAreEqualDeep(keys, ["key", "key2", "key3"]);
                        djstest.assertAreEqualDeep(values, ["newValue", "value2", "newValue3"]);
                        djstest.done();
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddOrUpdateArrayGetArray() {
            var expectedKeys = ["key", "key2", "key3"];
            var expectedValues = ["value", "value2", "value3"];
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key2", "value", function (key, value) {
                store.addOrUpdate(expectedKeys, expectedValues, function (keys, values) {
                    djstest.assertAreEqualDeep(keys, expectedKeys);
                    djstest.assertAreEqualDeep(values, expectedValues);
                    store.read(keys, function (keys, values) {
                        djstest.assertAreEqualDeep(values, expectedValues);
                        djstest.done();
                    }, unexpectedError);
                }, unexpectedError);
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddDuplicate() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.add("key", "value2", unexpectedSuccess, function (err) {
                    djstest.pass("Error callback called as expected");
                    djstest.done();
                });
            }, unexpectedError);
        });

        djstest.addTest(function testIndexedDBStoreAddArrayDuplicate() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add(["key", "key2", "key"], ["value", "value2", "value3"], unexpectedSuccess, function (err) {
                djstest.pass("Error callback called as expected");
                djstest.done();
            });
        });

        djstest.addTest(function testIndexedDBStoreGetArrayNonExistent() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.read(["key", "badkey"], function (keys, values) {
                    djstest.assertAreEqualDeep(keys, ["key", "badkey"]);
                    djstest.assertAreEqualDeep(values, ["value", undefined]);
                    djstest.done();
                }, unexpectedError);
            });
        });

        djstest.addTest(function testIndexedDBStoreUpdateNonExistent() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.update("badkey", "badvalue", unexpectedSuccess, function (err) {
                djstest.pass("Error callback called as expected");
                djstest.done();
            });
        });

        djstest.addTest(function testIndexedDBStoreUpdateArrayNonExistent() {
            var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
            store.add("key", "value", function (key, value) {
                store.update(["key", "badkey"], ["value", "badvalue"], unexpectedSuccess, function (err) {
                    djstest.pass("Error callback called as expected");
                    store.read("key", function (key, value) {
                        djstest.assertAreEqual(value, "value", "value was not changed");
                        djstest.done();
                    }), unexpectedError;
                });
            }, unexpectedError);
        });
    }
    // DATAJS INTERNAL END
})(this);