1<html xmlns="http://www.w3.org/1999/xhtml">
2<head>
3<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
4<script src="../../fast/js/resources/js-test-pre.js"></script>
5</head>
6<body>
7<div id="description"></div>
8<div id="console"></div>
9
10<script>
11
12description("This test exercises the CSSMatrix 3D interface");
13
14debug("");
15debug("CSSMatrix constructors");
16
17var m = null;
18m = new WebKitCSSMatrix();
19if (m)
20 testPassed("default constructor");
21else
22 testFailed("default constructor");
23
24var m2 = new WebKitCSSMatrix(m);
25if (m2)
26 testPassed("object constructor");
27else
28 testFailed("object constructor");
29
30m = new WebKitCSSMatrix("matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)");
31if (m)
32 testPassed("string constructor");
33else
34 testFailed("string constructor");
35
36debug("");
37debug("Test toString");
38var m = new WebKitCSSMatrix("matrix3d(1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)");
39var s = m.toString();
40var a = s.split('(');
41shouldBe('a[0]', '"matrix3d"');
42var a2 = a[1].split(',');
43shouldBe('parseFloat(a2[0])', '1');
44shouldBe('parseFloat(a2[1])', '0');
45shouldBe('parseFloat(a2[2])', '0');
46shouldBe('parseFloat(a2[3])', '1');
47shouldBe('parseFloat(a2[4])', '0');
48shouldBe('parseFloat(a2[5])', '1');
49shouldBe('parseFloat(a2[6])', '0');
50shouldBe('parseFloat(a2[7])', '0');
51shouldBe('parseFloat(a2[8])', '0');
52shouldBe('parseFloat(a2[9])', '0');
53shouldBe('parseFloat(a2[10])', '1');
54shouldBe('parseFloat(a2[11])', '0');
55shouldBe('parseFloat(a2[12])', '0');
56shouldBe('parseFloat(a2[13])', '0');
57shouldBe('parseFloat(a2[14])', '0');
58var a3 = a2[15].split(")");
59shouldBe('parseFloat(a3[0])', '1');
60shouldBe('a3[1]', '""');
61
62debug("");
63debug("Test bad input to string constructor");
64shouldThrow('new WebKitCSSMatrix("banana")');
65
66debug("");
67debug("Test attributes on default matrix");
68m = new WebKitCSSMatrix();
69shouldBe('m.m11', '1');
70shouldBe('m.m12', '0');
71shouldBe('m.m13', '0');
72shouldBe('m.m14', '0');
73shouldBe('m.m21', '0');
74shouldBe('m.m22', '1');
75shouldBe('m.m23', '0');
76shouldBe('m.m24', '0');
77shouldBe('m.m31', '0');
78shouldBe('m.m32', '0');
79shouldBe('m.m33', '1');
80shouldBe('m.m34', '0');
81shouldBe('m.m41', '0');
82shouldBe('m.m42', '0');
83shouldBe('m.m43', '0');
84shouldBe('m.m44', '1');
85
86debug("");
87debug("Test attributes on custom matrix");
88m = new WebKitCSSMatrix("matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44)");
89shouldBe('m.m11', '11');
90shouldBe('m.m12', '12');
91shouldBe('m.m13', '13');
92shouldBe('m.m14', '14');
93shouldBe('m.m21', '21');
94shouldBe('m.m22', '22');
95shouldBe('m.m23', '23');
96shouldBe('m.m24', '24');
97shouldBe('m.m31', '31');
98shouldBe('m.m32', '32');
99shouldBe('m.m33', '33');
100shouldBe('m.m34', '34');
101shouldBe('m.m41', '41');
102shouldBe('m.m42', '42');
103shouldBe('m.m43', '43');
104shouldBe('m.m44', '44');
105
106debug("");
107debug("Test setMatrixValue - set to matrix()");
108m = new WebKitCSSMatrix();
109m.setMatrixValue("matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44)");
110shouldBe('m.m11', '11');
111shouldBe('m.m12', '12');
112shouldBe('m.m13', '13');
113shouldBe('m.m14', '14');
114shouldBe('m.m21', '21');
115shouldBe('m.m22', '22');
116shouldBe('m.m23', '23');
117shouldBe('m.m24', '24');
118shouldBe('m.m31', '31');
119shouldBe('m.m32', '32');
120shouldBe('m.m33', '33');
121shouldBe('m.m34', '34');
122shouldBe('m.m41', '41');
123shouldBe('m.m42', '42');
124shouldBe('m.m43', '43');
125shouldBe('m.m44', '44');
126
127debug("");
128debug("Test setMatrixValue - set to translate(10px, 20px, 30px) scale(2, 3, 4)");
129m = new WebKitCSSMatrix();
130m.setMatrixValue("translate3d(10px, 20px, 30px) scale3d(2, 3, 4)");
131shouldBe('m.m11', '2');
132shouldBe('m.m12', '0');
133shouldBe('m.m13', '0');
134shouldBe('m.m14', '0');
135shouldBe('m.m21', '0');
136shouldBe('m.m22', '3');
137shouldBe('m.m23', '0');
138shouldBe('m.m24', '0');
139shouldBe('m.m31', '0');
140shouldBe('m.m32', '0');
141shouldBe('m.m33', '4');
142shouldBe('m.m34', '0');
143shouldBe('m.m41', '10');
144shouldBe('m.m42', '20');
145shouldBe('m.m43', '30');
146shouldBe('m.m44', '1');
147
148debug("");
149debug("Test throwing exception from setMatrixValue");
150shouldThrow('m.setMatrixValue("banana")');
151shouldThrow('m.setMatrixValue("translate3d(10em, 20%, 40)")');
152shouldThrow('m.setMatrixValue("translate3d(10px, 20px, 30px) scale3d()")');
153
154debug("");
155debug("Test multiply");
156m = new WebKitCSSMatrix("matrix3d( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)");
157m2 = new WebKitCSSMatrix("matrix3d(17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)");
158var m3 = m.multiply(m2);
159shouldBe('parseFloat(m3.m11)', '250');
160shouldBe('parseFloat(m3.m12)', '260');
161shouldBe('parseFloat(m3.m13)', '270');
162shouldBe('parseFloat(m3.m14)', '280');
163shouldBe('parseFloat(m3.m21)', '618');
164shouldBe('parseFloat(m3.m22)', '644');
165shouldBe('parseFloat(m3.m23)', '670');
166shouldBe('parseFloat(m3.m24)', '696');
167shouldBe('parseFloat(m3.m31)', '986');
168shouldBe('parseFloat(m3.m32)', '1028');
169shouldBe('parseFloat(m3.m33)', '1070');
170shouldBe('parseFloat(m3.m34)', '1112');
171shouldBe('parseFloat(m3.m41)', '1354');
172shouldBe('parseFloat(m3.m42)', '1412');
173shouldBe('parseFloat(m3.m43)', '1470');
174shouldBe('parseFloat(m3.m44)', '1528');
175
176debug("");
177debug("Test immutability of multiply");
178shouldBe('parseFloat(m.m11)', '1');
179shouldBe('parseFloat(m.m12)', '2');
180shouldBe('parseFloat(m.m13)', '3');
181shouldBe('parseFloat(m.m14)', '4');
182shouldBe('parseFloat(m.m21)', '5');
183shouldBe('parseFloat(m.m22)', '6');
184shouldBe('parseFloat(m.m23)', '7');
185shouldBe('parseFloat(m.m24)', '8');
186shouldBe('parseFloat(m.m31)', '9');
187shouldBe('parseFloat(m.m32)', '10');
188shouldBe('parseFloat(m.m33)', '11');
189shouldBe('parseFloat(m.m34)', '12');
190shouldBe('parseFloat(m.m41)', '13');
191shouldBe('parseFloat(m.m42)', '14');
192shouldBe('parseFloat(m.m43)', '15');
193shouldBe('parseFloat(m.m44)', '16');
194
195debug("");
196debug("Test inverse");
197m = new WebKitCSSMatrix("matrix3d(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 10, 20, 30, 1)");
198m2 = m.inverse();
199
200shouldBe('parseFloat(m2.m11)', '0.5');
201shouldBe('parseFloat(m2.m12)', '0');
202shouldBe('parseFloat(m2.m13)', '0');
203shouldBe('parseFloat(m2.m14)', '0');
204shouldBe('parseFloat(m2.m21)', '0');
205shouldBe('parseFloat(m2.m22)', '0.5');
206shouldBe('parseFloat(m2.m23)', '0');
207shouldBe('parseFloat(m2.m24)', '0');
208shouldBe('parseFloat(m2.m31)', '0');
209shouldBe('parseFloat(m2.m32)', '0');
210shouldBe('parseFloat(m2.m33)', '0.5');
211shouldBe('parseFloat(m2.m34)', '0');
212shouldBe('parseFloat(m2.m41)', '-5');
213shouldBe('parseFloat(m2.m42)', '-10');
214shouldBe('parseFloat(m2.m43)', '-15');
215shouldBe('parseFloat(m2.m44)', '1');
216
217debug("");
218debug("Test immutability of inverse");
219shouldBe('parseFloat(m.m11)', '2');
220shouldBe('parseFloat(m.m12)', '0');
221shouldBe('parseFloat(m.m13)', '0');
222shouldBe('parseFloat(m.m14)', '0');
223shouldBe('parseFloat(m.m21)', '0');
224shouldBe('parseFloat(m.m22)', '2');
225shouldBe('parseFloat(m.m23)', '0');
226shouldBe('parseFloat(m.m24)', '0');
227shouldBe('parseFloat(m.m31)', '0');
228shouldBe('parseFloat(m.m32)', '0');
229shouldBe('parseFloat(m.m33)', '2');
230shouldBe('parseFloat(m.m34)', '0');
231shouldBe('parseFloat(m.m41)', '10');
232shouldBe('parseFloat(m.m42)', '20');
233shouldBe('parseFloat(m.m43)', '30');
234shouldBe('parseFloat(m.m44)', '1');
235
236debug("");
237debug("Test throwing exception from inverse");
238m = new WebKitCSSMatrix("matrix3d(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)"); // not invertible
239shouldThrow('m.inverse()');
240
241debug("");
242debug("Test translate");
243m = new WebKitCSSMatrix();
244var m2 = m.translate(10, 20, 30);
245shouldBe('m2.m11', '1');
246shouldBe('m2.m12', '0');
247shouldBe('m2.m13', '0');
248shouldBe('m2.m14', '0');
249shouldBe('m2.m21', '0');
250shouldBe('m2.m22', '1');
251shouldBe('m2.m23', '0');
252shouldBe('m2.m24', '0');
253shouldBe('m2.m31', '0');
254shouldBe('m2.m32', '0');
255shouldBe('m2.m33', '1');
256shouldBe('m2.m34', '0');
257shouldBe('m2.m41', '10');
258shouldBe('m2.m42', '20');
259shouldBe('m2.m43', '30');
260shouldBe('m2.m44', '1');
261
262debug("");
263debug("Test immutability of translate");
264shouldBe('m.m11', '1');
265shouldBe('m.m12', '0');
266shouldBe('m.m13', '0');
267shouldBe('m.m14', '0');
268shouldBe('m.m21', '0');
269shouldBe('m.m22', '1');
270shouldBe('m.m23', '0');
271shouldBe('m.m24', '0');
272shouldBe('m.m31', '0');
273shouldBe('m.m32', '0');
274shouldBe('m.m33', '1');
275shouldBe('m.m34', '0');
276shouldBe('m.m41', '0');
277shouldBe('m.m42', '0');
278shouldBe('m.m43', '0');
279shouldBe('m.m44', '1');
280
281debug("");
282debug("Test scale");
283m = new WebKitCSSMatrix();
284m2 = m.scale(10, 20, 30);
285shouldBe('m2.m11', '10');
286shouldBe('m2.m12', '0');
287shouldBe('m2.m13', '0');
288shouldBe('m2.m14', '0');
289shouldBe('m2.m21', '0');
290shouldBe('m2.m22', '20');
291shouldBe('m2.m23', '0');
292shouldBe('m2.m24', '0');
293shouldBe('m2.m31', '0');
294shouldBe('m2.m32', '0');
295shouldBe('m2.m33', '30');
296shouldBe('m2.m34', '0');
297shouldBe('m2.m41', '0');
298shouldBe('m2.m42', '0');
299shouldBe('m2.m43', '0');
300shouldBe('m2.m44', '1');
301
302debug("");
303debug("Test immutability of scale");
304shouldBe('m.m11', '1');
305shouldBe('m.m12', '0');
306shouldBe('m.m13', '0');
307shouldBe('m.m14', '0');
308shouldBe('m.m21', '0');
309shouldBe('m.m22', '1');
310shouldBe('m.m23', '0');
311shouldBe('m.m24', '0');
312shouldBe('m.m31', '0');
313shouldBe('m.m32', '0');
314shouldBe('m.m33', '1');
315shouldBe('m.m34', '0');
316shouldBe('m.m41', '0');
317shouldBe('m.m42', '0');
318shouldBe('m.m43', '0');
319shouldBe('m.m44', '1');
320
321debug("");
322debug("Test rotate");
323m = new WebKitCSSMatrix();
324m2 = m.rotate(10, 20, 30);
325shouldBe('parseFloat(m2.m11.toPrecision(6))', '0.813798');
326shouldBe('parseFloat(m2.m12.toPrecision(6))', '0.469846');
327shouldBe('parseFloat(m2.m13.toPrecision(6))', '-0.34202');
328shouldBe('parseFloat(m2.m14.toPrecision(6))', '0');
329shouldBe('parseFloat(m2.m21.toPrecision(6))', '-0.44097');
330shouldBe('parseFloat(m2.m22.toPrecision(6))', '0.882564');
331shouldBe('parseFloat(m2.m23.toPrecision(6))', '0.163176');
332shouldBe('parseFloat(m2.m24.toPrecision(6))', '0');
333shouldBe('parseFloat(m2.m31.toPrecision(6))', '0.378522');
334shouldBe('parseFloat(m2.m32.toPrecision(6))', '0.0180283');
335shouldBe('parseFloat(m2.m33.toPrecision(6))', '0.925417');
336shouldBe('parseFloat(m2.m34.toPrecision(6))', '0');
337shouldBe('parseFloat(m2.m41.toPrecision(6))', '0');
338shouldBe('parseFloat(m2.m42.toPrecision(6))', '0');
339shouldBe('parseFloat(m2.m43.toPrecision(6))', '0');
340shouldBe('parseFloat(m2.m44.toPrecision(6))', '1');
341
342debug("");
343debug("Test immutability of rotate");
344shouldBe('m.m11', '1');
345shouldBe('m.m12', '0');
346shouldBe('m.m13', '0');
347shouldBe('m.m14', '0');
348shouldBe('m.m21', '0');
349shouldBe('m.m22', '1');
350shouldBe('m.m23', '0');
351shouldBe('m.m24', '0');
352shouldBe('m.m31', '0');
353shouldBe('m.m32', '0');
354shouldBe('m.m33', '1');
355shouldBe('m.m34', '0');
356shouldBe('m.m41', '0');
357shouldBe('m.m42', '0');
358shouldBe('m.m43', '0');
359shouldBe('m.m44', '1');
360
361debug("");
362debug("Test rotateAxisAngle");
363m = new WebKitCSSMatrix();
364m2 = m.rotateAxisAngle(0.707, 0.707, 0.707, 45);
365shouldBe('parseFloat(m2.m11.toPrecision(6))', '0.804738');
366shouldBe('parseFloat(m2.m12.toPrecision(6))', '0.505879');
367shouldBe('parseFloat(m2.m13.toPrecision(6))', '-0.310617');
368shouldBe('parseFloat(m2.m14.toPrecision(6))', '0');
369shouldBe('parseFloat(m2.m21.toPrecision(6))', '-0.310617');
370shouldBe('parseFloat(m2.m22.toPrecision(6))', '0.804738');
371shouldBe('parseFloat(m2.m23.toPrecision(6))', '0.505879');
372shouldBe('parseFloat(m2.m24.toPrecision(6))', '0');
373shouldBe('parseFloat(m2.m31.toPrecision(6))', '0.505879');
374shouldBe('parseFloat(m2.m32.toPrecision(6))', '-0.310617');
375shouldBe('parseFloat(m2.m33.toPrecision(6))', '0.804738');
376shouldBe('parseFloat(m2.m34.toPrecision(6))', '0');
377shouldBe('parseFloat(m2.m41.toPrecision(6))', '0');
378shouldBe('parseFloat(m2.m42.toPrecision(6))', '0');
379shouldBe('parseFloat(m2.m43.toPrecision(6))', '0');
380shouldBe('parseFloat(m2.m44.toPrecision(6))', '1');
381
382debug("");
383debug("Test immutability of rotateAxisAngle");
384shouldBe('m.m11', '1');
385shouldBe('m.m12', '0');
386shouldBe('m.m13', '0');
387shouldBe('m.m14', '0');
388shouldBe('m.m21', '0');
389shouldBe('m.m22', '1');
390shouldBe('m.m23', '0');
391shouldBe('m.m24', '0');
392shouldBe('m.m31', '0');
393shouldBe('m.m32', '0');
394shouldBe('m.m33', '1');
395shouldBe('m.m34', '0');
396shouldBe('m.m41', '0');
397shouldBe('m.m42', '0');
398shouldBe('m.m43', '0');
399shouldBe('m.m44', '1');
400
401debug("");
402successfullyParsed = true;
403
404</script>
405<script src="../../fast/js/resources/js-test-post.js"></script>
406
407<script>
408</script>
409
410</body>
411</html>