Refactoring to fix stacked graphs with NaNs.
[dygraphs.git] / auto_tests / tests / callback.js
index 1d748fb..af524a0 100644 (file)
@@ -420,17 +420,23 @@ CallbackTestCase.prototype.testNaNDataStack = function() {
   assertEquals(1, res.row);
   assertEquals('c', res.seriesName);
 
-  // First gap, no data due to NaN contagion.
+  // All-NaN area at left, should get no points.
+  dom = g.toDomCoords(9.1, 0.9);
+  res = g.findStackedPoint(dom[0], dom[1]);
+  assertEquals(0, res.row);
+  assertEquals(undefined, res.seriesName);
+
+  // First gap, get 'c' since it's non-NaN.
   dom = g.toDomCoords(12.1, 0.9);
   res = g.findStackedPoint(dom[0], dom[1]);
   assertEquals(3, res.row);
-  assertEquals(undefined, res.seriesName);
+  assertEquals('c', res.seriesName);
 
-  // Second gap, no data due to NaN contagion.
+  // Second gap, get 'b' since 'c' is NaN.
   dom = g.toDomCoords(15.1, 0.9);
   res = g.findStackedPoint(dom[0], dom[1]);
   assertEquals(6, res.row);
-  assertEquals(undefined, res.seriesName);
+  assertEquals('b', res.seriesName);
 
   // Isolated points should work, finding series b in this case.
   dom = g.toDomCoords(15.9, 3.1);
@@ -577,7 +583,7 @@ CallbackTestCase.prototype.underlayCallback_noSeries = function() {
   var callback = function(canvas, area, g) {
     called = true;
     yMin = g.yAxisRange(0)[0];
-    yMax = g.yAxisRange(0)[0];
+    yMax = g.yAxisRange(0)[1];
   };
 
   var graph = document.getElementById("graph");
@@ -589,3 +595,100 @@ CallbackTestCase.prototype.underlayCallback_noSeries = function() {
   assertFalse(isNaN(yMin));
   assertFalse(isNaN(yMax));
 };
+
+/**
+ * Test that underlay callback receives the correct y-axis range.
+ */
+CallbackTestCase.prototype.underlayCallback_yAxisRange = function() {
+  var called = false;
+  var yMin, yMax;
+
+  var callback = function(canvas, area, g) {
+    yMin = g.yAxisRange(0)[0];
+    yMax = g.yAxisRange(0)[1];
+  };
+
+  var graph = document.getElementById("graph");
+  var g = new Dygraph(graph, "\n", {
+      valueRange: [0,10],
+      underlayCallback: callback
+    });
+
+  assertEquals(0, yMin);
+  assertEquals(10, yMax);
+};
+
+/**
+ * Test that drawPointCallback is called for isolated points and correct idx for the point is returned.
+ */
+CallbackTestCase.prototype.testDrawPointCallback_idx = function() {
+    var indices = [];
+
+    var g;
+    var callback = function(g, seriesName, canvasContext, cx, cy, color, pointSizeParam,idx) {
+        indices.push(idx);
+        Dygraph.Circles.DEFAULT.apply(this, arguments);
+    };
+
+    var graph = document.getElementById("graph");
+
+    var testdata = [[10, 2], [11, 3], [12, NaN], [13, 2], [14, NaN], [15, 3]];
+    var graphOpts = {
+        labels: ['X', 'Y'],
+        valueRange: [0, 4],
+        drawPoints : false,
+        drawPointCallback : callback,
+        pointSize : 8
+    };
+
+    // Test that correct idx for isolated points are passed to the callback.
+    g = new Dygraph(graph, testdata, graphOpts);
+    assertEquals(2, indices.length);
+    assertEquals([3, 5],indices);
+
+    // Test that correct indices for isolated points + gap points are passed to the callback when
+    // drawGapEdgePoints is set.  This should add one point at the right
+    // edge of the segment at x=11, but not at the graph edge at x=10.
+    indices = []; // Reset for new test
+    graphOpts.drawGapEdgePoints = true;
+    g = new Dygraph(graph, testdata, graphOpts);
+    assertEquals(3, indices.length);
+    assertEquals([1, 3, 5],indices);
+
+
+    //Test that correct indices are passed to the callback when zoomed in.
+    indices = []; // Reset for new test
+    graphOpts.dateWindow = [12.5,13.5]
+    graphOpts.drawPoints = true;
+    testdata = [[10, 2], [11, 3], [12, 4], [13, 2], [14, 5], [15, 3]];
+    g = new Dygraph(graph, testdata, graphOpts);
+    assertEquals(3, indices.length);
+    assertEquals([2, 3, 4],indices);
+};
+
+/**
+ * Test that the correct idx is returned for the point in the onHiglightCallback.
+  */
+CallbackTestCase.prototype.testDrawHighlightPointCallback_idx = function() {
+    var idxToCheck = null;
+
+    var drawHighlightPointCallback  = function(g, seriesName, canvasContext, cx, cy, color, pointSizeParam,idx) {
+        idxToCheck = idx;
+    };
+    var testdata = [[1, 2], [2, 3], [3, NaN], [4, 2], [5, NaN], [6, 3]];
+    var graph = document.getElementById("graph");
+    var g = new Dygraph(graph, testdata,
+        {
+            drawHighlightPointCallback : drawHighlightPointCallback
+        });
+
+    assertNull(idxToCheck);
+    DygraphOps.dispatchMouseMove(g, 3, 0);
+    // check that NaN point is not highlighted
+    assertNull(idxToCheck);
+    DygraphOps.dispatchMouseMove(g, 1, 2);
+    // check that correct index is returned
+    assertEquals(0,idxToCheck);
+    DygraphOps.dispatchMouseMove(g, 6, 3);
+    assertEquals(5,idxToCheck);
+};