Merge pull request #239 from timeu/bugfix_upstream
[dygraphs.git] / auto_tests / tests / update_options.js
1 // Copyright 2011 Google Inc. All Rights Reserved.
2
3 /**
4 * @fileoverview Tests for the updateOptions function.
5 * @author antrob@google.com (Anthony Robledo)
6 */
7 var UpdateOptionsTestCase = TestCase("update-options");
8
9 UpdateOptionsTestCase.prototype.opts = {
10 width: 480,
11 height: 320,
12 };
13
14 UpdateOptionsTestCase.prototype.data = "X,Y1,Y2\n" +
15 "2011-01-01,2,3\n" +
16 "2011-02-02,5,3\n" +
17 "2011-03-03,6,1\n" +
18 "2011-04-04,9,5\n" +
19 "2011-05-05,8,3\n";
20
21 UpdateOptionsTestCase.prototype.setUp = function() {
22 document.body.innerHTML = "<div id='graph'></div><div id='labels'></div>";
23 };
24
25 UpdateOptionsTestCase.prototype.tearDown = function() {
26 };
27
28 /*
29 * Tweaks the dygraph so it sets g._testDrawCalled to true when internal method
30 * drawGraph_ is called. Call unWrapDrawGraph when done with this.
31 */
32 UpdateOptionsTestCase.prototype.wrapDrawGraph = function(g) {
33 g._testDrawCalled = false;
34 g._oldDrawGraph = g.drawGraph_;
35 g.drawGraph_ = function() {
36 g._testDrawCalled = true;
37 g._oldDrawGraph.call(g);
38 }
39 }
40
41 /*
42 * See wrapDrawGraph
43 */
44 UpdateOptionsTestCase.prototype.unwrapDrawGraph = function(g) {
45 g.drawGraph_ = g._oldDrawGraph;
46 }
47
48 UpdateOptionsTestCase.prototype.testStrokeAll = function() {
49 var graphDiv = document.getElementById("graph");
50 var graph = new Dygraph(graphDiv, this.data, this.opts);
51 var updatedOptions = { };
52
53 updatedOptions['strokeWidth'] = 3;
54
55 // These options will allow us to jump to renderGraph_()
56 // drawGraph_() will be skipped.
57 this.wrapDrawGraph(graph);
58 graph.updateOptions(updatedOptions);
59 this.unwrapDrawGraph(graph);
60 assertFalse(graph._testDrawCalled);
61 };
62
63 UpdateOptionsTestCase.prototype.testStrokeSingleSeries = function() {
64 var graphDiv = document.getElementById("graph");
65 var graph = new Dygraph(graphDiv, this.data, this.opts);
66 var updatedOptions = { };
67 var optionsForY1 = { };
68
69 optionsForY1['strokeWidth'] = 3;
70 updatedOptions['Y1'] = optionsForY1;
71
72 // These options will allow us to jump to renderGraph_()
73 // drawGraph_() will be skipped.
74 this.wrapDrawGraph(graph);
75 graph.updateOptions(updatedOptions);
76 this.unwrapDrawGraph(graph);
77 assertFalse(graph._testDrawCalled);
78 };
79
80 UpdateOptionsTestCase.prototype.testSingleSeriesRequiresNewPoints = function() {
81 var graphDiv = document.getElementById("graph");
82 var graph = new Dygraph(graphDiv, this.data, this.opts);
83 var updatedOptions = { };
84 var optionsForY1 = { };
85 var optionsForY2 = { };
86
87 // This will not require new points.
88 optionsForY1['strokeWidth'] = 2;
89 updatedOptions['Y1'] = optionsForY1;
90
91 // This will require new points.
92 optionsForY2['stepPlot'] = true;
93 updatedOptions['Y2'] = optionsForY2;
94
95 // These options will not allow us to jump to renderGraph_()
96 // drawGraph_() must be called
97 this.wrapDrawGraph(graph);
98 graph.updateOptions(updatedOptions);
99 this.unwrapDrawGraph(graph);
100 assertTrue(graph._testDrawCalled);
101 };
102
103 UpdateOptionsTestCase.prototype.testWidthChangeNeedsNewPoints = function() {
104 var graphDiv = document.getElementById("graph");
105 var graph = new Dygraph(graphDiv, this.data, this.opts);
106 var updatedOptions = { };
107
108 // This will require new points.
109 updatedOptions['width'] = 600;
110
111 // These options will not allow us to jump to renderGraph_()
112 // drawGraph_() must be called
113 this.wrapDrawGraph(graph);
114 graph.updateOptions(updatedOptions);
115 this.unwrapDrawGraph(graph);
116 assertTrue(graph._testDrawCalled);
117 };
118
119 // Test https://github.com/danvk/dygraphs/issues/87
120 UpdateOptionsTestCase.prototype.testUpdateLabelsDivDoesntInfiniteLoop = function() {
121 var graphDiv = document.getElementById("graph");
122 var labelsDiv = document.getElementById("labels");
123 var graph = new Dygraph(graphDiv, this.data, this.opts);
124 graph.updateOptions({labelsDiv : labelsDiv});
125 }
126
127 // Test https://github.com/danvk/dygraphs/issues/247
128 UpdateOptionsTestCase.prototype.testUpdateColors = function() {
129 var graphDiv = document.getElementById("graph");
130 var graph = new Dygraph(graphDiv, this.data, this.opts);
131
132 var defaultColors = ["rgb(0,128,0)", "rgb(0,0,128)"];
133 assertEquals(["rgb(0,128,0)", "rgb(0,0,128)"], graph.getColors());
134
135 var colors1 = [ "#aaa", "#bbb" ];
136 graph.updateOptions({ colors: colors1 });
137 assertEquals(colors1, graph.getColors());
138
139 // extra colors are ignored until you add additional data series.
140 var colors2 = [ "#ddd", "#eee", "#fff" ];
141 graph.updateOptions({ colors: colors2 });
142 assertEquals(["#ddd", "#eee"], graph.getColors());
143
144 graph.updateOptions({ file:
145 "X,Y1,Y2,Y3\n" +
146 "2011-01-01,2,3,4\n" +
147 "2011-02-02,5,3,2\n"
148 });
149 assertEquals(colors2, graph.getColors());
150
151 graph.updateOptions({ colors: null, file: this.data });
152 assertEquals(defaultColors, graph.getColors());
153 }
154
155 // Regression test for http://code.google.com/p/dygraphs/issues/detail?id=249
156 // Verifies that setting 'legend: always' via update immediately shows the
157 // legend.
158 UpdateOptionsTestCase.prototype.testUpdateLegendAlways = function() {
159 var graphDiv = document.getElementById("graph");
160 var graph = new Dygraph(graphDiv, this.data, this.opts);
161
162 var legend = document.getElementsByClassName("dygraph-legend");
163 assertEquals(1, legend.length);
164 legend = legend[0];
165 assertEquals("", legend.innerHTML);
166
167 graph.updateOptions({legend: 'always'});
168
169 legend = document.getElementsByClassName("dygraph-legend");
170 assertEquals(1, legend.length);
171 legend = legend[0];
172 assertNotEquals(-1, legend.textContent.indexOf("Y1"));
173 assertNotEquals(-1, legend.textContent.indexOf("Y2"));
174 };