// META: global=window,worker
// META: title=Keypath
// META: script=resources/support.js
// Spec:
// http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-path-construct
'use strict' ;
let global_db = createdb_for_multiple_tests();
function keypath(keypath, objects, expected_keys, desc) {
let db;
let t = async_test(self.title +
' - ' + (desc ? desc : keypath));
let store_name =
'store-' + (Date.now()) + Math.random();
let open_rq = global_db.setTest(t);
open_rq.onupgradeneeded =
function (e) {
db = e.target.result;
let objStore = db.createObjectStore(store_name, {keyPath: keypath});
for (let i = 0; i < objects.length; i++)
objStore.add(objects[i]);
};
open_rq.onsuccess =
function (e) {
let actual_keys = [];
let rq = db.transaction(store_name).objectStore(store_name).openCursor();
rq.onsuccess = t.step_func(
function (e) {
let 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 ) {
let myblob = Blob([
'Yoda' ], {type:
'suprawsum' });
keypath(
[
'length' ,
'type' ], [myblob], [4,
'suprawsum' ],
'[Blob.length, Blob.type]' );
}
// File.name and File.lastModified 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' ]]);
keypath(
[
'type' ],
[{name:
'orange' , type:
'fruit' }, {name:
'cucumber' , type:
'vegetable' }],
[[
'fruit' ], [
'vegetable' ]],
'list with 1 field' );
let loop_array = [];
loop_array.push(loop_array);
keypath(
loop_array, [
'a' , 1, [
'k' ]], [[1], [
'a' ], [[
'k' ]]],
'array loop -> stringify becomes [\' \
']' );
Messung V0.5 C=95 H=87 G=90
¤ Dauer der Verarbeitung: 0.6 Sekunden
¤
*© Formatika GbR, Deutschland