<!DOCTYPE html>
<html>
<body>
<script src="../../resources/runner.js"></script>
<script>

const numberOfIterations = 20;
const numberOfItems = 5000;

// Delete database(s) for the test ahead of time.
var databaseName = "index-count-DB";
indexedDB.deleteDatabase(databaseName).onsuccess = function() {
    startIteration();
}

var testGenerator = null;
var db = null;

PerfTestRunner.prepareToMeasureValuesAsync({
    customIterationCount: numberOfIterations,
    unit: 'ms',
    done: function () {
        transaction = null;
        db = null;
        PerfTestRunner.gc();
    }
});

function startIteration()
{
    testGenerator = runIteration();
    nextStep();
}

function nextStep()
{
    testGenerator.next();
}

function *runIteration()
{
    var openRequest = indexedDB.open(databaseName);
    openRequest.onupgradeneeded = function(event) {
        db = event.target.result;
        var objectStore = db.createObjectStore('store');
        objectStore.createIndex('index', 'indexKey');
        for (var i = 0; i < numberOfItems; i++)
           objectStore.put( { value: 'value', indexKey: "index" + i }, i);
    }
    openRequest.onsuccess = nextStep;

    yield;

    var startTime = PerfTestRunner.now();

    var index = db.transaction('store').objectStore('store').index('index');
    var completedCounts = 0;
    for (var i = 0; i < numberOfItems; i++)
    {
        index.count('index' + i).onsuccess = function (event) {
            if (event.target.result != 1)
                alert("Expected 1 item for key index" + i);

            if (++completedCounts == numberOfItems)
                nextStep();
        };
    }

    yield;

    if (!PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime))
        return;

    setTimeout(startIteration, 0);
}
</script>
</body>
</html>
