dce01eda9aea094e07182ac60cf37929cabd5623
1 // Copyright (c) 2012 Google, Inc.
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:
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
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
22 * @fileoverview Test cases for drawing lines with missing points.
24 * @author konigsberg@google.com (Robert Konigsberg)
27 import Dygraph from
'../../src/dygraph';
28 import * as utils from
'../../src/dygraph-utils';
29 import Proxy from
'./Proxy';
30 import CanvasAssertions from
'./CanvasAssertions';
31 import Util from
'./Util';
33 var ZERO_TO_FIFTY
= [[ 10, 0 ] , [ 20, 50 ]];
35 describe("missing-points", function() {
38 useProxyCanvas(utils
, Proxy
);
40 it('testSeparatedPointsDontDraw', function() {
41 var graph
= document
.getElementById("graph");
48 colors
: ['red', 'blue'],
49 labels
: ['X', 'Y1', 'Y2']
51 var htx
= g
.hidden_ctx_
;
52 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
53 assert
.equal(0, CanvasAssertions
.numLinesDrawn(htx
, '#0000ff'));
56 it('testSeparatedPointsDontDraw_expanded', function() {
57 var graph
= document
.getElementById("graph");
65 { colors
: ['blue'], labels
: ['X', 'Y']});
66 var htx
= g
.hidden_ctx_
;
68 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#0000ff'));
69 CanvasAssertions
.assertLineDrawn(htx
, [56, 275], [161, 212],
70 { strokeStyle
: '#0000ff', });
71 CanvasAssertions
.assertLineDrawn(htx
, [370, 87], [475, 25],
72 { strokeStyle
: '#0000ff', });
75 it('testSeparatedPointsDontDraw_expanded_connected', function() {
76 var graph
= document
.getElementById("graph");
86 connectSeparatedPoints
: true,
89 var htx
= g
.hidden_ctx_
;
92 assert
.equal(3, CanvasAssertions
.numLinesDrawn(htx
, '#0000ff'));
93 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
94 [[56, 275], [161, 212], [370, 87], [475, 25]],
95 { strokeStyle
: '#0000ff' });
99 * At the time of writing this test, the blue series is only points, and not lines.
101 it('testConnectSeparatedPoints', function() {
103 document
.getElementById("graph"),
113 connectSeparatedPoints
: true,
115 colors
: ['red', 'blue'],
116 labels
: ['X', 'Y1', 'Y2']
120 var htx
= g
.hidden_ctx_
;
122 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#0000ff'));
123 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
124 [[56, 225], [223, 25], [391, 125]],
125 { strokeStyle
: '#0000ff' });
127 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
128 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
129 [[140, 275], [307, 125], [475, 225]],
130 { strokeStyle
: '#ff0000' });
134 * At the time of writing this test, the blue series is only points, and not lines.
136 it('testConnectSeparatedPointsWithNan', function() {
138 document
.getElementById("graph"),
149 connectSeparatedPoints
: true,
151 colors
: ['red', 'blue']
155 var htx
= g
.hidden_ctx_
;
157 // Red has two disconnected line segments
158 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
159 CanvasAssertions
.assertLineDrawn(htx
, [102, 275], [195, 212], { strokeStyle
: '#ff0000' });
160 CanvasAssertions
.assertLineDrawn(htx
, [381, 87], [475, 25], { strokeStyle
: '#ff0000' });
162 // Blue's lines are consecutive, however.
163 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#0000ff'));
164 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
165 [[56, 244], [149, 181], [242, 118]],
166 { strokeStyle
: '#0000ff' });
169 /* These lines contain awesome powa!
170 var lines = CanvasAssertions.getLinesDrawn(htx, {strokeStyle: "#0000ff"});
171 for (var idx = 0; idx < lines.length; idx++) {
172 var line = lines[idx];
173 console.log(line[0].args, line[1].args, line[0].properties.strokeStyle);
177 it('testErrorBarsWithMissingPoints', function() {
187 document
.getElementById("graph"),
196 var htx
= g
.hidden_ctx_
;
198 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
200 var p0
= g
.toDomCoords(data
[0][0], data
[0][1][0]);
201 var p1
= g
.toDomCoords(data
[1][0], data
[1][1][0]);
202 var p2
= g
.toDomCoords(data
[3][0], data
[3][1][0]);
203 var p3
= g
.toDomCoords(data
[4][0], data
[4][1][0]);
204 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
205 [p0
, p1
], { strokeStyle
: '#ff0000' });
206 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
207 [p2
, p3
], { strokeStyle
: '#ff0000' });
210 it('testErrorBarsWithMissingPointsConnected', function() {
220 document
.getElementById("graph"),
223 connectSeparatedPoints
: true,
231 var htx
= g
.hidden_ctx_
;
233 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
235 var p1
= g
.toDomCoords(data
[1][0], data
[1][1][0]);
236 var p2
= g
.toDomCoords(data
[3][0], data
[3][1][0]);
237 var p3
= g
.toDomCoords(data
[5][0], data
[5][1][0]);
238 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
240 { strokeStyle
: '#ff0000' });
242 it('testCustomBarsWithMissingPoints', function() {
249 [6, [null,null,null]],
258 document
.getElementById("graph"),
267 var htx
= g
.hidden_ctx_
;
269 assert
.equal(4, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
271 var p0
= g
.toDomCoords(data
[0][0], data
[0][1][1]);
272 var p1
= g
.toDomCoords(data
[1][0], data
[1][1][1]);
273 CanvasAssertions
.assertLineDrawn(htx
, p0
, p1
, { strokeStyle
: '#ff0000' });
275 p0
= g
.toDomCoords(data
[3][0], data
[3][1][1]);
276 p1
= g
.toDomCoords(data
[4][0], data
[4][1][1]);
277 CanvasAssertions
.assertLineDrawn(htx
, p0
, p1
, { strokeStyle
: '#ff0000' });
279 p0
= g
.toDomCoords(data
[6][0], data
[6][1][1]);
280 p1
= g
.toDomCoords(data
[7][0], data
[7][1][1]);
281 CanvasAssertions
.assertLineDrawn(htx
, p0
, p1
, { strokeStyle
: '#ff0000' });;
283 p0
= g
.toDomCoords(data
[9][0], data
[9][1][1]);
284 p1
= g
.toDomCoords(data
[10][0], data
[10][1][1]);
285 CanvasAssertions
.assertLineDrawn(htx
, p0
, p1
, { strokeStyle
: '#ff0000' });
288 it('testCustomBarsWithMissingPointsConnected', function() {
294 [5, [null,null,null]],
298 document
.getElementById("graph"),
301 connectSeparatedPoints
: true,
309 var htx
= g
.hidden_ctx_
;
311 assert
.equal(2, CanvasAssertions
.numLinesDrawn(htx
, '#ff0000'));
313 var p1
= g
.toDomCoords(data
[1][0], data
[1][1][1]);
314 var p2
= g
.toDomCoords(data
[3][0], data
[3][1][1]);
315 var p3
= g
.toDomCoords(data
[5][0], data
[5][1][1]);
316 CanvasAssertions
.assertConsecutiveLinesDrawn(htx
,
318 { strokeStyle
: '#ff0000' });
321 it('testLeftBoundaryWithMisingPoints', function() {
331 document
.getElementById("graph"),
334 connectSeparatedPoints
: true,
336 colors
: ['red','blue'],
337 labels
: ['X', 'Y1', 'Y2']
340 g
.updateOptions({ dateWindow
: [ 2.5, 4.5 ] });
341 assert
.equal(1, g
.getLeftBoundary_(0));
342 assert
.equal(0, g
.getLeftBoundary_(1));
344 var domX
= g
.toDomXCoord(1.9);
345 var closestRow
= g
.findClosestRow(domX
);
346 assert
.equal(1, closestRow
);
348 g
.setSelection(closestRow
);
349 assert
.equal(1, g
.selPoints_
.length
);
350 assert
.equal(1, g
.selPoints_
[0].yval
);
353 assert
.equal(2, g
.selPoints_
.length
);
354 assert
.equal(g
.selPoints_
[0].xval
, g
.selPoints_
[1].xval
);
355 assert
.equal(2, g
.selPoints_
[0].yval
);
356 assert
.equal(1, g
.selPoints_
[1].yval
);
359 // Regression test for issue #411
360 it('testEmptySeries', function() {
361 var graphDiv
= document
.getElementById("graph");
364 "Time,Empty Series,Series 1,Series 2\n" +
365 "1381134460,,0,100\n" +
366 "1381134461,,1,99\n" +
367 "1381134462,,2,98\n" +
368 "1381134463,,3,97\n" +
369 "1381134464,,4,96\n" +
370 "1381134465,,5,95\n" +
371 "1381134466,,6,94\n" +
372 "1381134467,,7,93\n" +
373 "1381134468,,8,92\n" +
374 "1381134469,,9,91\n", {
375 visibility
: [true, false, true],
376 dateWindow
: [1381134465, 1381134467]
380 assert
.equal("1381134466: Series 2: 94", Util
.getLegend(graphDiv
));
383 // Regression test for issue #485
384 it('testMissingFill', function() {
385 var graphDiv
= document
.getElementById("graph");
393 [4, [9, N
, 2] ], // Note: nulls in arrays are not technically valid.
394 [5, [N
, 2, N
] ], // see dygraphs.com/data.html
.
399 connectSeparatedPoints
: false,
400 labels
: [ "X", "Series1"]
404 // Make sure there are no 'NaN' line segments.
405 var htx
= g
.hidden_ctx_
;
406 for (var i
= 0; i
< htx
.calls__
.length
; i
++) {
407 var call
= htx
.calls__
[i
];
408 if ((call
.name
== 'moveTo' || call
.name
== 'lineTo') && call
.args
) {
409 for (var j
= 0; j
< call
.args
.length
; j
++) {
410 assert
.isFalse(isNaN(call
.args
[j
]));