<!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>
