1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/unit/test_multientry.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,219 @@ 1.4 +/** 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +var testGenerator = testSteps(); 1.10 + 1.11 +function testSteps() 1.12 +{ 1.13 + // Test object stores 1.14 + 1.15 + let name = this.window ? window.location.pathname : "Splendid Test"; 1.16 + let openRequest = indexedDB.open(name, 1); 1.17 + openRequest.onerror = errorHandler; 1.18 + openRequest.onupgradeneeded = grabEventAndContinueHandler; 1.19 + openRequest.onsuccess = unexpectedSuccessHandler; 1.20 + let event = yield undefined; 1.21 + let db = event.target.result; 1.22 + db.onerror = errorHandler; 1.23 + let tests = 1.24 + [{ add: { x: 1, id: 1 }, 1.25 + indexes:[{ v: 1, k: 1 }] }, 1.26 + { add: { x: [2, 3], id: 2 }, 1.27 + indexes:[{ v: 1, k: 1 }, 1.28 + { v: 2, k: 2 }, 1.29 + { v: 3, k: 2 }] }, 1.30 + { put: { x: [2, 4], id: 1 }, 1.31 + indexes:[{ v: 2, k: 1 }, 1.32 + { v: 2, k: 2 }, 1.33 + { v: 3, k: 2 }, 1.34 + { v: 4, k: 1 }] }, 1.35 + { add: { x: [5, 6, 5, -2, 3], id: 3 }, 1.36 + indexes:[{ v:-2, k: 3 }, 1.37 + { v: 2, k: 1 }, 1.38 + { v: 2, k: 2 }, 1.39 + { v: 3, k: 2 }, 1.40 + { v: 3, k: 3 }, 1.41 + { v: 4, k: 1 }, 1.42 + { v: 5, k: 3 }, 1.43 + { v: 6, k: 3 }] }, 1.44 + { delete: IDBKeyRange.bound(1, 3), 1.45 + indexes:[] }, 1.46 + { put: { x: ["food", {}, false, undefined, /x/, [73, false]], id: 2 }, 1.47 + indexes:[{ v: "food", k: 2 }] }, 1.48 + { add: { x: [{}, /x/, -12, "food", null, [false], undefined], id: 3 }, 1.49 + indexes:[{ v: -12, k: 3 }, 1.50 + { v: "food", k: 2 }, 1.51 + { v: "food", k: 3 }] }, 1.52 + { put: { x: [], id: 2 }, 1.53 + indexes:[{ v: -12, k: 3 }, 1.54 + { v: "food", k: 3 }] }, 1.55 + { put: { x: { y: 3 }, id: 3 }, 1.56 + indexes:[] }, 1.57 + { add: { x: false, id: 7 }, 1.58 + indexes:[] }, 1.59 + { delete: IDBKeyRange.lowerBound(0), 1.60 + indexes:[] }, 1.61 + ]; 1.62 + 1.63 + let store = db.createObjectStore("mystore", { keyPath: "id" }); 1.64 + let index = store.createIndex("myindex", "x", { multiEntry: true }); 1.65 + is(index.multiEntry, true, "index created with multiEntry"); 1.66 + 1.67 + let i; 1.68 + for (i = 0; i < tests.length; ++i) { 1.69 + let test = tests[i]; 1.70 + let testName = " for " + JSON.stringify(test); 1.71 + let req; 1.72 + if (test.add) { 1.73 + req = store.add(test.add); 1.74 + } 1.75 + else if (test.put) { 1.76 + req = store.put(test.put); 1.77 + } 1.78 + else if (test.delete) { 1.79 + req = store.delete(test.delete); 1.80 + } 1.81 + else { 1.82 + ok(false, "borked test"); 1.83 + } 1.84 + req.onsuccess = grabEventAndContinueHandler; 1.85 + let e = yield undefined; 1.86 + 1.87 + req = index.openKeyCursor(); 1.88 + req.onsuccess = grabEventAndContinueHandler; 1.89 + for (let j = 0; j < test.indexes.length; ++j) { 1.90 + e = yield undefined; 1.91 + is(req.result.key, test.indexes[j].v, "found expected index key at index " + j + testName); 1.92 + is(req.result.primaryKey, test.indexes[j].k, "found expected index primary key at index " + j + testName); 1.93 + req.result.continue(); 1.94 + } 1.95 + e = yield undefined; 1.96 + is(req.result, undefined, "exhausted indexes"); 1.97 + 1.98 + let tempIndex = store.createIndex("temp index", "x", { multiEntry: true }); 1.99 + req = tempIndex.openKeyCursor(); 1.100 + req.onsuccess = grabEventAndContinueHandler; 1.101 + for (let j = 0; j < test.indexes.length; ++j) { 1.102 + e = yield undefined; 1.103 + is(req.result.key, test.indexes[j].v, "found expected temp index key at index " + j + testName); 1.104 + is(req.result.primaryKey, test.indexes[j].k, "found expected temp index primary key at index " + j + testName); 1.105 + req.result.continue(); 1.106 + } 1.107 + e = yield undefined; 1.108 + is(req.result, undefined, "exhausted temp index"); 1.109 + store.deleteIndex("temp index"); 1.110 + } 1.111 + 1.112 + // Unique indexes 1.113 + tests = 1.114 + [{ add: { x: 1, id: 1 }, 1.115 + indexes:[{ v: 1, k: 1 }] }, 1.116 + { add: { x: [2, 3], id: 2 }, 1.117 + indexes:[{ v: 1, k: 1 }, 1.118 + { v: 2, k: 2 }, 1.119 + { v: 3, k: 2 }] }, 1.120 + { put: { x: [2, 4], id: 3 }, 1.121 + fail: true }, 1.122 + { put: { x: [1, 4], id: 1 }, 1.123 + indexes:[{ v: 1, k: 1 }, 1.124 + { v: 2, k: 2 }, 1.125 + { v: 3, k: 2 }, 1.126 + { v: 4, k: 1 }] }, 1.127 + { add: { x: [5, 0, 5, 5, 5], id: 3 }, 1.128 + indexes:[{ v: 0, k: 3 }, 1.129 + { v: 1, k: 1 }, 1.130 + { v: 2, k: 2 }, 1.131 + { v: 3, k: 2 }, 1.132 + { v: 4, k: 1 }, 1.133 + { v: 5, k: 3 }] }, 1.134 + { delete: IDBKeyRange.bound(1, 2), 1.135 + indexes:[{ v: 0, k: 3 }, 1.136 + { v: 5, k: 3 }] }, 1.137 + { add: { x: [0, 6], id: 8 }, 1.138 + fail: true }, 1.139 + { add: { x: 5, id: 8 }, 1.140 + fail: true }, 1.141 + { put: { x: 0, id: 8 }, 1.142 + fail: true }, 1.143 + ]; 1.144 + 1.145 + store.deleteIndex("myindex"); 1.146 + index = store.createIndex("myindex", "x", { multiEntry: true, unique: true }); 1.147 + is(index.multiEntry, true, "index created with multiEntry"); 1.148 + 1.149 + let i; 1.150 + let indexes; 1.151 + for (i = 0; i < tests.length; ++i) { 1.152 + let test = tests[i]; 1.153 + let testName = " for " + JSON.stringify(test); 1.154 + let req; 1.155 + if (test.add) { 1.156 + req = store.add(test.add); 1.157 + } 1.158 + else if (test.put) { 1.159 + req = store.put(test.put); 1.160 + } 1.161 + else if (test.delete) { 1.162 + req = store.delete(test.delete); 1.163 + } 1.164 + else { 1.165 + ok(false, "borked test"); 1.166 + } 1.167 + 1.168 + if (!test.fail) { 1.169 + req.onsuccess = grabEventAndContinueHandler; 1.170 + let e = yield undefined; 1.171 + indexes = test.indexes; 1.172 + } 1.173 + else { 1.174 + req.onsuccess = unexpectedSuccessHandler; 1.175 + req.onerror = grabEventAndContinueHandler; 1.176 + ok(true, "waiting for error"); 1.177 + let e = yield undefined; 1.178 + ok(true, "got error: " + e.type); 1.179 + e.preventDefault(); 1.180 + e.stopPropagation(); 1.181 + } 1.182 + 1.183 + let e; 1.184 + req = index.openKeyCursor(); 1.185 + req.onsuccess = grabEventAndContinueHandler; 1.186 + for (let j = 0; j < indexes.length; ++j) { 1.187 + e = yield undefined; 1.188 + is(req.result.key, indexes[j].v, "found expected index key at index " + j + testName); 1.189 + is(req.result.primaryKey, indexes[j].k, "found expected index primary key at index " + j + testName); 1.190 + req.result.continue(); 1.191 + } 1.192 + e = yield undefined; 1.193 + is(req.result, undefined, "exhausted indexes"); 1.194 + 1.195 + let tempIndex = store.createIndex("temp index", "x", { multiEntry: true, unique: true }); 1.196 + req = tempIndex.openKeyCursor(); 1.197 + req.onsuccess = grabEventAndContinueHandler; 1.198 + for (let j = 0; j < indexes.length; ++j) { 1.199 + e = yield undefined; 1.200 + is(req.result.key, indexes[j].v, "found expected temp index key at index " + j + testName); 1.201 + is(req.result.primaryKey, indexes[j].k, "found expected temp index primary key at index " + j + testName); 1.202 + req.result.continue(); 1.203 + } 1.204 + e = yield undefined; 1.205 + is(req.result, undefined, "exhausted temp index"); 1.206 + store.deleteIndex("temp index"); 1.207 + } 1.208 + 1.209 + 1.210 + openRequest.onsuccess = grabEventAndContinueHandler; 1.211 + yield undefined; 1.212 + 1.213 + let trans = db.transaction(["mystore"], "readwrite"); 1.214 + store = trans.objectStore("mystore"); 1.215 + index = store.index("myindex"); 1.216 + is(index.multiEntry, true, "index still is multiEntry"); 1.217 + trans.oncomplete = grabEventAndContinueHandler; 1.218 + yield undefined; 1.219 + 1.220 + finishTest(); 1.221 + yield undefined; 1.222 +}