test_multientry.js (7222B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /* exported testGenerator */ 7 var testGenerator = testSteps(); 8 9 function* testSteps() { 10 // Test object stores 11 12 let name = this.window ? window.location.pathname : "Splendid Test"; 13 let openRequest = indexedDB.open(name, 1); 14 openRequest.onerror = errorHandler; 15 openRequest.onupgradeneeded = grabEventAndContinueHandler; 16 openRequest.onsuccess = unexpectedSuccessHandler; 17 let event = yield undefined; 18 let db = event.target.result; 19 db.onerror = errorHandler; 20 let tests = [ 21 { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] }, 22 { 23 add: { x: [2, 3], id: 2 }, 24 indexes: [ 25 { v: 1, k: 1 }, 26 { v: 2, k: 2 }, 27 { v: 3, k: 2 }, 28 ], 29 }, 30 { 31 put: { x: [2, 4], id: 1 }, 32 indexes: [ 33 { v: 2, k: 1 }, 34 { v: 2, k: 2 }, 35 { v: 3, k: 2 }, 36 { v: 4, k: 1 }, 37 ], 38 }, 39 { 40 add: { x: [5, 6, 5, -2, 3], id: 3 }, 41 indexes: [ 42 { v: -2, k: 3 }, 43 { v: 2, k: 1 }, 44 { v: 2, k: 2 }, 45 { v: 3, k: 2 }, 46 { v: 3, k: 3 }, 47 { v: 4, k: 1 }, 48 { v: 5, k: 3 }, 49 { v: 6, k: 3 }, 50 ], 51 }, 52 { delete: IDBKeyRange.bound(1, 3), indexes: [] }, 53 { 54 put: { x: ["food", {}, false, undefined, /x/, [73, false]], id: 2 }, 55 indexes: [{ v: "food", k: 2 }], 56 }, 57 { 58 add: { x: [{}, /x/, -12, "food", null, [false], undefined], id: 3 }, 59 indexes: [ 60 { v: -12, k: 3 }, 61 { v: "food", k: 2 }, 62 { v: "food", k: 3 }, 63 ], 64 }, 65 { 66 put: { x: [], id: 2 }, 67 indexes: [ 68 { v: -12, k: 3 }, 69 { v: "food", k: 3 }, 70 ], 71 }, 72 { put: { x: { y: 3 }, id: 3 }, indexes: [] }, 73 { add: { x: false, id: 7 }, indexes: [] }, 74 { delete: IDBKeyRange.lowerBound(0), indexes: [] }, 75 ]; 76 77 let store = db.createObjectStore("mystore", { keyPath: "id" }); 78 let index = store.createIndex("myindex", "x", { multiEntry: true }); 79 is(index.multiEntry, true, "index created with multiEntry"); 80 81 let i; 82 for (i = 0; i < tests.length; ++i) { 83 let test = tests[i]; 84 let testName = " for " + JSON.stringify(test); 85 let req; 86 if (test.add) { 87 req = store.add(test.add); 88 } else if (test.put) { 89 req = store.put(test.put); 90 } else if (test.delete) { 91 req = store.delete(test.delete); 92 } else { 93 ok(false, "borked test"); 94 } 95 req.onsuccess = grabEventAndContinueHandler; 96 yield undefined; 97 98 req = index.openKeyCursor(); 99 req.onsuccess = grabEventAndContinueHandler; 100 for (let j = 0; j < test.indexes.length; ++j) { 101 yield undefined; 102 is( 103 req.result.key, 104 test.indexes[j].v, 105 "found expected index key at index " + j + testName 106 ); 107 is( 108 req.result.primaryKey, 109 test.indexes[j].k, 110 "found expected index primary key at index " + j + testName 111 ); 112 req.result.continue(); 113 } 114 yield undefined; 115 ok(req.result == null, "exhausted indexes"); 116 117 let tempIndex = store.createIndex("temp index", "x", { multiEntry: true }); 118 req = tempIndex.openKeyCursor(); 119 req.onsuccess = grabEventAndContinueHandler; 120 for (let j = 0; j < test.indexes.length; ++j) { 121 yield undefined; 122 is( 123 req.result.key, 124 test.indexes[j].v, 125 "found expected temp index key at index " + j + testName 126 ); 127 is( 128 req.result.primaryKey, 129 test.indexes[j].k, 130 "found expected temp index primary key at index " + j + testName 131 ); 132 req.result.continue(); 133 } 134 yield undefined; 135 ok(req.result == null, "exhausted temp index"); 136 store.deleteIndex("temp index"); 137 } 138 139 // Unique indexes 140 tests = [ 141 { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] }, 142 { 143 add: { x: [2, 3], id: 2 }, 144 indexes: [ 145 { v: 1, k: 1 }, 146 { v: 2, k: 2 }, 147 { v: 3, k: 2 }, 148 ], 149 }, 150 { put: { x: [2, 4], id: 3 }, fail: true }, 151 { 152 put: { x: [1, 4], id: 1 }, 153 indexes: [ 154 { v: 1, k: 1 }, 155 { v: 2, k: 2 }, 156 { v: 3, k: 2 }, 157 { v: 4, k: 1 }, 158 ], 159 }, 160 { 161 add: { x: [5, 0, 5, 5, 5], id: 3 }, 162 indexes: [ 163 { v: 0, k: 3 }, 164 { v: 1, k: 1 }, 165 { v: 2, k: 2 }, 166 { v: 3, k: 2 }, 167 { v: 4, k: 1 }, 168 { v: 5, k: 3 }, 169 ], 170 }, 171 { 172 delete: IDBKeyRange.bound(1, 2), 173 indexes: [ 174 { v: 0, k: 3 }, 175 { v: 5, k: 3 }, 176 ], 177 }, 178 { add: { x: [0, 6], id: 8 }, fail: true }, 179 { add: { x: 5, id: 8 }, fail: true }, 180 { put: { x: 0, id: 8 }, fail: true }, 181 ]; 182 183 store.deleteIndex("myindex"); 184 index = store.createIndex("myindex", "x", { multiEntry: true, unique: true }); 185 is(index.multiEntry, true, "index created with multiEntry"); 186 187 let indexes; 188 for (i = 0; i < tests.length; ++i) { 189 let test = tests[i]; 190 let testName = " for " + JSON.stringify(test); 191 let req; 192 if (test.add) { 193 req = store.add(test.add); 194 } else if (test.put) { 195 req = store.put(test.put); 196 } else if (test.delete) { 197 req = store.delete(test.delete); 198 } else { 199 ok(false, "borked test"); 200 } 201 202 if (!test.fail) { 203 req.onsuccess = grabEventAndContinueHandler; 204 yield undefined; 205 indexes = test.indexes; 206 } else { 207 req.onsuccess = unexpectedSuccessHandler; 208 req.onerror = grabEventAndContinueHandler; 209 ok(true, "waiting for error"); 210 let e = yield undefined; 211 ok(true, "got error: " + e.type); 212 e.preventDefault(); 213 e.stopPropagation(); 214 } 215 216 req = index.openKeyCursor(); 217 req.onsuccess = grabEventAndContinueHandler; 218 for (let j = 0; j < indexes.length; ++j) { 219 yield undefined; 220 is( 221 req.result.key, 222 indexes[j].v, 223 "found expected index key at index " + j + testName 224 ); 225 is( 226 req.result.primaryKey, 227 indexes[j].k, 228 "found expected index primary key at index " + j + testName 229 ); 230 req.result.continue(); 231 } 232 yield undefined; 233 ok(req.result == null, "exhausted indexes"); 234 235 let tempIndex = store.createIndex("temp index", "x", { 236 multiEntry: true, 237 unique: true, 238 }); 239 req = tempIndex.openKeyCursor(); 240 req.onsuccess = grabEventAndContinueHandler; 241 for (let j = 0; j < indexes.length; ++j) { 242 yield undefined; 243 is( 244 req.result.key, 245 indexes[j].v, 246 "found expected temp index key at index " + j + testName 247 ); 248 is( 249 req.result.primaryKey, 250 indexes[j].k, 251 "found expected temp index primary key at index " + j + testName 252 ); 253 req.result.continue(); 254 } 255 yield undefined; 256 ok(req.result == null, "exhausted temp index"); 257 store.deleteIndex("temp index"); 258 } 259 260 openRequest.onsuccess = grabEventAndContinueHandler; 261 yield undefined; 262 263 let trans = db.transaction(["mystore"], "readwrite"); 264 store = trans.objectStore("mystore"); 265 index = store.index("myindex"); 266 is(index.multiEntry, true, "index still is multiEntry"); 267 trans.oncomplete = grabEventAndContinueHandler; 268 yield undefined; 269 270 finishTest(); 271 }