<!DOCTYPE html>
<meta charset="utf-8">
<title>Verify key sort order in an index is 'number &lt; Date &lt; DOMString' </title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
    var db,
      d = new Date(),
      t = async_test(),
      records = [ { foo: d },
                  { foo: "test" },
                  { foo: 1 },
                  { foo: 2.55 }  ],
      expectedKeyOrder = [ 1, 2.55, d.valueOf(), "test" ];

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("store", { autoIncrement: true });
        objStore.createIndex("index", "foo");

        for (var i = 0; i < records.length; i++)
            objStore.add(records[i]);
    };

    open_rq.onsuccess = function(e) {
        var actual_keys = [],
          rq = db.transaction("store")
                 .objectStore("store")
                 .index("index")
                 .openCursor();

        rq.onsuccess = t.step_func(function(e) {
            var cursor = e.target.result;

            if (cursor) {
                actual_keys.push(cursor.key.valueOf());
                cursor.continue();
            }
            else {
                assert_array_equals(actual_keys, expectedKeyOrder);
                t.done();
            }
        });
    };
</script>

<div id="log"></div>
