<!DOCTYPE html>
<!-- Submitted from TestTWF Paris -->
<meta charset="utf-8">
<title>Keypath</title>
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-path-construct">
<link rel=assert title="A key path is a DOMString that defines how to extract a key from a value. A valid key path is either the empty string, a JavaScript identifier, or multiple Javascript identifiers separated by periods (ASCII character code 46) [ECMA-262].">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var global_db = createdb_for_multiple_tests();

    function keypath(keypath, objects, expected_keys, desc) {
        var db,
            t = async_test(document.title + " - " + (desc ? desc : keypath)),

            store_name = "store-"+(Date.now())+Math.random();

        var open_rq = global_db.setTest(t);
        open_rq.onupgradeneeded = function(e) {
            db = e.target.result;
            var objStore = db.createObjectStore(store_name, { keyPath: keypath });

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

        open_rq.onsuccess = function(e) {
            var actual_keys = [],
              rq = db.transaction(store_name)
                     .objectStore(store_name)
                     .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_key_equals(actual_keys, expected_keys, "keyorder array");
                    t.done();
                }
            });
        };
    }

    keypath('my.key',
        [ { my: { key: 10 } } ],
        [ 10 ]);

    keypath('my.køi',
        [ { my: { køi: 5 } } ],
        [ 5 ]);

    keypath('my.key_ya',
        [ { my: { key_ya: 10 } } ],
        [ 10 ]);

    keypath('public.key$ya',
        [ { public: { key$ya: 10 } } ],
        [ 10 ]);

    keypath('true.$',
        [ { true: { $: 10 } } ],
        [ 10 ]);

    keypath('my._',
        [ { my: { _: 10 } } ],
        [ 10 ]);

    keypath('delete.a7',
        [ { delete: { a7: 10 } } ],
        [ 10 ]);

    keypath('p.p.p.p.p.p.p.p.p.p.p.p.p.p',
        [ {p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:10}}}}}}}}}}}}}} ],
        [ 10 ]);

    keypath('str.length',
        [ { str: "pony" }, { str: "my" }, { str: "little" }, { str: "" } ],
        [ 0, 2, 4, 6 ]);

    keypath('arr.length',
        [ {arr: [0, 0, 0, 0]}, {arr: [{}, 0, "hei", "length", Infinity, []]}, {arr: [10, 10]}, { arr: []} ],
        [ 0, 2, 4, 6 ]);

    keypath('length',
        [ [10, 10], "123", { length: 20 } ],
        [ 2, 3, 20 ]);

    keypath('',
        [ ["bags"], "bean", 10 ],
        [ 10, "bean", ["bags"] ],
        "'' uses value as key");

    keypath([''],
        [ ["bags"], "bean", 10 ],
        [ [10], ["bean"] , [["bags"]] ],
        "[''] uses value as [key]");

    keypath(['x', 'y'],
        [ {x:10, y:20}, {y:1.337, x:100} ],
        [ [10, 20], [100, 1.337] ],
        "['x', 'y']");

    keypath([['x'], ['y']],
        [ {x:10, y:20}, {y:1.337, x:100} ],
        [ [10, 20], [100, 1.337] ],
        "[['x'], 'y'] (stringifies)");

    keypath(['x', {toString:function(){return 'y'}}],
        [ {x:10, y:20}, {y:1.337, x:100} ],
        [ [10, 20], [100, 1.337] ],
        "['x', {toString->'y'}] (stringifies)");

    if (false) {
        var myblob = Blob(["Yoda"], {type:'suprawsum'});
        keypath(['length', 'type'],
            [ myblob ],
            [ 4, 'suprawsum' ],
            "[Blob.length, Blob.type]");
    }

    // File.name and File.lastModifiedDate is not testable automatically

    keypath(['name', 'type'],
        [ { name: "orange", type: "fruit" }, { name: "orange", type: ["telecom", "french"] } ],
        [ ["orange", "fruit"], ["orange", ["telecom", "french"]] ]);

    keypath(['name', 'type.name'],
        [ { name: "orange", type: { name: "fruit" }}, { name: "orange", type: { name: "telecom" }} ],
        [ ["orange", "fruit"], ["orange", "telecom" ] ]);

    loop_array = [];
    loop_array.push(loop_array);
    keypath(loop_array,
        [ "a", 1, ["k"] ],
        [ [1], ["a"], [["k"]] ],
        "array loop -> stringify becomes ['']");
</script>

<div id=log></div>
