0c8c082960b07bdcc1742fb0f61b3a45230f9cc3
[WebKit-https.git] / LayoutTests / storage / indexeddb / resources / key-type-array.js
1 if (this.importScripts) {
2     importScripts('../../../resources/js-test.js');
3     importScripts('shared.js');
4 }
5
6 description("Test IndexedDB key types");
7
8 indexedDBTest(prepareDatabase, testValidArrayKeys);
9 function prepareDatabase()
10 {
11     db = event.target.result;
12     event.target.transaction.onabort = unexpectedAbortCallback;
13     objectStore = evalAndLog("db.createObjectStore('store');");
14     debug("");
15 }
16
17 function testValidArrayKeys()
18 {
19     evalAndLog("trans = db.transaction('store', 'readwrite')");
20     evalAndLog("store = trans.objectStore('store')");
21     debug("");
22
23     evalAndLog("long_array = []; for (i = 0; i < 1000; ++i) { long_array.push('abc', 123, new Date(0), []); }");
24     debug("");
25
26     debug("array that contains non-numeric self-reference");
27     evalAndLog("self_referrential_array = []; self_referrential_array.self = self_referrential_array;");
28     debug("");
29
30     var n = 0, cases = [
31         "[]",
32
33         "[-Infinity]",
34         "[-Number.MAX_VALUE]",
35         "[-1]",
36         "[-Number.MIN_VALUE]",
37         "[0]",
38         "[Number.MIN_VALUE]",
39         "[1]",
40         "[Number.MAX_VALUE]",
41         "[Infinity]",
42
43         "[1,2,3]",
44
45         "[new Date(0)]",
46         "[new Date('2525-01-01T00:00:00Z')]",
47
48         "[new Date(0), new Date('2525-01-01T00:00:00Z')]",
49
50         "['']",
51         "['\x00']",
52         "['abc123']",
53
54         "['abc', 123]",
55
56         "[[]]",
57
58         "[[], []]",
59         "[[], [], []]",
60
61         "[[[]]]",
62         "[[[[]]]]",
63
64         "[123, 'abc', new Date(0), []]",
65         "[[123, 'abc', new Date(0), []], [456, 'def', new Date(999), [[]]]]",
66
67         "long_array",
68         "self_referrential_array"
69     ];
70
71     function testArrayPutGet(value, key, callback)
72     {
73         debug("testing array key: " + key);
74         putreq = evalAndLog("store.put('" + value + "', " + key + ");");
75         putreq.onerror = unexpectedErrorCallback;
76         putreq.onsuccess = function() {
77             getreq = evalAndLog("store.get(" + key + ");");
78             getreq.onerror = unexpectedErrorCallback;
79             getreq.onsuccess = function() {
80                 shouldBeEqualToString("getreq.result", value);
81                 debug("");
82                 callback();
83             };
84         };
85     }
86
87     function nextTest()
88     {
89         var testcase = cases.shift();
90         if (testcase) {
91             testArrayPutGet("value" + (++n), testcase, nextTest);
92         }
93     }
94
95     nextTest();
96
97     trans.oncomplete = testInvalidArrayKeys;
98 }
99
100 function testInvalidArrayKeys()
101 {
102     evalAndLog("trans = db.transaction('store', 'readwrite')");
103     evalAndLog("store = trans.objectStore('store')");
104     debug("");
105
106     debug("array that contains itself: array = [ array ]");
107     evalAndLog("cyclic_array = []; cyclic_array.push(cyclic_array)");
108
109     debug("array that contains itself, one level down: array = [ [ array ] ]");
110     evalAndLog("cyclic_array2 = []; cyclic_array2.push([cyclic_array2])");
111
112     debug("array that contains itself, not as first element: array = [1, 'b', [], array]");
113     evalAndLog("cyclic_array3 = [1, 'b', []]; cyclic_array3.push(cyclic_array3)");
114
115     debug("array that contains array that contains itself");
116     evalAndLog("cyclic_array4 = [cyclic_array];");
117     debug("");
118
119     var invalidKeys = [
120         "[ void 0 ]", // undefined
121         "[ true ]",
122         "[ false ]",
123         "[ NaN ]",
124         "[ null ]",
125         "[ {} ]",
126         "[ function () {} ]",
127         "[ /regex/ ]",
128         "[ self ]",
129         "[ self.document ]",
130         "[ self.document.body ]",
131         "cyclic_array",
132         "cyclic_array2",
133         "cyclic_array3",
134         "cyclic_array4",
135         "Array(1000)" // sparse
136     ];
137
138     invalidKeys.forEach(function (key) {
139         debug("testing invalid array key: " + key);
140         evalAndExpectException("store.put('value', " + key + ");", "0", "'DataError'");
141         debug("");
142     });
143
144     testDepthLimits();
145 }
146
147 function makeArrayOfDepth(n)
148 {
149     var array = [];
150     while (--n) {
151         array = [array];
152     }
153     return array;
154 }
155
156 function testDepthLimits()
157 {
158     shouldBe("indexedDB.cmp(makeArrayOfDepth(25), 0)", "1");
159     shouldBe("indexedDB.cmp(makeArrayOfDepth(250), 0)", "1");
160     evalAndExpectException("indexedDB.cmp(makeArrayOfDepth(2500), 0)", "0", "'DataError'");
161     debug("");
162
163     finishJSTest();
164 }