091cb8d444e5736f129b25b78d9360b3604bc35f
[WebKit-https.git] / LayoutTests / fast / canvas / webgl / data-view-test.html
1 <html>
2 <head>
3 <script src="../../../resources/js-test.js"></script>
4 </head>
5 <body>
6 <div id="description"></div>
7 <div id="console"></div>
8
9 <script>
10 description("Test DataView.");
11
12 var intArray1 = [0, 1, 2, 3, 100, 101, 102, 103, 128, 129, 130, 131, 252, 253, 254, 255];
13 var intArray2 = [31, 32, 33, 0, 1, 2, 3, 100, 101, 102, 103, 128, 129, 130, 131, 252, 253, 254, 255];
14 var emptyArray = [204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204];
15
16 var arayBuffer = null;
17 var view = null;
18 var viewStart = 0;
19 var viewLength = 0;
20
21 function getElementSize(func)
22 {
23     switch (func) {
24     case "Int8":
25     case "Uint8":
26         return 1;
27     case "Int16":
28     case "Uint16":
29         return 2;
30     case "Int32":
31     case "Uint32":
32     case "Float32":
33         return 4;
34     case "Float64":
35         return 8;
36     default:
37         debug("Should not reached");
38     }
39 }
40
41 function checkGet(func, index, expected, littleEndian)
42 {
43     var expr = "view.get" + func + "(" + index;
44     if (littleEndian != undefined) {
45         expr += ", ";
46         expr += littleEndian ? "true" : "false";
47     }
48     expr += ")";
49     if (index >= 0 && index + getElementSize(func) - 1 < view.byteLength)
50         shouldBe(expr, expected);
51     else
52         shouldThrow(expr);
53 }
54
55 function checkSet(func, index, value, littleEndian)
56 {
57     var expr = "view.set" + func + "(" + index + ", " + value;
58     if (littleEndian != undefined) {
59         expr += ", ";
60         expr += littleEndian ? "true" : "false";
61     }
62     expr += ")";
63     if (index >= 0 && index + getElementSize(func) - 1 < view.byteLength) {
64         shouldBeUndefined(expr);
65         checkGet(func, index, value, littleEndian);
66     } else
67         shouldThrow(expr);
68 }
69
70 function test(isTestingGet, func, index, value, littleEndian)
71 {
72     if (isTestingGet)
73         checkGet(func, index, value, littleEndian);
74      else
75         checkSet(func, index, value, littleEndian);
76 }
77
78 function createDataView(array, frontPaddingNum, littleEndian, start, length)
79 {
80     if (!littleEndian)
81         array.reverse();
82     var paddingArray = new Array(frontPaddingNum);
83     arrayBuffer = (new Uint8Array(paddingArray.concat(array))).buffer;
84     viewStart = (start != undefined) ? start : 0;
85     viewLength = (length != undefined) ? length : arrayBuffer.byteLength - viewStart;
86     view = new DataView(arrayBuffer, viewStart, viewLength);
87     if (!littleEndian)
88         array.reverse(); // restore the array.
89 }
90
91 function runIntegerTestCases(isTestingGet, array, start, length)
92 {
93     createDataView(array, 0, true, start, length);
94
95     test(isTestingGet, "Int8", 0, "0");
96     test(isTestingGet, "Int8", 8, "-128");
97     test(isTestingGet, "Int8", 15, "-1");
98
99     test(isTestingGet, "Uint8", 0, "0");
100     test(isTestingGet, "Uint8", 8, "128");
101     test(isTestingGet, "Uint8", 15, "255");
102
103     // Little endian.
104     test(isTestingGet, "Int16", 0, "256", true);
105     test(isTestingGet, "Int16", 5, "26213", true);
106     test(isTestingGet, "Int16", 9, "-32127", true);
107     test(isTestingGet, "Int16", 14, "-2", true);
108
109     // Big endian.
110     test(isTestingGet, "Int16", 0, "1");
111     test(isTestingGet, "Int16", 5, "25958");
112     test(isTestingGet, "Int16", 9, "-32382");
113     test(isTestingGet, "Int16", 14, "-257");
114
115     // Little endian.
116     test(isTestingGet, "Uint16", 0, "256", true);
117     test(isTestingGet, "Uint16", 5, "26213", true);
118     test(isTestingGet, "Uint16", 9, "33409", true);
119     test(isTestingGet, "Uint16", 14, "65534", true);
120
121     // Big endian.
122     test(isTestingGet, "Uint16", 0, "1");
123     test(isTestingGet, "Uint16", 5, "25958");
124     test(isTestingGet, "Uint16", 9, "33154");
125     test(isTestingGet, "Uint16", 14, "65279");
126
127     // Little endian.
128     test(isTestingGet, "Int32", 0, "50462976", true);
129     test(isTestingGet, "Int32", 3, "1717920771", true);
130     test(isTestingGet, "Int32", 6, "-2122291354", true);
131     test(isTestingGet, "Int32", 9, "-58490239", true);
132     test(isTestingGet, "Int32", 12, "-66052", true);
133
134     // Big endian.
135     test(isTestingGet, "Int32", 0, "66051");
136     test(isTestingGet, "Int32", 3, "56911206");
137     test(isTestingGet, "Int32", 6, "1718059137");
138     test(isTestingGet, "Int32", 9, "-2122152964");
139     test(isTestingGet, "Int32", 12, "-50462977");
140
141     // Little endian.
142     test(isTestingGet, "Uint32", 0, "50462976", true);
143     test(isTestingGet, "Uint32", 3, "1717920771", true);
144     test(isTestingGet, "Uint32", 6, "2172675942", true);
145     test(isTestingGet, "Uint32", 9, "4236477057", true);
146     test(isTestingGet, "Uint32", 12, "4294901244", true);
147
148     // Big endian.
149     test(isTestingGet, "Uint32", 0, "66051");
150     test(isTestingGet, "Uint32", 3, "56911206");
151     test(isTestingGet, "Uint32", 6, "1718059137");
152     test(isTestingGet, "Uint32", 9, "2172814332");
153     test(isTestingGet, "Uint32", 12, "4244504319");
154 }
155
156 function testFloat(isTestingGet, func, array, start, expected)
157 {
158     // Little endian.
159     createDataView(array, 0, true, start);
160     test(isTestingGet, func, 0, expected, true);
161     createDataView(array, 3, true, start);
162     test(isTestingGet, func, 3, expected, true);
163     createDataView(array, 7, true, start);
164     test(isTestingGet, func, 7, expected, true);
165     createDataView(array, 10, true, start);
166     test(isTestingGet, func, 10, expected, true);
167     
168     // Big endian.
169     createDataView(array, 0, false);
170     test(isTestingGet, func, 0, expected, false);
171     createDataView(array, 3, false);
172     test(isTestingGet, func, 3, expected, false);
173     createDataView(array, 7, false);
174     test(isTestingGet, func, 7, expected, false);
175     createDataView(array, 10, false);
176     test(isTestingGet, func, 10, expected, false);
177 }
178
179 function runFloatTestCases(isTestingGet, start)
180 {
181     testFloat(isTestingGet, "Float32", isTestingGet ? [0, 0, 32, 65] : emptyArray, start, "10");
182     testFloat(isTestingGet, "Float32", isTestingGet ? [164, 112, 157, 63] : emptyArray, start, "1.2300000190734863");
183     testFloat(isTestingGet, "Float32", isTestingGet ? [95, 53, 50, 199] : emptyArray, start, "-45621.37109375");
184     testFloat(isTestingGet, "Float32", isTestingGet ? [255, 255, 255, 127] : emptyArray, start, "NaN");
185     testFloat(isTestingGet, "Float32", isTestingGet ? [255, 255, 255, 255] : emptyArray, start, "-NaN");
186
187     testFloat(isTestingGet, "Float64", isTestingGet ? [0, 0, 0, 0, 0, 0, 36, 64] : emptyArray, start, "10");
188     testFloat(isTestingGet, "Float64", isTestingGet ? [174, 71, 225, 122, 20, 174, 243, 63] : emptyArray, start, "1.23");
189     testFloat(isTestingGet, "Float64", isTestingGet ? [181, 55, 248, 30, 242, 179, 87, 193] : emptyArray, start, "-6213576.4839");
190     testFloat(isTestingGet, "Float64", isTestingGet ? [255, 255, 255, 255, 255, 255, 255, 127] : emptyArray, start, "NaN");
191     testFloat(isTestingGet, "Float64", isTestingGet ? [255, 255, 255, 255, 255, 255, 255, 255] : emptyArray, start, "-NaN");
192 }
193
194 function runNegativeIndexTests(isTestingGet)
195 {
196     createDataView(intArray1, 0, true, 0, 16);
197
198     test(isTestingGet, "Int8", -1, "0");
199     test(isTestingGet, "Int8", -2, "0");
200
201     test(isTestingGet, "Uint8", -1, "0");
202     test(isTestingGet, "Uint8", -2, "0");
203
204     test(isTestingGet, "Int16", -1, "0");
205     test(isTestingGet, "Int16", -2, "0");
206     test(isTestingGet, "Int16", -3, "0");
207
208     test(isTestingGet, "Uint16", -1, "0");
209     test(isTestingGet, "Uint16", -2, "0");
210     test(isTestingGet, "Uint16", -3, "0");
211
212     test(isTestingGet, "Int32", -1, "0");
213     test(isTestingGet, "Int32", -3, "0");
214     test(isTestingGet, "Int32", -5, "0");
215
216     test(isTestingGet, "Uint32", -1, "0");
217     test(isTestingGet, "Uint32", -3, "0");
218     test(isTestingGet, "Uint32", -5, "0");
219
220     createDataView([0, 0, 0, 0, 0, 0, 36, 64], 0, true, 0, 8);
221
222     test(isTestingGet, "Float32", -1, "0");
223     test(isTestingGet, "Float32", -3, "0");
224     test(isTestingGet, "Float32", -5, "0");
225
226     test(isTestingGet, "Float64", -1, "0");
227     test(isTestingGet, "Float64", -5, "0");
228     test(isTestingGet, "Float64", -9, "0");
229 }
230
231 function runConstructorTests()
232 {
233     arrayBuffer = (new Uint8Array([1, 2])).buffer;
234
235     debug("");
236     debug("Test for constructor not called as a function");
237     var expr = "DataView(new ArrayBuffer)";
238     // Use try/catch instead of calling shouldThrow to avoid different exception message being reported from different platform.
239     try {
240         eval(expr);
241         testFailed(expr + " does not throw exception");
242     } catch (e) {
243         testPassed(expr + " threw exception");
244     }
245
246     debug("");
247     debug("Test for constructor taking 1 argument");
248     shouldBeDefined("view = new DataView(arrayBuffer)");
249     shouldBe("view.byteOffset", "0");
250     shouldBe("view.byteLength", "2");
251
252     debug("");
253     debug("Test for constructor taking 2 arguments");
254     shouldBeDefined("view = new DataView(arrayBuffer, 1)");
255     shouldBe("view.byteOffset", "1");
256     shouldBe("view.byteLength", "1");
257
258     debug("");
259     debug("Test for constructor taking 3 arguments");
260     shouldBeDefined("view = new DataView(arrayBuffer, 0, 1)");
261     shouldBe("view.byteOffset", "0");
262     shouldBe("view.byteLength", "1");
263
264     debug("");
265     debug("Test for constructor throwing exception");
266     shouldThrow("view = new DataView(arrayBuffer, 0, 3)");
267     shouldThrow("view = new DataView(arrayBuffer, 1, 2)");
268     shouldThrow("view = new DataView(arrayBuffer, 2, 1)");
269
270     debug("");
271     debug("Test for constructor throwing wrong byteoffset exception");
272     shouldThrow("view = new Int32Array(new ArrayBuffer(100), 1, 1)");
273
274     debug("");
275     debug("Test for constructor wrong length exception takes precedence over wrong byteoffset exception");
276     shouldThrow("view = new Int32Array(new ArrayBuffer(100), 1, 101)");
277 }
278
279 function runGetTests()
280 {
281     debug("");
282     debug("Test for get methods that work");
283     runIntegerTestCases(true, intArray1, 0, 16);
284     runFloatTestCases(true, 0);
285
286     debug("");
287     debug("Test for get methods that might read beyond range");
288     runIntegerTestCases(true, intArray2, 3, 2);
289     runFloatTestCases(true, 3);
290
291     debug("");
292     debug("Test for get methods that read from negative index");
293     runNegativeIndexTests(true);
294
295     debug("");
296     debug("Test for wrong arguments passed to get methods");
297     view = new DataView((new Uint8Array([1, 2])).buffer);
298     shouldThrow("view.getInt8()");
299     shouldThrow("view.getUint8()");
300     shouldThrow("view.getInt16()");
301     shouldThrow("view.getUint16()");
302     shouldThrow("view.getInt32()");
303     shouldThrow("view.getUint32()");
304     shouldThrow("view.getFloat32()");
305     shouldThrow("view.getFloat64()");
306 }
307
308 function runSetTests()
309 {
310     debug("");
311     debug("Test for set methods that work");
312     runIntegerTestCases(false, emptyArray, 0, 16);
313     runFloatTestCases(false);
314
315     debug("");
316     debug("Test for set methods that might write beyond the range");
317     runIntegerTestCases(false, emptyArray, 3, 2);
318     runFloatTestCases(false, 7);
319
320     debug("");
321     debug("Test for set methods that write to negative index");
322     runNegativeIndexTests(false);
323
324     debug("");
325     debug("Test for wrong arguments passed to set methods");
326     view = new DataView((new Uint8Array([1, 2])).buffer);
327     shouldThrow("view.setInt8()");
328     shouldThrow("view.setUint8()");
329     shouldThrow("view.setInt16()");
330     shouldThrow("view.setUint16()");
331     shouldThrow("view.setInt32()");
332     shouldThrow("view.setUint32()");
333     shouldThrow("view.setFloat32()");
334     shouldThrow("view.setFloat64()");
335     shouldThrow("view.setInt8(1)");
336     shouldThrow("view.setUint8(1)");
337     shouldThrow("view.setInt16(1)");
338     shouldThrow("view.setUint16(1)");
339     shouldThrow("view.setInt32(1)");
340     shouldThrow("view.setUint32(1)");
341     shouldThrow("view.setFloat32(1)");
342     shouldThrow("view.setFloat64(1)");
343 }
344
345 function runIndexingTests()
346 {
347     debug("");
348     debug("Test for indexing that should not work");
349     view = new DataView((new Uint8Array([1, 2])).buffer);
350     shouldBeUndefined("view[0]");
351     shouldBeDefined("view[0] = 3");
352     shouldBe("view.getUint8(0)", "1");
353 }
354
355 runConstructorTests();
356 runGetTests();
357 runSetTests();
358 runIndexingTests();
359 </script>
360 </body>
361 </html>