Web Inspector: add RemoteObject.fetchProperties and some basic tests for RemoteObject API
[WebKit-https.git] / JSTests / exceptionFuzz / 3d-cube.js
1 var enableExceptionFuzz = $vm.enableExceptionFuzz;
2
3 try {
4
5 // 3D Cube Rotation
6 // http://www.speich.net/computer/moztesting/3d.htm
7 // Created by Simon Speich
8
9 enableExceptionFuzz();
10
11
12 var Q = new Array();
13 var MTrans = new Array();  // transformation matrix
14 var MQube = new Array();  // position information of qube
15 var I = new Array();      // entity matrix
16 var Origin = new Object();
17 var Testing = new Object();
18 var LoopTimer;
19
20 var validation = {
21  20: 2889.0000000000045,
22  40: 2889.0000000000055,
23  80: 2889.000000000005,
24  160: 2889.0000000000055
25 };
26
27 var DisplArea = new Object();
28 DisplArea.Width = 300;
29 DisplArea.Height = 300;
30
31 function DrawLine(From, To) {
32   var x1 = From.V[0];
33   var x2 = To.V[0];
34   var y1 = From.V[1];
35   var y2 = To.V[1];
36   var dx = Math.abs(x2 - x1);
37   var dy = Math.abs(y2 - y1);
38   var x = x1;
39   var y = y1;
40   var IncX1, IncY1;
41   var IncX2, IncY2;  
42   var Den;
43   var Num;
44   var NumAdd;
45   var NumPix;
46
47   if (x2 >= x1) {  IncX1 = 1; IncX2 = 1;  }
48   else { IncX1 = -1; IncX2 = -1; }
49   if (y2 >= y1)  {  IncY1 = 1; IncY2 = 1; }
50   else { IncY1 = -1; IncY2 = -1; }
51   if (dx >= dy) {
52     IncX1 = 0;
53     IncY2 = 0;
54     Den = dx;
55     Num = dx / 2;
56     NumAdd = dy;
57     NumPix = dx;
58   }
59   else {
60     IncX2 = 0;
61     IncY1 = 0;
62     Den = dy;
63     Num = dy / 2;
64     NumAdd = dx;
65     NumPix = dy;
66   }
67
68   NumPix = Math.round(Q.LastPx + NumPix);
69
70   var i = Q.LastPx;
71   for (; i < NumPix; i++) {
72     Num += NumAdd;
73     if (Num >= Den) {
74       Num -= Den;
75       x += IncX1;
76       y += IncY1;
77     }
78     x += IncX2;
79     y += IncY2;
80   }
81   Q.LastPx = NumPix;
82 }
83
84 function CalcCross(V0, V1) {
85   var Cross = new Array();
86   Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
87   Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
88   Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
89   return Cross;
90 }
91
92 function CalcNormal(V0, V1, V2) {
93   var A = new Array();   var B = new Array(); 
94   for (var i = 0; i < 3; i++) {
95     A[i] = V0[i] - V1[i];
96     B[i] = V2[i] - V1[i];
97   }
98   A = CalcCross(A, B);
99   var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 
100   for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
101   A[3] = 1;
102   return A;
103 }
104
105 function CreateP(X,Y,Z) {
106   this.V = [X,Y,Z,1];
107 }
108
109 // multiplies two matrices
110 function MMulti(M1, M2) {
111   var M = [[],[],[],[]];
112   var i = 0;
113   var j = 0;
114   for (; i < 4; i++) {
115     j = 0;
116     for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j];
117   }
118   return M;
119 }
120
121 //multiplies matrix with vector
122 function VMulti(M, V) {
123   var Vect = new Array();
124   var i = 0;
125   for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3];
126   return Vect;
127 }
128
129 function VMulti2(M, V) {
130   var Vect = new Array();
131   var i = 0;
132   for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
133   return Vect;
134 }
135
136 // add to matrices
137 function MAdd(M1, M2) {
138   var M = [[],[],[],[]];
139   var i = 0;
140   var j = 0;
141   for (; i < 4; i++) {
142     j = 0;
143     for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
144   }
145   return M;
146 }
147
148 function Translate(M, Dx, Dy, Dz) {
149   var T = [
150   [1,0,0,Dx],
151   [0,1,0,Dy],
152   [0,0,1,Dz],
153   [0,0,0,1]
154   ];
155   return MMulti(T, M);
156 }
157
158 function RotateX(M, Phi) {
159   var a = Phi;
160   a *= Math.PI / 180;
161   var Cos = Math.cos(a);
162   var Sin = Math.sin(a);
163   var R = [
164   [1,0,0,0],
165   [0,Cos,-Sin,0],
166   [0,Sin,Cos,0],
167   [0,0,0,1]
168   ];
169   return MMulti(R, M);
170 }
171
172 function RotateY(M, Phi) {
173   var a = Phi;
174   a *= Math.PI / 180;
175   var Cos = Math.cos(a);
176   var Sin = Math.sin(a);
177   var R = [
178   [Cos,0,Sin,0],
179   [0,1,0,0],
180   [-Sin,0,Cos,0],
181   [0,0,0,1]
182   ];
183   return MMulti(R, M);
184 }
185
186 function RotateZ(M, Phi) {
187   var a = Phi;
188   a *= Math.PI / 180;
189   var Cos = Math.cos(a);
190   var Sin = Math.sin(a);
191   var R = [
192   [Cos,-Sin,0,0],
193   [Sin,Cos,0,0],
194   [0,0,1,0],   
195   [0,0,0,1]
196   ];
197   return MMulti(R, M);
198 }
199
200 function DrawQube() {
201   // calc current normals
202   var CurN = new Array();
203   var i = 5;
204   Q.LastPx = 0;
205   for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
206   if (CurN[0][2] < 0) {
207     if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
208     if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
209     if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
210     if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
211   }
212   if (CurN[1][2] < 0) {
213     if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
214     if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
215     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
216     if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
217   }
218   if (CurN[2][2] < 0) {
219     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
220     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
221     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
222     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
223   }
224   if (CurN[3][2] < 0) {
225     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
226     if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
227     if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
228     if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
229   }
230   if (CurN[4][2] < 0) {
231     if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
232     if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
233     if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
234     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
235   }
236   if (CurN[5][2] < 0) {
237     if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
238     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
239     if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
240     if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
241   }
242   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
243   Q.LastPx = 0;
244 }
245
246 function Loop() {
247   if (Testing.LoopCount > Testing.LoopMax) return;
248   var TestingStr = String(Testing.LoopCount);
249   while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
250   MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
251   MTrans = RotateX(MTrans, 1);
252   MTrans = RotateY(MTrans, 3);
253   MTrans = RotateZ(MTrans, 5);
254   MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
255   MQube = MMulti(MTrans, MQube);
256   var i = 8;
257   for (; i > -1; i--) {
258     Q[i].V = VMulti(MTrans, Q[i].V);
259   }
260   DrawQube();
261   Testing.LoopCount++;
262   Loop();
263 }
264
265 function Init(CubeSize) {
266   // init/reset vars
267   Origin.V = [150,150,20,1];
268   Testing.LoopCount = 0;
269   Testing.LoopMax = 50;
270   Testing.TimeMax = 0;
271   Testing.TimeAvg = 0;
272   Testing.TimeMin = 0;
273   Testing.TimeTemp = 0;
274   Testing.TimeTotal = 0;
275   Testing.Init = false;
276
277   // transformation matrix
278   MTrans = [
279   [1,0,0,0],
280   [0,1,0,0],
281   [0,0,1,0],
282   [0,0,0,1]
283   ];
284   
285   // position information of qube
286   MQube = [
287   [1,0,0,0],
288   [0,1,0,0],
289   [0,0,1,0],
290   [0,0,0,1]
291   ];
292   
293   // entity matrix
294   I = [
295   [1,0,0,0],
296   [0,1,0,0],
297   [0,0,1,0],
298   [0,0,0,1]
299   ];
300   
301   // create qube
302   Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
303   Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
304   Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
305   Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
306   Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
307   Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
308   Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
309   Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
310   
311   // center of gravity
312   Q[8] = new CreateP(0, 0, 0);
313   
314   // anti-clockwise edge check
315   Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
316   
317   // calculate squad normals
318   Q.Normal = new Array();
319   for (var i = 0; i < Q.Edge.length; i++) Q.Normal[i] = CalcNormal(Q[Q.Edge[i][0]].V, Q[Q.Edge[i][1]].V, Q[Q.Edge[i][2]].V);
320   
321   // line drawn ?
322   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
323   
324   // create line pixels
325   Q.NumPx = 9 * 2 * CubeSize;
326   for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
327   
328   MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
329   MQube = MMulti(MTrans, MQube);
330
331   var i = 0;
332   for (; i < 9; i++) {
333     Q[i].V = VMulti(MTrans, Q[i].V);
334   }
335   DrawQube();
336   Testing.Init = true;
337   Loop();
338   
339   // Perform a simple sum-based verification.
340   var sum = 0;
341   for (var i = 0; i < Q.length; ++i) {
342     var vector = Q[i].V;
343     for (var j = 0; j < vector.length; ++j)
344       sum += vector[j];
345   }
346   if (sum != validation[CubeSize])
347     throw "Error: bad vector sum for CubeSize = " + CubeSize + "; expected " + validation[CubeSize] + " but got " + sum;
348 }
349
350 for ( var i = 20; i <= 160; i *= 2 ) {
351   Init(i);
352 }
353
354 Q = null;
355 MTrans = null;
356 MQube = null;
357 I = null;
358 Origin = null;
359 Testing = null;
360 LoopTime = null;
361 DisplArea = null;
362
363 } catch (e) {
364     print("JSC EXCEPTION FUZZ: Caught exception: " + e);
365 }