Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / LayoutTests / storage / indexeddb / resources / objectstore-cursor.js
bloba6a4a2d1fdafa56c0256ea676733adac7e1d893f
1 if (this.importScripts) {
2     importScripts('../../../resources/js-test.js');
3     importScripts('shared.js');
6 description("Test IndexedDB's objectStore.openCursor + the cursor it produces in depth.");
8 // In order of how it should be sorted by IndexedDB.
9 self.testData = [
10     2.718281828459,
11     3,
12     3.14159265,
13     10,
14     // FIXME: Dates.
15     "A bigger string",
16     "The biggest",
17     "a low string"
20 indexedDBTest(prepareDatabase);
21 function prepareDatabase()
23     db = event.target.result;
24     event.target.transaction.onabort = unexpectedAbortCallback;
26     evalAndLog("objectStore = db.createObjectStore('someObjectStore')");
28     debug("");
29     debug("Verify that specifying an invalid direction raises an exception:");
30     evalAndExpectExceptionClass("objectStore.openCursor(0, 'invalid-direction')", "TypeError");
31     debug("");
33     self.nextToAdd = 0;
34     addData();
37 function addData()
39     request = evalAndLog("objectStore.add('', testData[nextToAdd])");
40     request.onsuccess = ++self.nextToAdd < testData.length ? addData : scheduleTests;
41     request.onerror = unexpectedErrorCallback;
44 function scheduleTests()
46     debug("Scheduling tests...");
47     self.scheduledTests = [];
48     for (var i = 0; i < testData.length; ++i) {
49         /* left bound, is open, right bound, is open, ascending */
50         scheduledTests.unshift([i, true, null, null, true]);
51         scheduledTests.unshift([i, false, null, null, true]);
52         scheduledTests.unshift([null, null, i, true, true]);
53         scheduledTests.unshift([null, null, i, false, true]);
54         scheduledTests.unshift([i, true, null, null, false]);
55         scheduledTests.unshift([i, false, null, null, false]);
56         scheduledTests.unshift([null, null, i, true, false]);
57         scheduledTests.unshift([null, null, i, false, false]);
58         for (var j = 6; j < testData.length; ++j) {
59             scheduledTests.unshift([i, true, j, true, true]);
60             scheduledTests.unshift([i, true, j, false, true]);
61             scheduledTests.unshift([i, false, j, true, true]);
62             scheduledTests.unshift([i, false, j, false, true]);
63             scheduledTests.unshift([i, true, j, true, false]);
64             scheduledTests.unshift([i, true, j, false, false]);
65             scheduledTests.unshift([i, false, j, true, false]);
66             scheduledTests.unshift([i, false, j, false, false]);
67         }
68     }
70     debug("Running tests...");
71     runNextTest();
74 function runNextTest()
76     if (!scheduledTests.length) {
77         testNullKeyRange();
78         return;
79     }
81     var test = scheduledTests.pop();
82     self.lower = test[0];
83     self.lowerIsOpen = test[1];
84     self.upper = test[2];
85     self.upperIsOpen = test[3];
86     self.ascending = test[4];
88     str = "Next test: ";
89     if (lower !== null) {
90         str += "lower ";
91         if (lowerIsOpen)
92             str += "open ";
93         str += "bound is " + lower + "; ";
94     }
95     if (upper !== null) {
96         str += "upper ";
97         if (upperIsOpen)
98             str += "open ";
99         str += "bound is " + upper + "; ";
100     }
101     if (ascending)
102         str += "sorted ascending.";
103     else
104         str += "sorted descending.";
106     debug("");
107     debug(str);
109     if (ascending) {
110         if (lower !== null) {
111             if (!lowerIsOpen)
112                 self.expectedIndex = lower;
113             else
114                 self.expectedIndex = lower+1;
115         } else
116             self.expectedIndex = 0;
117     } else {
118         if (upper !== null) {
119             if (!upperIsOpen)
120                 self.expectedIndex = upper;
121             else
122                 self.expectedIndex = upper-1;
123         } else
124             self.expectedIndex = testData.length-1;
125     }
126     testWithinBounds();
128     if (testData[lower] === testData[upper] && (lowerIsOpen || upperIsOpen)) {
129         debug("Skipping illegal key range.");
130         runNextTest();
131         return;
132     }
134     var keyRange;
135     if (lower !== null && upper !== null)
136         keyRange = IDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen);
137     else if (lower !== null)
138         keyRange = IDBKeyRange.lowerBound(testData[lower], lowerIsOpen);
139     else
140         keyRange = IDBKeyRange.upperBound(testData[upper], upperIsOpen);
142     var request = objectStore.openCursor(keyRange, ascending ? 'next' : 'prev');
143     request.onsuccess = cursorIteration;
144     request.onerror = unexpectedErrorCallback;
147 function testWithinBounds()
149     if (expectedIndex < 0 || testData.length <= expectedIndex)
150         self.expectedIndex = null;
151     if (lower !== null && expectedIndex < lower)
152         self.expectedIndex = null;
153     if (upper !== null && upper < expectedIndex)
154         self.expectedIndex = null;
155     if (lower !== null && lowerIsOpen && expectedIndex <= lower)
156         self.expectedIndex = null;
157     if (upper !== null && upperIsOpen && upper <= expectedIndex)
158         self.expectedIndex = null;
161 function cursorIteration()
163     if (expectedIndex === null) {
164         shouldBeNull("event.target.result");
165         runNextTest();
166         return;
167     }
168     if (event.target.result === null) {
169         testFailed("event.target.result should not be null.");
170         runNextTest();
171         return;
172     }
174     shouldBe("event.target.result.key", "testData[" + expectedIndex + "]");
175     self.expectedIndex = ascending ? expectedIndex+1 : expectedIndex-1;
176     testWithinBounds();
178     event.target.result.continue();
181 self.nullKeyRangeStep = 0;
182 function testNullKeyRange()
184     self.lower = 0;
185     self.lowerIsOpen = false;
186     self.upper = testData.length-1;
187     self.upperIsOpen = false;
189     str = "Next test: null key path ";
190     if (self.nullKeyRangeStep == 0) {
191         str += "sorted ascending.";
192         self.ascending = true;
193         self.expectedIndex = lower;
194         self.nullKeyRangeStep = 1;
195     } else if (self.nullKeyRangeStep == 1) {
196         str += "sorted descending.";
197         self.ascending = false;
198         self.expectedIndex = upper;
199         self.nullKeyRangeStep = 2;
200     } else {
201         finishJSTest();
202         return;
203     }
205     debug("");
206     debug(str);
208     var request = objectStore.openCursor(null, ascending ? 'next' : 'prev');
209     request.onsuccess = cursorIteration;
210     request.onerror = unexpectedErrorCallback;