JS Test Harness: Remove successfullyParsed from more tests
[WebKit-https.git] / LayoutTests / storage / indexeddb / index-cursor.html
1 <html>
2 <head>
3 <script src="../../fast/js/resources/js-test-pre.js"></script>
4 <script src="resources/shared.js"></script>
5 </head>
6 <body>
7 <p id="description"></p>
8 <div id="console"></div>
9 <script> 
10
11 description("Test IndexedDB's webkitIDBIndex.openCursor + the cursor it produces in depth.");
12 if (window.layoutTestController)
13     layoutTestController.waitUntilDone();
14  
15 // In order of how it should be sorted by IndexedDB.
16 window.testData = [
17     1,
18     1,
19     3.14159,
20     3.14159,
21     10,
22     // FIXME: Dates.
23     "A big string",
24     "the BIGEST string",
25     "the BIGEST string"
26 ];
27  
28 function openDatabase()
29 {
30     result = evalAndLog("webkitIndexedDB.open('index-cursor')");
31     result.onsuccess = setVersion;
32     result.onerror = unexpectedErrorCallback;
33 }
34  
35 function setVersion()
36 {
37     window.db = evalAndLog("db = event.target.result");
38
39     result = evalAndLog("db.setVersion('new version')");
40     result.onsuccess = deleteExisting;
41     result.onerror = unexpectedErrorCallback;
42 }
43
44 function deleteExisting()
45 {
46     window.trans = evalAndLog("trans = event.target.result");
47     shouldBeTrue("trans !== null");
48     trans.onabort = unexpectedAbortCallback;
49
50     deleteAllObjectStores(db);
51
52     window.objectStore = evalAndLog("db.createObjectStore('someObjectStore')");
53     window.indexObject = evalAndLog("objectStore.createIndex('someIndex', 'x')");
54     window.nextToAdd = 0;
55     addData();
56 }
57
58 function addData()
59 {
60     result = evalAndLog("objectStore.add({'x': testData[nextToAdd]}, nextToAdd)");
61     result.onsuccess = ++window.nextToAdd < testData.length ? addData : scheduleTests;
62     result.onerror = unexpectedErrorCallback;
63 }
64
65 function scheduleTests()
66 {
67     debug("Scheduling tests...");
68     window.scheduledTests = [];
69     for (var i = 0; i < testData.length; ++i) {
70         /* left bound, is open, right bound, is open, ascending */
71         scheduledTests.unshift([i, true, null, null, true]);
72         scheduledTests.unshift([i, false, null, null, true]);
73         scheduledTests.unshift([null, null, i, true, true]);
74         scheduledTests.unshift([null, null, i, false, true]);
75         scheduledTests.unshift([i, true, null, null, false]);
76         scheduledTests.unshift([i, false, null, null, false]);
77         scheduledTests.unshift([null, null, i, true, false]);
78         scheduledTests.unshift([null, null, i, false, false]);
79         for (var j = 6; j < testData.length; ++j) {
80             scheduledTests.unshift([i, true, j, true, true]);
81             scheduledTests.unshift([i, true, j, false, true]);
82             scheduledTests.unshift([i, false, j, true, true]);
83             scheduledTests.unshift([i, false, j, false, true]);
84             scheduledTests.unshift([i, true, j, true, false]);
85             scheduledTests.unshift([i, true, j, false, false]);
86             scheduledTests.unshift([i, false, j, true, false]);
87             scheduledTests.unshift([i, false, j, false, false]);
88         }
89     }
90  
91     debug("Running tests...");
92     runNextTest();
93 }
94  
95 function runNextTest()
96 {
97     if (!scheduledTests.length) {
98         testNullKeyRange();
99         return;
100     }
101  
102     var test = scheduledTests.pop();
103     window.lower = test[0];
104     window.lowerIsOpen = test[1];
105     window.upper = test[2];
106     window.upperIsOpen = test[3];
107     window.ascending = test[4];
108
109     str = "Next test: ";
110     if (lower !== null) {
111         str += "lower ";
112         if (lowerIsOpen)
113             str += "open ";
114         str += "bound is " + lower + "; ";
115     }
116     if (upper !== null) {
117         str += "upper ";
118         if (upperIsOpen)
119             str += "open ";
120         str += "bound is " + upper + "; ";
121     }
122     if (ascending)
123         str += "sorted ascending.";
124     else
125         str += "sorted descending.";
126
127     debug("");
128     debug(str);
129
130     // Work around for duplicate values.
131     if (upper !== null) {
132         if (upperIsOpen) {
133             while (upper > 0 && testData[upper] === testData[upper - 1])
134                 --window.upper;
135         } else {
136             while (upper < testData.length - 1 && testData[upper] === testData[upper + 1])
137                 ++window.upper;
138         }
139     }
140     if (lower !== null) {
141         if (lowerIsOpen) {
142             while (lower < testData.length - 1 && testData[lower] === testData[lower + 1])
143                 ++window.lower;
144         } else {
145             while (lower > 0 && testData[lower] === testData[lower - 1])
146                 --window.lower;
147         }
148     }
149
150     if (ascending) {
151         if (lower !== null) {
152             if (!lowerIsOpen)
153                 window.expectedIndex = lower;
154             else
155                 window.expectedIndex = lower + 1;
156         } else
157             window.expectedIndex = 0;
158     } else {
159         if (upper !== null) {
160             if (!upperIsOpen)
161                 window.expectedIndex = upper;
162             else
163                 window.expectedIndex = upper - 1;
164         } else
165             window.expectedIndex = testData.length - 1;
166     }
167     testWithinBounds();
168  
169     var keyRange;
170     if (lower !== null && upper !== null)
171         keyRange = webkitIDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen);
172     else if (lower !== null)
173         keyRange = webkitIDBKeyRange.lowerBound(testData[lower], lowerIsOpen);
174     else
175         keyRange = webkitIDBKeyRange.upperBound(testData[upper], upperIsOpen);
176  
177     var request = indexObject.openKeyCursor(keyRange, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV);
178     request.onsuccess = cursorIteration;
179     request.onerror = unexpectedErrorCallback;
180 }
181
182 function testWithinBounds()
183 {
184     if (expectedIndex < 0 || testData.length <= expectedIndex)
185         window.expectedIndex = null;
186     if (lower !== null && expectedIndex < lower)
187         window.expectedIndex = null;
188     if (upper !== null && upper < expectedIndex)
189         window.expectedIndex = null;
190     if (lower !== null && lowerIsOpen && expectedIndex <= lower)
191         window.expectedIndex = null;
192     if (upper !== null && upperIsOpen && upper <= expectedIndex)
193         window.expectedIndex = null;
194 }
195  
196 function cursorIteration()
197 {
198     if (expectedIndex === null) {
199         shouldBeNull("event.target.result");
200         runNextTest();
201         return;
202     }
203     if (event.target.result === null) {
204         testFailed("event.target.result should not be null.");
205         runNextTest();
206         return;
207     }
208  
209     shouldBe("event.target.result.primaryKey", "expectedIndex");
210     shouldBe("event.target.result.key", "testData[" + expectedIndex + "]");
211     window.expectedIndex = ascending ? expectedIndex + 1 : expectedIndex - 1;
212     testWithinBounds();
213
214     event.target.result.continue();
215 }
216  
217 window.nullKeyRangeStep = 0;
218 function testNullKeyRange()
219 {
220     window.lower = 0;
221     window.lowerIsOpen = false;
222     window.upper = testData.length-1;
223     window.upperIsOpen = false;
224
225     str = "Next test: null key path ";
226     if (window.nullKeyRangeStep == 0) {
227         str += "sorted ascending.";
228         window.ascending = true;
229         window.expectedIndex = lower;
230         window.nullKeyRangeStep = 1;
231     } else if (window.nullKeyRangeStep == 1) {
232         str += "sorted descending.";
233         window.ascending = false;
234         window.expectedIndex = upper;
235         window.nullKeyRangeStep = 2;
236     } else {
237         done();
238         return;
239     }
240
241     debug("");
242     debug(str);
243  
244     var request = indexObject.openKeyCursor(null, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV);
245     request.onsuccess = cursorIteration;
246     request.onerror = unexpectedErrorCallback;
247 }
248  
249 openDatabase(); // The first step.
250  
251 </script>
252 </body>
253 </html>