Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / test / data / indexeddb / key_types_test.js
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 function test() {
6   indexedDBTest(prepareDatabase, testValidKeys);
7 }
8
9 function prepareDatabase()
10 {
11   db = event.target.result;
12   db.createObjectStore('store');
13 }
14
15 var valid_keys = [
16   "-Infinity",
17   "-Number.MAX_VALUE",
18   "-1",
19   "-Number.MIN_VALUE",
20   "0",
21   "Number.MIN_VALUE",
22   "1",
23   "Number.MAX_VALUE",
24   "Infinity",
25
26   "new Date(0)",
27   "new Date(1000)",
28   "new Date(1317399931023)",
29
30   "''",
31
32   "'\x00'",
33   "'a'",
34   "'aa'",
35   "'b'",
36   "'ba'",
37
38   "'\xA2'", // U+00A2 CENT SIGN
39   "'\u6C34'", // U+6C34 CJK UNIFIED IDEOGRAPH (water)
40   "'\uD834\uDD1E'", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair)
41   "'\uFFFD'", // U+FFFD REPLACEMENT CHARACTER
42
43   "[]",
44
45   "[-Infinity]",
46   "[-Number.MAX_VALUE]",
47   "[-1]",
48   "[-Number.MIN_VALUE]",
49   "[0]",
50   "[Number.MIN_VALUE]",
51   "[1]",
52   "[Number.MAX_VALUE]",
53   "[Infinity]",
54
55   "[new Date(0)]",
56   "[new Date(1000)]",
57   "[new Date(1317399931023)]",
58
59   "['']",
60   "['\x00']",
61   "['a']",
62   "['aa']",
63   "['b']",
64   "['ba']",
65
66   "['\xA2']", // U+00A2 CENT SIGN
67   "['\u6C34']", // U+6C34 CJK UNIFIED IDEOGRAPH (water)
68   "['\uD834\uDD1E']", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair)
69   "['\uFFFD']", // U+FFFD REPLACEMENT CHARACTER
70
71   "[[]]",
72
73   "[[], []]",
74   "[[], [], []]",
75
76   "[[[]]]",
77   "[[[[]]]]"
78 ];
79
80
81 var invalid_keys = [
82   "void 0", // undefined
83   "true",
84   "false",
85   "NaN",
86   "null",
87   "{}",
88   "function () {}",
89   "/regex/",
90   "window",
91   "window.document",
92   "window.document.body",
93   "(function() { var cyclic = []; cyclic.push(cyclic); return cyclic; }())"
94 ];
95
96
97 function testValidKeys() {
98   var test_keys = valid_keys.slice(); // make a copy
99   var count = 0, when_complete = testInvalidKeys;
100   testNextKey();
101
102   function testNextKey() {
103     var key = test_keys.shift();
104     if (!key) {
105       when_complete();
106       return;
107     }
108
109     key = eval("(" + key + ")");
110     var value = 'value' + (count++);
111     var trans = db.transaction('store', 'readwrite');
112     var store = trans.objectStore('store');
113     var putreq = store.put(value, key);
114     putreq.onerror = unexpectedErrorCallback;
115     putreq.onsuccess = function() {
116       getreq = store.get(key);
117       getreq.onerror = unexpectedErrorCallback;
118       getreq.onsuccess = function() {
119         shouldBeEqualToString('getreq.result', value);
120       };
121     };
122     trans.oncomplete = testNextKey;
123   }
124 }
125
126 function testInvalidKeys() {
127
128   var trans = db.transaction('store', 'readwrite');
129   var store = trans.objectStore('store');
130
131   invalid_keys.forEach(
132     function(key) {
133       try {
134         key = eval("(" + key + ")");
135         var putreq = store.put('value', key);
136         putreq.onerror = unexpectedErrorCallback;
137         putreq.onsuccess = unexpectedSuccessCallback;
138         return;
139       } catch (e) {
140         window.ex = e;
141         shouldBe("ex.code", "0");
142         shouldBe("ex.name", "'DataError'");
143       }
144     });
145   testKeyOrdering();
146 }
147
148 function testKeyOrdering() {
149
150   for (var i = 0; i < valid_keys.length - 1; ++i) {
151     var key1 = valid_keys[i];
152     var key2 = valid_keys[i + 1];
153
154     shouldBe("indexedDB.cmp(" + key1 + "," +  key2 + ")", "-1");
155     shouldBe("indexedDB.cmp(" + key2 + "," +  key1 + ")", "1");
156     shouldBe("indexedDB.cmp(" + key1 + "," +  key1 + ")", "0");
157     shouldBe("indexedDB.cmp(" + key2 + "," +  key2 + ")", "0");
158   }
159
160   done();
161 }