1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/unit/test_keys.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,269 @@ 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 + const dbname = this.window ? window.location.pathname : "Splendid Test"; 1.14 + const RW = "readwrite" 1.15 + let c1 = 1; 1.16 + let c2 = 1; 1.17 + 1.18 + let openRequest = indexedDB.open(dbname, 1); 1.19 + openRequest.onerror = errorHandler; 1.20 + openRequest.onupgradeneeded = grabEventAndContinueHandler; 1.21 + openRequest.onsuccess = unexpectedSuccessHandler; 1.22 + let event = yield undefined; 1.23 + let db = event.target.result; 1.24 + let trans = event.target.transaction; 1.25 + 1.26 + // Create test stores 1.27 + let store = db.createObjectStore("store"); 1.28 + 1.29 + // Test simple inserts 1.30 + var keys = [ 1.31 + -1/0, 1.32 + -1.7e308, 1.33 + -10000, 1.34 + -2, 1.35 + -1.5, 1.36 + -1, 1.37 + -1.00001e-200, 1.38 + -1e-200, 1.39 + 0, 1.40 + 1e-200, 1.41 + 1.00001e-200, 1.42 + 1, 1.43 + 2, 1.44 + 10000, 1.45 + 1.7e308, 1.46 + 1/0, 1.47 + new Date("1750-01-02"), 1.48 + new Date("1800-12-31T12:34:56.001"), 1.49 + new Date(-1000), 1.50 + new Date(-10), 1.51 + new Date(-1), 1.52 + new Date(0), 1.53 + new Date(1), 1.54 + new Date(2), 1.55 + new Date(1000), 1.56 + new Date("1971-01-01"), 1.57 + new Date("1971-01-01T01:01:01Z"), 1.58 + new Date("1971-01-01T01:01:01.001Z"), 1.59 + new Date("1971-01-01T01:01:01.01Z"), 1.60 + new Date("1971-01-01T01:01:01.1Z"), 1.61 + new Date("1980-02-02"), 1.62 + new Date("3333-03-19T03:33:33.333"), 1.63 + "", 1.64 + "\x00", 1.65 + "\x00\x00", 1.66 + "\x00\x01", 1.67 + "\x01", 1.68 + "\x02", 1.69 + "\x03", 1.70 + "\x04", 1.71 + "\x07", 1.72 + "\x08", 1.73 + "\x0F", 1.74 + "\x10", 1.75 + "\x1F", 1.76 + "\x20", 1.77 + "01234", 1.78 + "\x3F", 1.79 + "\x40", 1.80 + "A", 1.81 + "A\x00", 1.82 + "A1", 1.83 + "ZZZZ", 1.84 + "a", 1.85 + "a\x00", 1.86 + "aa", 1.87 + "azz", 1.88 + "}", 1.89 + "\x7E", 1.90 + "\x7F", 1.91 + "\x80", 1.92 + "\xFF", 1.93 + "\u0100", 1.94 + "\u01FF", 1.95 + "\u0200", 1.96 + "\u03FF", 1.97 + "\u0400", 1.98 + "\u07FF", 1.99 + "\u0800", 1.100 + "\u0FFF", 1.101 + "\u1000", 1.102 + "\u1FFF", 1.103 + "\u2000", 1.104 + "\u3FFF", 1.105 + "\u4000", 1.106 + "\u7FFF", 1.107 + "\u8000", 1.108 + "\uD800", 1.109 + "\uD800a", 1.110 + "\uD800\uDC01", 1.111 + "\uDBFF", 1.112 + "\uDC00", 1.113 + "\uDFFF\uD800", 1.114 + "\uFFFE", 1.115 + "\uFFFF", 1.116 + "\uFFFF\x00", 1.117 + "\uFFFFZZZ", 1.118 + [], 1.119 + [-1/0], 1.120 + [-1], 1.121 + [0], 1.122 + [1], 1.123 + [1, "a"], 1.124 + [1, []], 1.125 + [1, [""]], 1.126 + [2, 3], 1.127 + [2, 3.0000000000001], 1.128 + [12, [[]]], 1.129 + [12, [[[]]]], 1.130 + [12, [[[""]]]], 1.131 + [12, [[["foo"]]]], 1.132 + [12, [[[[[3]]]]]], 1.133 + [12, [[[[[[3]]]]]]], 1.134 + [new Date(-1)], 1.135 + [new Date(1)], 1.136 + [""], 1.137 + ["", [[]]], 1.138 + ["", [[[]]]], 1.139 + ["abc"], 1.140 + ["abc", "def"], 1.141 + ["abc\x00"], 1.142 + ["abc\x00", "\x00\x01"], 1.143 + ["abc\x00", "\x00def"], 1.144 + ["abc\x00\x00def"], 1.145 + ["x", [[]]], 1.146 + ["x", [[[]]]], 1.147 + [[]], 1.148 + [[],"foo"], 1.149 + [[],[]], 1.150 + [[[]]], 1.151 + [[[]], []], 1.152 + [[[]], [[]]], 1.153 + [[[]], [[1]]], 1.154 + [[[]], [[[]]]], 1.155 + [[[1]]], 1.156 + [[[[]], []]], 1.157 + ]; 1.158 + 1.159 + for (var i = 0; i < keys.length; ++i) { 1.160 + let keyI = keys[i]; 1.161 + is(indexedDB.cmp(keyI, keyI), 0, i + " compared to self"); 1.162 + 1.163 + function doCompare(keyI) { 1.164 + for (var j = i-1; j >= i-10 && j >= 0; --j) { 1.165 + is(indexedDB.cmp(keyI, keys[j]), 1, i + " compared to " + j); 1.166 + is(indexedDB.cmp(keys[j], keyI), -1, j + " compared to " + i); 1.167 + } 1.168 + } 1.169 + 1.170 + doCompare(keyI); 1.171 + store.add(i, keyI).onsuccess = function(e) { 1.172 + is(indexedDB.cmp(e.target.result, keyI), 0, 1.173 + "Returned key should cmp as equal"); 1.174 + ok(compareKeys(e.target.result, keyI), 1.175 + "Returned key should actually be equal"); 1.176 + }; 1.177 + 1.178 + // Test that -0 compares the same as 0 1.179 + if (keyI === 0) { 1.180 + doCompare(-0); 1.181 + let req = store.add(i, -0); 1.182 + req.addEventListener("error", new ExpectError("ConstraintError", true)); 1.183 + req.onsuccess = unexpectedSuccessHandler; 1.184 + yield undefined; 1.185 + } 1.186 + else if (Array.isArray(keyI) && keyI.length === 1 && keyI[0] === 0) { 1.187 + doCompare([-0]); 1.188 + let req = store.add(i, [-0]); 1.189 + req.addEventListener("error", new ExpectError("ConstraintError", true)); 1.190 + req.onsuccess = unexpectedSuccessHandler; 1.191 + yield undefined; 1.192 + } 1.193 + } 1.194 + 1.195 + store.openCursor().onsuccess = grabEventAndContinueHandler; 1.196 + for (i = 0; i < keys.length; ++i) { 1.197 + event = yield undefined; 1.198 + let cursor = event.target.result; 1.199 + is(indexedDB.cmp(cursor.key, keys[i]), 0, 1.200 + "Read back key should cmp as equal"); 1.201 + ok(compareKeys(cursor.key, keys[i]), 1.202 + "Read back key should actually be equal"); 1.203 + is(cursor.value, i, "Stored with right value"); 1.204 + 1.205 + cursor.continue(); 1.206 + } 1.207 + event = yield undefined; 1.208 + is(event.target.result, undefined, "no more results expected"); 1.209 + 1.210 + var nan = 0/0; 1.211 + var invalidKeys = [ 1.212 + nan, 1.213 + undefined, 1.214 + null, 1.215 + /x/, 1.216 + {}, 1.217 + new Date(NaN), 1.218 + new Date("foopy"), 1.219 + [nan], 1.220 + [undefined], 1.221 + [null], 1.222 + [/x/], 1.223 + [{}], 1.224 + [new Date(NaN)], 1.225 + [1, nan], 1.226 + [1, undefined], 1.227 + [1, null], 1.228 + [1, /x/], 1.229 + [1, {}], 1.230 + [1, [nan]], 1.231 + [1, [undefined]], 1.232 + [1, [null]], 1.233 + [1, [/x/]], 1.234 + [1, [{}]], 1.235 + ]; 1.236 + 1.237 + for (i = 0; i < invalidKeys.length; ++i) { 1.238 + try { 1.239 + indexedDB.cmp(invalidKeys[i], 1); 1.240 + ok(false, "didn't throw"); 1.241 + } 1.242 + catch(ex) { 1.243 + ok(ex instanceof DOMException, "Threw DOMException"); 1.244 + is(ex.name, "DataError", "Threw right DOMException"); 1.245 + is(ex.code, 0, "Threw with right code"); 1.246 + } 1.247 + try { 1.248 + indexedDB.cmp(1, invalidKeys[i]); 1.249 + ok(false, "didn't throw2"); 1.250 + } 1.251 + catch(ex) { 1.252 + ok(ex instanceof DOMException, "Threw DOMException2"); 1.253 + is(ex.name, "DataError", "Threw right DOMException2"); 1.254 + is(ex.code, 0, "Threw with right code2"); 1.255 + } 1.256 + try { 1.257 + store.put(1, invalidKeys[i]); 1.258 + ok(false, "didn't throw3"); 1.259 + } 1.260 + catch(ex) { 1.261 + ok(ex instanceof DOMException, "Threw DOMException3"); 1.262 + is(ex.name, "DataError", "Threw right DOMException3"); 1.263 + is(ex.code, 0, "Threw with right code3"); 1.264 + } 1.265 + } 1.266 + 1.267 + openRequest.onsuccess = grabEventAndContinueHandler; 1.268 + yield undefined; 1.269 + 1.270 + finishTest(); 1.271 + yield undefined; 1.272 +}