<!--
Test converted from WebKit:
http://trac.webkit.org/browser/trunk/LayoutTests/storage/indexeddb/resources/list-ordering.js
-->

<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<meta charset=utf-8>
<title>Test string list ordering in IndexedDB</title>
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#widl-IDBDatabase-objectStoreNames">
<link rel=assert title="The list must be sorted in ascending order using the algorithm defined by step 4 of section 11.8.5, The Abstract Relational Comparison Algorithm of the ECMAScript Language Specification [ECMA-262].">
<link rel=author href="mailto:romain.huet@gmail.com" title="Romain Huet">

<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=support.js></script>

<script>

    var expectedOrder = [
        "",
        "\x00", // 'NULL' (U+0000)
        "0",
        "1",
        "A",
        "B",
        "a",
        "b",
        "\x7F", // 'DELETE' (U+007F)
        "\xC0", // 'LATIN CAPITAL LETTER A WITH GRAVE' (U+00C0)
        "\xC1", // 'LATIN CAPITAL LETTER A WITH ACUTE' (U+00C1)
        "\xE0", // 'LATIN SMALL LETTER A WITH GRAVE' (U+00E0)
        "\xE1", // 'LATIN SMALL LETTER A WITH ACUTE' (U+00E1)
        "\xFF", // 'LATIN SMALL LETTER Y WITH DIAERESIS' (U+00FF)
        "\u0100", // 'LATIN CAPITAL LETTER A WITH MACRON' (U+0100)
        "\u1000", // 'MYANMAR LETTER KA' (U+1000)
        "\uD834\uDD1E", // 'MUSICAL SYMBOL G-CLEF' (U+1D11E), UTF-16 surrogate pairs
        "\uFFFD" // 'REPLACEMENT CHARACTER' (U+FFFD)
    ];

    var i, tmp, permutedOrder = expectedOrder.slice();
    permutedOrder.reverse();
    for (i = 0; i < permutedOrder.length - 2; i += 2) {
        tmp = permutedOrder[i];
        permutedOrder[i] = permutedOrder[i + 1];
        permutedOrder[i + 1] = tmp;
    }

    var objStore, db;
    var t = async_test();

    // Check that the expected order is the canonical JS sort order.
    var sortedOrder = expectedOrder.slice();
    sortedOrder.sort();
    assert_array_equals(sortedOrder, expectedOrder);

    var request = createdb(t);

    request.onupgradeneeded = function(e) {
        db = e.target.result;

        // Object stores.
        for (var i = 0; i < permutedOrder.length; i++) {
            objStore = db.createObjectStore(permutedOrder[i]);
        }
        assert_array_equals(db.objectStoreNames, expectedOrder);

        // Indexes.
        for (var i = 0; i < permutedOrder.length; i++) {
            objStore.createIndex(permutedOrder[i], "keyPath");
        }
        assert_array_equals(objStore.indexNames, expectedOrder);
    };

    request.onsuccess = function(e) {
        // Object stores.
        assert_array_equals(db.objectStoreNames, expectedOrder);
        // Indexes.
        assert_array_equals(objStore.indexNames, expectedOrder);
        t.done();
    };

</script>

<div id=log></div>
