// 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 [\'\ ']');
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet am 2026-11-08)
¤
*© Formatika GbR, Deutschland
|
|