OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <html> | |
3 <head> | |
4 <title>Repeater</title> | |
5 <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base
.js"> | |
6 </script> | |
7 <script src="../../cr.js"></script> | |
8 <script src="../ui.js"></script> | |
9 <script src="repeating_button.js"></script> | |
10 <script> | |
11 goog.require('goog.testing.jsunit'); | |
12 goog.require('goog.testing.MockClock'); | |
13 </script> | |
14 </head> | |
15 <body> | |
16 <script> | |
17 var mockClock; | |
18 var value; | |
19 var button; | |
20 var repeatDelay; | |
21 var repeatInterval; | |
22 | |
23 /** | |
24 * Prepare running the tests. | |
25 */ | |
26 function setUp() { | |
27 mockClock = new goog.testing.MockClock(); | |
28 mockClock.install(); | |
29 button = new cr.ui.RepeatingButton(); | |
30 repeatDelay = button.repeatDelay; | |
31 repeatInterval = button.repeatInterval; | |
32 button.addEventListener( | |
33 cr.ui.RepeatingButton.Event.BUTTON_HELD, | |
34 function(e) { | |
35 value++; | |
36 }); | |
37 } | |
38 | |
39 /** | |
40 * Post-test cleanup. | |
41 */ | |
42 function tearDown() { | |
43 mockClock.uninstall(); | |
44 } | |
45 | |
46 /** | |
47 * Simulates a mouse or touch event to the repeating button. | |
48 * @param {string} type The type of event. | |
49 */ | |
50 function mockEvent(type) { | |
51 cr.dispatchSimpleEvent(button, type); | |
52 } | |
53 | |
54 /** | |
55 * Simulates a sequence of events. | |
56 * @param {Array.<string>} events List of event types. | |
57 * @param {Array.<number>} timeIncrements List of time increments between | |
58 * events. | |
59 * @param {number} expectedValue Expected result. | |
60 */ | |
61 function mockEventSequence(events, timeIncrements, expectedValue) { | |
62 assertEquals(events.length, timeIncrements.length); | |
63 value = 0; | |
64 for (var i = 0; i < events.length; i++) { | |
65 mockEvent(events[i]); | |
66 mockClock.tick(timeIncrements[i]); | |
67 } | |
68 assertEquals(expectedValue, value); | |
69 mockClock.tick(repeatDelay); | |
70 assertEquals(expectedValue, value); | |
71 } | |
72 | |
73 /** | |
74 * Simulates a tap or touch and hold gesture. | |
75 * @param {number} time Duration of the hold. | |
76 * @param {number} expectedValue Expected result. | |
77 */ | |
78 function mockTouchHold(time, expectedValue) { | |
79 mockEventSequence(['touchstart', 'touchend'], [time, 0], expectedValue); | |
80 } | |
81 | |
82 /** | |
83 * Simulates a mouse click or mouse press and hold. | |
84 * @param {number} time Duration of the hold. | |
85 * @param {number} expectedValue Expected result. | |
86 */ | |
87 function mockMouseHold(time, expectedValue) { | |
88 mockEventSequence(['mousedown', 'mouseup', 'mouseclick'], | |
89 [time, 0, 0], | |
90 expectedValue); | |
91 } | |
92 | |
93 /** | |
94 * Simulates a mouse press and drag off of the button. | |
95 * @param {number} time1 Duration that the mouse button is pressed and the | |
96 * mouse is over the button. | |
97 * @param {number} time2 Duration that the mouse button is pressed but the | |
98 * mouse is outside the boundary of the button. | |
99 * @param {number} expectedValue Expected result. | |
100 */ | |
101 function mockMouseOut(time1, time2, expectedValue) { | |
102 mockEventSequence(['mousedown', 'mouseout', 'mouseup'], | |
103 [time1, time2, 0], | |
104 expectedValue); | |
105 } | |
106 | |
107 /** | |
108 * Runs a series of tests with increasing button hold time. | |
109 * @param {function} fn Testing function. | |
110 * @param {Object} opt_arg Optional additional argument for the test. | |
111 */ | |
112 function runButtonTests(fn, opt_arg) { | |
113 var holdTime = repeatDelay - repeatInterval / 2; | |
114 for (var i = 0; i < 3; i++, holdTime += repeatInterval) { | |
115 var args = opt_arg ? [holdTime, opt_arg, i + 1] : [holdTime, i + 1]; | |
116 fn.apply(this, args); | |
117 } | |
118 } | |
119 | |
120 /** | |
121 * Simulates a short tap on the button. | |
122 */ | |
123 function testTap() { | |
124 mockTouchHold(repeatDelay / 2, 1); | |
125 } | |
126 | |
127 /** | |
128 * Simulates a long press of the button. | |
129 */ | |
130 function testTouchHold() { | |
131 runButtonTests(mockTouchHold); | |
132 } | |
133 | |
134 /** | |
135 * Simulates a quick mouse click of the button. | |
136 */ | |
137 function testClick() { | |
138 mockMouseHold(repeatDelay / 2, 1); | |
139 } | |
140 | |
141 /** | |
142 * Simulates a mouse press and hold on the button. | |
143 */ | |
144 function testMousePressHold() { | |
145 runButtonTests(mockMouseHold); | |
146 } | |
147 | |
148 /** | |
149 * Simulates draging the mouse off of the button while pressed. | |
150 */ | |
151 function testMouseOut() { | |
152 runButtonTests(mockMouseOut, repeatDelay); | |
153 } | |
154 | |
155 /** | |
156 * Repeat tests with new delay and interval times. | |
157 */ | |
158 function testUpdateDelayTimes() { | |
159 var oldDelay = repeatDelay; | |
160 var oldInterval = repeatInterval; | |
161 repeatDelay = button.repeatDelay = 2 * repeatDelay; | |
162 repeatInterval = button.repeatInterval = 2 * repeatInterval; | |
163 testTouchHold(); | |
164 testMousePressHold(); | |
165 testMouseOut(); | |
166 testClick(); | |
167 testTap(); | |
168 repeatDelay = button.repeatDelay = oldDelay; | |
169 repeatInterval = button.repeatInterval = oldInterval; | |
170 } | |
171 | |
172 /** | |
173 * Runs mouse and touch hold tests with a repeat interval that is longer | |
174 * than the initial repeat delay. | |
175 */ | |
176 function testLongRepeat() { | |
177 var oldInterval = repeatInterval; | |
178 repeatInterval = button.repeatInterval = 3 * button.repeatDelay; | |
179 testTouchHold(); | |
180 testMousePressHold(); | |
181 repeatInterval = button.repeatInterval = oldInterval; | |
182 } | |
183 </script> | |
184 </body> | |
185 </html> | |
OLD | NEW |