2c9d3977dba2afa3b915e78e15576477f256aefb
[WebKit-https.git] / PerformanceTests / Speedometer / resources / tests.js
1 var numberOfItemsToAdd = 100;
2 var Suites = [];
3 var ENTER_KEY_CODE = 13;
4
5 var triggerEnter = function (element, type) {
6     var event = document.createEvent('Events');
7     event.initEvent(type, true, true);
8     event.keyCode = ENTER_KEY_CODE;
9     event.which = ENTER_KEY_CODE;
10     event.key = 'ENTER';
11     element.dispatchEvent(event);
12 }
13
14 Suites.push({
15     name: 'VanillaJS-TodoMVC',
16     url: 'todomvc/vanilla-examples/vanillajs/index.html',
17     prepare: function (runner, contentWindow, contentDocument) {
18         return runner.waitForElement('.new-todo').then(function (element) {
19             element.focus();
20             return element;
21         });
22     },
23     tests: [
24         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
25             for (var i = 0; i < numberOfItemsToAdd; i++) {
26                 newTodo.value = 'Something to do ' + i;
27                 newTodo.dispatchEvent(new Event('change'));
28                 triggerEnter(newTodo, 'keypress');
29             }
30         }),
31         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
32             var checkboxes = contentDocument.querySelectorAll('.toggle');
33             for (var i = 0; i < checkboxes.length; i++)
34                 checkboxes[i].click();
35         }),
36         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
37             var deleteButtons = contentDocument.querySelectorAll('.destroy');
38             for (var i = 0; i < deleteButtons.length; i++)
39                 deleteButtons[i].click();
40         }),
41     ]
42 });
43
44 Suites.push({
45     name: 'Vanilla-ES2015-TodoMVC',
46     url: 'todomvc/vanilla-examples/es2015/index.html',
47     prepare: function (runner, contentWindow, contentDocument) {
48         return runner.waitForElement('.new-todo').then(function (element) {
49             element.focus();
50             return element;
51         });
52     },
53     tests: [
54         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
55             for (var i = 0; i < numberOfItemsToAdd; i++) {
56                 newTodo.value = 'Something to do ' + i;
57                 newTodo.dispatchEvent(new Event('change'));
58                 triggerEnter(newTodo, 'keypress');
59             }
60         }),
61         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
62             var checkboxes = contentDocument.querySelectorAll('.toggle');
63             for (var i = 0; i < checkboxes.length; i++)
64                 checkboxes[i].click();
65         }),
66         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
67             var deleteButtons = contentDocument.querySelectorAll('.destroy');
68             for (var i = 0; i < deleteButtons.length; i++)
69                 deleteButtons[i].click();
70         }),
71     ]
72 });
73
74 Suites.push({
75     name: 'Vanilla-ES2015-Babel-Webpack-TodoMVC',
76     url: 'todomvc/vanilla-examples/es2015-babel-webpack/dist/index.html',
77     prepare: function (runner, contentWindow, contentDocument) {
78         return runner.waitForElement('.new-todo').then(function (element) {
79             element.focus();
80             return element;
81         });
82     },
83     tests: [
84         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
85             for (var i = 0; i < numberOfItemsToAdd; i++) {
86                 newTodo.value = 'Something to do ' + i;
87                 newTodo.dispatchEvent(new Event('change'));
88                 triggerEnter(newTodo, 'keypress');
89             }
90         }),
91         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
92             var checkboxes = contentDocument.querySelectorAll('.toggle');
93             for (var i = 0; i < checkboxes.length; i++)
94                 checkboxes[i].click();
95         }),
96         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
97             var deleteButtons = contentDocument.querySelectorAll('.destroy');
98             for (var i = 0; i < deleteButtons.length; i++)
99                 deleteButtons[i].click();
100         }),
101     ]
102 });
103
104 Suites.push({
105     name: 'React-TodoMVC',
106     url: 'todomvc/architecture-examples/react/index.html',
107     prepare: function (runner, contentWindow, contentDocument) {
108         contentWindow.app.Utils.store = function () {}
109         return runner.waitForElement('.new-todo').then(function (element) {
110             element.focus();
111             return element;
112         });
113     },
114     tests: [
115         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
116             for (var i = 0; i < numberOfItemsToAdd; i++) {
117                 newTodo.value = 'Something to do ' + i;
118                 newTodo.dispatchEvent(new Event('input', {
119                   bubbles: true,
120                   cancelable: true
121                 }));
122                 triggerEnter(newTodo, 'keydown');
123             }
124         }),
125         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
126             var checkboxes = contentDocument.querySelectorAll('.toggle');
127             for (var i = 0; i < checkboxes.length; i++)
128                 checkboxes[i].click();
129         }),
130         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
131             var deleteButtons = contentDocument.querySelectorAll('.destroy');
132             for (var i = 0; i < deleteButtons.length; i++)
133                 deleteButtons[i].click();
134         }),
135     ]
136 });
137
138 Suites.push({
139     name: 'React-Redux-TodoMVC',
140     url: 'todomvc/architecture-examples/react-redux/dist/index.html',
141     prepare: function (runner, contentWindow, contentDocument) {
142         return runner.waitForElement('.new-todo').then(function (element) {
143             element.focus();
144             return element;
145         });
146     },
147     tests: [
148         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
149             for (var i = 0; i < numberOfItemsToAdd; i++) {
150                 newTodo.value = 'Something to do ' + i;
151                 triggerEnter(newTodo, 'keydown');
152             }
153         }),
154         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
155             var checkboxes = contentDocument.querySelectorAll('.toggle');
156             for (var i = 0; i < checkboxes.length; i++)
157                 checkboxes[i].click();
158         }),
159         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
160             var deleteButtons = contentDocument.querySelectorAll('.destroy');
161             for (var i = 0; i < deleteButtons.length; i++)
162                 deleteButtons[i].click();
163         }),
164     ]
165 });
166
167 Suites.push({
168     name: 'EmberJS-TodoMVC',
169     url: 'todomvc/architecture-examples/emberjs/index.html',
170     prepare: function (runner, contentWindow, contentDocument) {
171         return runner.waitForElement('#new-todo').then(function (element) {
172             element.focus();
173             return element;
174         });
175     },
176     tests: [
177         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
178             for (var i = 0; i < numberOfItemsToAdd; i++) {
179                 newTodo.value = 'Something to do ' + i;
180                 triggerEnter(newTodo, 'keydown');
181             }
182         }),
183         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
184             var checkboxes = contentDocument.querySelectorAll('.toggle');
185             for (var i = 0; i < checkboxes.length; i++)
186                 checkboxes[i].click();
187         }),
188         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
189             var deleteButtons = contentDocument.querySelectorAll('.destroy');
190             for (var i = 0; i < deleteButtons.length; i++)
191                 deleteButtons[i].click();
192         }),
193     ]
194 });
195
196 Suites.push({
197     name: 'BackboneJS-TodoMVC',
198     url: 'todomvc/architecture-examples/backbone/index.html',
199     prepare: function (runner, contentWindow, contentDocument) {
200     contentWindow.Backbone.sync = function () {}
201         return runner.waitForElement('.new-todo').then(function (element) {
202             element.focus();
203             return element;
204         });
205     },
206     tests: [
207         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
208             for (var i = 0; i < numberOfItemsToAdd; i++) {
209                 newTodo.value = 'Something to do ' + i;
210                 triggerEnter(newTodo, 'keypress');
211             }
212         }),
213         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
214             var checkboxes = contentDocument.querySelectorAll('.toggle');
215             for (var i = 0; i < checkboxes.length; i++)
216                 checkboxes[i].click();
217         }),
218         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
219             var deleteButtons = contentDocument.querySelectorAll('.destroy');
220             for (var i = 0; i < deleteButtons.length; i++)
221                 deleteButtons[i].click();
222         }),
223     ]
224 });
225
226 Suites.push({
227     name: 'AngularJS-TodoMVC',
228     url: 'todomvc/architecture-examples/angularjs/index.html',
229     prepare: function (runner, contentWindow, contentDocument) {
230         return runner.waitForElement('#new-todo').then(function (element) {
231             element.focus();
232             return element;
233         });
234     },
235     tests: [
236         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
237             var submitEvent = document.createEvent('Event');
238             submitEvent.initEvent('submit', true, true);
239             var inputEvent = document.createEvent('Event');
240             inputEvent.initEvent('input', true, true);
241             for (var i = 0; i < numberOfItemsToAdd; i++) {
242                 newTodo.value = 'Something to do ' + i;
243                 newTodo.dispatchEvent(inputEvent);
244                 newTodo.form.dispatchEvent(submitEvent);
245             }
246         }),
247         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
248             var checkboxes = contentDocument.querySelectorAll('.toggle');
249             for (var i = 0; i < checkboxes.length; i++)
250                 checkboxes[i].click();
251         }),
252         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
253             var deleteButtons = contentDocument.querySelectorAll('.destroy');
254             for (var i = 0; i < deleteButtons.length; i++)
255                 deleteButtons[i].click();
256         }),
257     ]
258 });
259
260 Suites.push({
261     name: 'Angular2-TypeScript-TodoMVC',
262     url: 'todomvc/architecture-examples/angular/dist/index.html',
263     prepare: function (runner, contentWindow, contentDocument) {
264         return runner.waitForElement('.new-todo').then(function (element) {
265             element.focus();
266             return element;
267         });
268     },
269     tests: [
270         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
271             for (var i = 0; i < numberOfItemsToAdd; i++) {
272                 newTodo.value = 'Something to do ' + i;
273                 newTodo.dispatchEvent(new Event('input', {
274                   bubbles: true,
275                   cancelable: true
276                 }));
277                 triggerEnter(newTodo, 'keyup');
278             }
279         }),
280         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
281             var checkboxes = contentDocument.querySelectorAll('.toggle');
282             for (var i = 0; i < checkboxes.length; i++)
283                 checkboxes[i].click();
284         }),
285         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
286             var deleteButtons = contentDocument.querySelectorAll('.destroy');
287             for (var i = 0; i < deleteButtons.length; i++)
288                 deleteButtons[i].click();
289         }),
290     ]
291 });
292
293 Suites.push({
294     name: 'VueJS-TodoMVC',
295     url: 'todomvc/architecture-examples/vuejs-cli/dist/index.html',
296     prepare: function (runner, contentWindow, contentDocument) {
297         return runner.waitForElement('.new-todo').then(function (element) {
298             element.focus();
299             return element;
300         });
301     },
302     tests: [
303         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
304             for (var i = 0; i < numberOfItemsToAdd; i++) {
305                 newTodo.value = 'Something to do ' + i;
306                 newTodo.dispatchEvent(new Event('input', {
307                   bubbles: true,
308                   cancelable: true
309                 }));
310                 triggerEnter(newTodo, 'keyup');
311             }
312         }),
313         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
314             var checkboxes = contentDocument.querySelectorAll('.toggle');
315             for (var i = 0; i < checkboxes.length; i++)
316                 checkboxes[i].click();
317         }),
318         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
319             var deleteButtons = contentDocument.querySelectorAll('.destroy');
320             for (var i = 0; i < deleteButtons.length; i++)
321                 deleteButtons[i].click();
322         }),
323     ]
324 });
325
326 Suites.push({
327     name: 'jQuery-TodoMVC',
328     url: 'todomvc/architecture-examples/jquery/index.html',
329     prepare: function (runner, contentWindow, contentDocument) {
330         return runner.waitForElement('#new-todo').then(function (element) {
331             element.focus();
332             return element;
333         });
334     },
335     tests: [
336         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
337             for (var i = 0; i < numberOfItemsToAdd; i++) {
338                 newTodo.value = 'Something to do ' + i;
339                 triggerEnter(newTodo, 'keyup');
340             }
341         }),
342         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
343             var checkboxes = contentDocument.getElementsByClassName('toggle');
344             for (var i = 0; i < checkboxes.length; i++)
345                 checkboxes[i].click();
346         }),
347         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
348             for (var i = 0; i < numberOfItemsToAdd; i++)
349                 contentDocument.querySelector('.destroy').click();
350         }),
351     ]
352 })
353
354 Suites.push({
355     name: 'Preact-TodoMVC',
356     url: 'todomvc/architecture-examples/preact/dist/index.html',
357     prepare: function (runner, contentWindow, contentDocument) {
358         return runner.waitForElement('.new-todo').then(function (element) {
359             element.focus();
360             return element;
361         });
362     },
363     tests: [
364         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
365             for (var i = 0; i < numberOfItemsToAdd; i++) {
366                 newTodo.value = 'Something to do ' + i;
367                 triggerEnter(newTodo, 'keydown');
368             }
369         }),
370         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
371             var checkboxes = contentDocument.querySelectorAll('.toggle');
372             for (var i = 0; i < checkboxes.length; i++)
373                 checkboxes[i].click();
374         }),
375         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
376             var deleteButtons = contentDocument.querySelectorAll('.destroy');
377             for (var i = 0; i < deleteButtons.length; i++)
378                 deleteButtons[i].click();
379         }),
380     ]
381 });
382
383 Suites.push({
384     name: 'Inferno-TodoMVC',
385     url: 'todomvc/architecture-examples/inferno/index.html',
386     prepare: function (runner, contentWindow, contentDocument) {
387         return runner.waitForElement('.new-todo').then(function (element) {
388             element.focus();
389             return element;
390         });
391     },
392     tests: [
393         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
394             for (var i = 0; i < numberOfItemsToAdd; i++) {
395                 newTodo.value = 'Something to do ' + i;
396                 newTodo.dispatchEvent(new Event('change', {
397                   bubbles: true,
398                   cancelable: true
399                 }));
400                 triggerEnter(newTodo, 'keydown');
401             }
402         }),
403         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
404             var checkboxes = contentDocument.querySelectorAll('.toggle');
405             for (var i = 0; i < checkboxes.length; i++)
406                 checkboxes[i].click();
407         }),
408         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
409             var deleteButtons = contentDocument.querySelectorAll('.destroy');
410             for (var i = 0; i < numberOfItemsToAdd; i++)
411                 contentDocument.querySelector('.destroy').click();
412         }),
413     ]
414 });
415
416 Suites.push({
417     name: 'Elm-TodoMVC',
418     url: 'todomvc/functional-prog-examples/elm/index.html',
419     prepare: function (runner, contentWindow, contentDocument) {
420         return runner.waitForElement('.new-todo').then(function (element) {
421             element.focus();
422             return element;
423         });
424     },
425     tests: [
426         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
427             for (var i = 0; i < numberOfItemsToAdd; i++) {
428                 newTodo.value = 'Something to do ' + i;
429                 newTodo.dispatchEvent(new Event('input', {
430                   bubbles: true,
431                   cancelable: true
432                 }));
433                 triggerEnter(newTodo, 'keydown');
434             }
435         }),
436         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
437             var checkboxes = contentDocument.querySelectorAll('.toggle');
438             for (var i = 0; i < checkboxes.length; i++)
439                 checkboxes[i].click();
440         }),
441         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
442             var deleteButtons = contentDocument.querySelectorAll('.destroy');
443             for (var i = 0; i < deleteButtons.length; i++)
444                 deleteButtons[i].click();
445         }),
446     ]
447 });
448
449 Suites.push({
450     name: 'Flight-TodoMVC',
451     url: 'todomvc/dependency-examples/flight/flight/index.html',
452     prepare: function (runner, contentWindow, contentDocument) {
453         return runner.waitForElement('#new-todo').then(function (element) {
454             element.focus();
455             return element;
456         });
457     },
458     tests: [
459         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
460             for (var i = 0; i < numberOfItemsToAdd; i++) {
461                 newTodo.value = 'Something to do ' + i;
462                 triggerEnter(newTodo, 'keydown');
463             }
464         }),
465         new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
466             var checkboxes = contentDocument.querySelectorAll('.toggle');
467             for (var i = 0; i < checkboxes.length; i++)
468                 checkboxes[i].click();
469         }),
470         new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
471             var deleteButtons = contentDocument.querySelectorAll('.destroy');
472             for (var i = 0; i < deleteButtons.length; i++)
473                 deleteButtons[i].click();
474         }),
475     ]
476 });
477
478 var actionCount = 50;
479 Suites.push({
480     disabled: true,
481     name: 'FlightJS-MailClient',
482     url: 'flightjs-example-app/index.html',
483     prepare: function (runner, contentWindow, contentDocument) {
484         return runner.waitForElement('.span8').then(function (element) {
485             element.focus();
486             return element;
487         });
488     },
489     tests: [
490         new BenchmarkTestStep('OpeningTabs' + actionCount + 'Times', function (newTodo, contentWindow, contentDocument) {
491             contentDocument.getElementById('inbox').click();
492             for (var i = 0; i < actionCount; i++) {
493                 contentDocument.getElementById('later').click();
494                 contentDocument.getElementById('sent').click();
495                 contentDocument.getElementById('trash').click();
496                 contentDocument.getElementById('inbox').click();
497             }
498         }),
499         new BenchmarkTestStep('MovingEmails' + actionCount + 'Times', function (newTodo, contentWindow, contentDocument) {
500             contentDocument.getElementById('inbox').click();
501             for (var i = 0; i < actionCount; i++) {
502                 contentDocument.getElementById('mail_2139').click();
503                 contentDocument.getElementById('move_mail').click();
504                 contentDocument.querySelector('#move_to_selector #later').click();
505                 contentDocument.getElementById('later').click();
506                 contentDocument.getElementById('mail_2139').click();
507                 contentDocument.getElementById('move_mail').click();
508                 contentDocument.querySelector('#move_to_selector #trash').click();
509                 contentDocument.getElementById('trash').click();
510                 contentDocument.getElementById('mail_2139').click();
511                 contentDocument.getElementById('move_mail').click();
512                 contentDocument.querySelector('#move_to_selector #inbox').click();
513                 contentDocument.getElementById('inbox').click();
514             }
515         }),
516         new BenchmarkTestStep('Sending' + actionCount + 'NewEmails', function (newTodo, contentWindow, contentDocument) {
517             for (var i = 0; i < actionCount; i++) {
518                 contentDocument.getElementById('new_mail').click();
519                 contentDocument.getElementById('recipient_select').selectedIndex = 1;
520                 var subject = contentDocument.getElementById('compose_subject');
521                 var message = contentDocument.getElementById('compose_message');
522                 subject.focus();
523                 contentWindow.$(subject).trigger('keydown');
524                 contentWindow.$(subject).text('Hello');
525                 message.focus();
526                 contentWindow.$(message).trigger('keydown');
527                 contentWindow.$(message).text('Hello,\n\nThis is a test message.\n\n- WebKitten');
528                 contentDocument.getElementById('send_composed').click();
529             }
530         }),
531     ]
532 });