• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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