From 33a19d02b5d7f3cb8ef25371f3893809638a4f6c Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sat, 14 Dec 2013 17:11:31 -0500 Subject: [PATCH] Implement `Chart#demux` Provide mixin users with a means to split the input data across mixins. --- src/chart.js | 9 +++++-- test/tests/chart.js | 62 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/chart.js b/src/chart.js index 555a366..aa2fea8 100644 --- a/src/chart.js +++ b/src/chart.js @@ -127,7 +127,7 @@ Chart.prototype.mixin = function(mixinName, chart) { Chart.prototype.draw = function(data) { - var layerName, mixinName; + var layerName, mixinName, mixinData; data = transformCascade.call(this, this, data); @@ -136,7 +136,12 @@ Chart.prototype.draw = function(data) { } for (mixinName in this._mixins) { - this._mixins[mixinName].draw(data); + if (this.demux) { + mixinData = this.demux(mixinName, data); + } else { + mixinData = data; + } + this._mixins[mixinName].draw(mixinData); } }; diff --git a/test/tests/chart.js b/test/tests/chart.js index 77896f2..aa161cb 100644 --- a/test/tests/chart.js +++ b/test/tests/chart.js @@ -89,26 +89,66 @@ suite("d3.chart", function() { }); }); - suite("#mixin", function() { + suite("Mixins", function() { setup(function() { d3.chart("test", {}); this.myChart = d3.select("#test").chart("test"); var mixinChart = this.mixinChart = d3.select("body").chart("test"); sinon.spy(mixinChart, "draw"); }); - test("returns the requested mixin", function() { - this.myChart.mixin("myMixin", this.mixinChart); + suite("#mixin", function() { + test("returns the requested mixin", function() { + this.myChart.mixin("myMixin", this.mixinChart); - assert.equal(this.myChart.mixin("myMixin"), this.mixinChart); + assert.equal(this.myChart.mixin("myMixin"), this.mixinChart); + }); + test("connects the specified chart", function() { + var data = [23, 45]; + this.myChart.mixin("myMixin", this.mixinChart); + this.myChart.draw(data); + + assert.equal(this.mixinChart.draw.callCount, 1); + assert.equal(this.mixinChart.draw.args[0].length, 1); + assert.deepEqual(this.mixinChart.draw.args[0][0], data); + }); }); - test("connects the specified chart", function() { - var data = [23, 45]; - this.myChart.mixin("myMixin", this.mixinChart); - this.myChart.draw(data); - assert.equal(this.mixinChart.draw.callCount, 1); - assert.equal(this.mixinChart.draw.args[0].length, 1); - assert.deepEqual(this.mixinChart.draw.args[0][0], data); + suite("#demux", function() { + var data = { + series1: [1, 2, 3], + series2: [4, 5, 6] + }; + setup(function() { + this.mixinChart2 = d3.select("body").chart("test"); + sinon.spy(this.mixinChart2, "draw"); + this.myChart.mixin("mixin1", this.mixinChart); + this.myChart.mixin("mixin2", this.mixinChart2); + }); + test("uses provided function to demultiplex data", function() { + this.myChart.demux = function(mixinName, data) { + if (mixinName === "mixin1") { + return data.series1; + } + return data; + }; + this.myChart.draw(data); + + assert.deepEqual( + this.mixinChart.draw.args, + [[[1, 2, 3]]], + "Demuxes data passed to charts with registered function" + ); + assert.deepEqual( + this.mixinChart2.draw.args[0][0].series1, + data.series1, + "Unmodified data passes through to mixins directly" + ); + assert.deepEqual( + this.mixinChart2.draw.args[0][0].series2, + data.series2, + "Unmodified data passes through to mixins directly" + ); + }); }); });