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> 186