Namespace the canvas proxy in auto tests.
[dygraphs.git] / auto_tests / tests / range_tests.js
CommitLineData
718ad8e2 1// Copyright (c) 2011 Google, Inc.
72a74f04
RK
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21
22/**
23 * @fileoverview Test valueRange and dateWindow changes.
24 *
25 * @author konigsberg@google.com (Robert Konigsberg)
26 */
27var ZERO_TO_FIFTY = [[ 10, 0 ] , [ 20, 50 ]];
28var ZERO_TO_FIFTY_STEPS = function() {
29 var a = [];
30 var x = 10;
31 var y = 0;
32 var step = 0;
33 for (step = 0; step <= 50; step++) {
34 a.push([x + (step * .2), y + step]);
35 }
36 return a;
37} ();
b0d3471d
RK
38var FIVE_TO_ONE_THOUSAND = [
39 [ 1, 10 ], [ 2, 20 ], [ 3, 30 ], [ 4, 40 ] , [ 5, 50 ],
40 [ 6, 60 ], [ 7, 70 ], [ 8, 80 ], [ 9, 90 ] , [ 10, 1000 ]];
72a74f04
RK
41
42var RangeTestCase = TestCase("range-tests");
43
44RangeTestCase.prototype.setUp = function() {
45 document.body.innerHTML = "<div id='graph'></div>";
46};
47
48RangeTestCase.prototype.createGraph = function(opts) {
49 var graph = document.getElementById("graph");
50 var g = new Dygraph(graph, ZERO_TO_FIFTY_STEPS, opts);
51
52 assertEquals([10, 20], g.xAxisRange());
53 assertEquals([0, 55], g.yAxisRange(0));
54
55 return g;
56};
57
58/**
59 * Test that changes to valueRange and dateWindow are reflected
60 * appropriately.
61 */
62RangeTestCase.prototype.testRangeSetOperations = function() {
63 var g = this.createGraph({valueRange : [ 0, 55 ]});
64
65 g.updateOptions({ dateWindow : [ 12, 18 ] });
66 assertEquals([12, 18], g.xAxisRange());
67 assertEquals([0, 55], g.yAxisRange(0));
68
69 g.updateOptions({ valueRange : [ 10, 40 ] });
70 assertEquals([12, 18], g.xAxisRange());
71 assertEquals([10, 40], g.yAxisRange(0));
72
e4ddb639 73 g.updateOptions({ valueRange: [10, NaN] });
74 assertEquals([12, 18], g.xAxisRange());
75 assertEquals([10, 44.2], g.yAxisRange(0));
76
77 g.updateOptions({ valueRange: [10, 40] });
78 assertEquals([12, 18], g.xAxisRange());
79 assertEquals([10, 40], g.yAxisRange(0));
80
30aae41c 81 g.updateOptions({ valueRange: [10, null] });
82 assertEquals([12, 18], g.xAxisRange());
83 assertEquals([10, 44.2], g.yAxisRange(0));
84
85 g.updateOptions({ valueRange: [10, 40] });
86 assertEquals([12, 18], g.xAxisRange());
87 assertEquals([10, 40], g.yAxisRange(0));
88
89 g.updateOptions({ valueRange: [10, undefined] });
90 assertEquals([12, 18], g.xAxisRange());
91 assertEquals([10, 44.2], g.yAxisRange(0));
92
93 g.updateOptions({ valueRange: [10, 40] });
94 assertEquals([12, 18], g.xAxisRange());
95 assertEquals([10, 40], g.yAxisRange(0));
96
72a74f04
RK
97 g.updateOptions({ });
98 assertEquals([12, 18], g.xAxisRange());
99 assertEquals([10, 40], g.yAxisRange(0));
4dd0ac55
RV
100
101 g.updateOptions({valueRange : null, axes: {y:{valueRange : [15, 20]}}});
102 assertEquals([12, 18], g.xAxisRange());
103 assertEquals([15, 20], g.yAxisRange(0));
72a74f04 104
4dd0ac55 105 g.updateOptions({ dateWindow : null, valueRange : null, axes: null });
72a74f04
RK
106 assertEquals([10, 20], g.xAxisRange());
107 assertEquals([0, 55], g.yAxisRange(0));
108};
109
110/**
111 * Verify that when zoomed in by mouse operations, an empty call to
112 * updateOptions doesn't change the displayed ranges.
113 */
114RangeTestCase.prototype.zoom = function(g, xRange, yRange) {
115 var originalXRange = g.xAxisRange();
116 var originalYRange = g.yAxisRange(0);
117
a12f271c 118 DygraphOps.dispatchMouseDown(g, xRange[0], yRange[0]);
72a74f04
RK
119 DygraphOps.dispatchMouseMove(g, xRange[1], yRange[0]); // this is really necessary.
120 DygraphOps.dispatchMouseUp(g, xRange[1], yRange[0]);
121
122 assertEqualsDelta(xRange, g.xAxisRange(), 0.2);
123 // assertEqualsDelta(originalYRange, g.yAxisRange(0), 0.2); // Not true, it's something in the middle.
124
125 var midX = (xRange[1] - xRange[0]) / 2;
a12f271c 126 DygraphOps.dispatchMouseDown(g, midX, yRange[0]);
72a74f04
RK
127 DygraphOps.dispatchMouseMove(g, midX, yRange[1]); // this is really necessary.
128 DygraphOps.dispatchMouseUp(g, midX, yRange[1]);
129
130 assertEqualsDelta(xRange, g.xAxisRange(), 0.2);
131 assertEqualsDelta(yRange, g.yAxisRange(0), 0.2);
132}
133
134
135/**
136 * Verify that when zoomed in by mouse operations, an empty call to
137 * updateOptions doesn't change the displayed ranges.
138 */
139RangeTestCase.prototype.testEmptyUpdateOptions_doesntUnzoom = function() {
140 var g = this.createGraph();
141 this.zoom(g, [ 11, 18 ], [ 35, 40 ]);
142
a12f271c
RK
143 assertEqualsDelta([11, 18], g.xAxisRange(), 0.1);
144 assertEqualsDelta([35, 40], g.yAxisRange(0), 0.2);
145
72a74f04
RK
146 g.updateOptions({});
147
148 assertEqualsDelta([11, 18], g.xAxisRange(), 0.1);
d64b8fea 149 assertEqualsDelta([35, 40], g.yAxisRange(0), 0.2);
72a74f04
RK
150}
151
152/**
153 * Verify that when zoomed in by mouse operations, a call to
154 * updateOptions({ dateWindow : null, valueRange : null }) fully
155 * unzooms.
156 */
157RangeTestCase.prototype.testRestoreOriginalRanges_viaUpdateOptions = function() {
158 var g = this.createGraph();
159 this.zoom(g, [ 11, 18 ], [ 35, 40 ]);
160
161 g.updateOptions({ dateWindow : null, valueRange : null });
162
163 assertEquals([0, 55], g.yAxisRange(0));
164 assertEquals([10, 20], g.xAxisRange());
165}
b0d3471d
RK
166
167/**
168 * Verify that log scale axis range is properly specified.
169 */
170RangeTestCase.prototype.testLogScaleExcludesZero = function() {
171 var g = new Dygraph("graph", FIVE_TO_ONE_THOUSAND, { logscale : true });
172 assertEquals([10, 1099], g.yAxisRange(0));
173
174 g.updateOptions({ logscale : false });
175 assertEquals([0, 1099], g.yAxisRange(0));
176}
478b866b
RK
177
178/**
179 * Verify that includeZero range is properly specified.
180 */
181RangeTestCase.prototype.testIncludeZeroIncludesZero = function() {
182 var g = new Dygraph("graph", [[0, 500], [500, 1000]], { includeZero : true });
183 assertEquals([0, 1100], g.yAxisRange(0));
184
185 g.updateOptions({ includeZero : false });
186 assertEquals([450, 1050], g.yAxisRange(0));
187}
fa0d7ad8 188
c387c823 189
190/**
191 * Verify that includeZero range is properly specified per axis.
192 */
193RangeTestCase.prototype.testIncludeZeroPerAxis = function() {
194 var g = new Dygraph("graph",
195 'X,A,B\n'+
196 '0,50,50\n'+
197 '50,110,110\n',
198 {
199 drawPoints: true,
200 pointSize:5,
201 series:{
202 A: {
203 axis: 'y',
204 pointSize: 10
205 },
206 B: {
207 axis: 'y2'
208 }
209 },
210 axes: {
211 'y2': { includeZero: true }
212 }
213 });
214
215
216 assertEquals([44, 116], g.yAxisRange(0));
217 assertEquals([0, 121], g.yAxisRange(1));
218
219 g.updateOptions({
220 axes: {
221 'y2': { includeZero: false }
222 }
223 });
224
225 assertEquals([44, 116], g.yAxisRange(1));
226}
227
228
229/**
230 * Verify that includeZero range is properly specified per axis with old axis options.
231 */
232RangeTestCase.prototype.testIncludeZeroPerAxisOld = function() {
233 var g = new Dygraph("graph",
234 'X,A,B\n' +
235 '0,50,50\n' +
236 '50,110,110\n',
237 {
238 drawPoints: true,
239 pointSize: 5,
240
241 A: {
242 pointSize: 10
243 },
244 B: {
245 axis: {}
246 },
247 axes: {
248 'y': { includeZero: true },
249 'y2': { includeZero: false }
250 }
251 });
252
253 assertEquals([0, 121], g.yAxisRange(0));
254 assertEquals([44, 116], g.yAxisRange(1));
255
256 g.updateOptions({
257 axes: {
258 'y': { includeZero: false },
259 'y2': { includeZero: true }
260 }
261 });
262
263 assertEquals([44, 116], g.yAxisRange(0));
264 assertEquals([0, 121], g.yAxisRange(1));
265}
266
fa0d7ad8
KW
267/**
268 * Verify that very large Y ranges don't break things.
269 */
270RangeTestCase.prototype.testHugeRange = function() {
271 var g = new Dygraph("graph", [[0, -1e120], [1, 1e230]], { includeZero : true });
272 assertEqualsDelta(1, -1e229 / g.yAxisRange(0)[0], 0.001);
273 assertEqualsDelta(1, 1.1e230 / g.yAxisRange(0)[1], 0.001);
274}