mirror of https://github.com/masayuki0812/c3.git
Ændrew Rininsland
8 years ago
31 changed files with 5629 additions and 66 deletions
@ -1,45 +0,0 @@ |
|||||||
0 info it worked if it ends with ok |
|
||||||
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'run', 'test' ] |
|
||||||
2 info using npm@3.10.3 |
|
||||||
3 info using node@v6.5.0 |
|
||||||
4 verbose run-script [ 'pretest', 'test', 'posttest' ] |
|
||||||
5 info lifecycle c3@0.4.11~pretest: c3@0.4.11 |
|
||||||
6 silly lifecycle c3@0.4.11~pretest: no script for pretest, continuing |
|
||||||
7 info lifecycle c3@0.4.11~test: c3@0.4.11 |
|
||||||
8 verbose lifecycle c3@0.4.11~test: unsafe-perm in lifecycle true |
|
||||||
9 verbose lifecycle c3@0.4.11~test: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/aendrew/Sites/c3/node_modules/.bin:/usr/local/bin:/Users/aendrew/.rvm/gems/ruby-2.0.0-p353/bin:/Users/aendrew/.rvm/gems/ruby-2.0.0-p353@global/bin:/Users/aendrew/.rvm/rubies/ruby-2.0.0-p353/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/aendrew/bin:/Users/aendrew/.rvm/gems/ruby-2.0.0-p353/bin:/Users/aendrew/.rvm/gems/ruby-2.0.0-p353@global/bin:/Users/aendrew/.rvm/rubies/ruby-2.0.0-p353/bin:/Users/aendrew/.composer/vendor/bin:/Users/aendrew/local/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/aendrew/.rvm/bin:/Users/aendrew/.rvm/bin |
|
||||||
10 verbose lifecycle c3@0.4.11~test: CWD: /Users/aendrew/Sites/c3 |
|
||||||
11 silly lifecycle c3@0.4.11~test: Args: [ '-c', 'karma start karma.conf.js' ] |
|
||||||
12 silly lifecycle c3@0.4.11~test: Returned: code: 1 signal: null |
|
||||||
13 info lifecycle c3@0.4.11~test: Failed to exec test script |
|
||||||
14 verbose stack Error: c3@0.4.11 test: `karma start karma.conf.js` |
|
||||||
14 verbose stack Exit status 1 |
|
||||||
14 verbose stack at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:242:16) |
|
||||||
14 verbose stack at emitTwo (events.js:106:13) |
|
||||||
14 verbose stack at EventEmitter.emit (events.js:191:7) |
|
||||||
14 verbose stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) |
|
||||||
14 verbose stack at emitTwo (events.js:106:13) |
|
||||||
14 verbose stack at ChildProcess.emit (events.js:191:7) |
|
||||||
14 verbose stack at maybeClose (internal/child_process.js:877:16) |
|
||||||
14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) |
|
||||||
15 verbose pkgid c3@0.4.11 |
|
||||||
16 verbose cwd /Users/aendrew/Sites/c3 |
|
||||||
17 error Darwin 15.3.0 |
|
||||||
18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "test" |
|
||||||
19 error node v6.5.0 |
|
||||||
20 error npm v3.10.3 |
|
||||||
21 error code ELIFECYCLE |
|
||||||
22 error c3@0.4.11 test: `karma start karma.conf.js` |
|
||||||
22 error Exit status 1 |
|
||||||
23 error Failed at the c3@0.4.11 test script 'karma start karma.conf.js'. |
|
||||||
23 error Make sure you have the latest version of node.js and npm installed. |
|
||||||
23 error If you do, this is most likely a problem with the c3 package, |
|
||||||
23 error not with npm itself. |
|
||||||
23 error Tell the author that this fails on your system: |
|
||||||
23 error karma start karma.conf.js |
|
||||||
23 error You can get information on how to open an issue for this project with: |
|
||||||
23 error npm bugs c3 |
|
||||||
23 error Or if that isn't available, you can get their info via: |
|
||||||
23 error npm owner ls c3 |
|
||||||
23 error There is likely additional logging output above. |
|
||||||
24 verbose exit [ 1, true ] |
|
@ -0,0 +1,10 @@ |
|||||||
|
{ |
||||||
|
"env": { |
||||||
|
"mocha": true, |
||||||
|
"node": true |
||||||
|
}, |
||||||
|
"rules": { |
||||||
|
"prefer-arrow-callback": 0, |
||||||
|
"no-var": 0, |
||||||
|
}, |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api axis', function () { |
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.labels', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100], |
||||||
|
['data2', 50, 20, 10] |
||||||
|
], |
||||||
|
axes: { |
||||||
|
data1: 'y', |
||||||
|
data2: 'y2' |
||||||
|
} |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
label: 'Y Axis Label' |
||||||
|
}, |
||||||
|
y2: { |
||||||
|
show: true, |
||||||
|
label: 'Y2 Axis Label' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update y axis label', function () { |
||||||
|
chart.axis.labels({y: 'New Y Axis Label'}); |
||||||
|
var label = d3.select('.c3-axis-y-label'); |
||||||
|
expect(label.text()).to.equal('New Y Axis Label'); |
||||||
|
expect(label.attr('dx')).to.equal('-0.5em'); |
||||||
|
expect(label.attr('dy')).to.equal('1.2em'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update y axis label', function () { |
||||||
|
chart.axis.labels({y2: 'New Y2 Axis Label'}); |
||||||
|
var label = d3.select('.c3-axis-y2-label'); |
||||||
|
expect(label.text()).to.equal('New Y2 Axis Label'); |
||||||
|
expect(label.attr('dx')).to.equal('-0.5em'); |
||||||
|
expect(label.attr('dy')).to.equal('-0.5em'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,166 @@ |
|||||||
|
var chai = require('chai'); |
||||||
|
var chaiColors = require('chai-color-helpers'); |
||||||
|
var expect = chai.expect; |
||||||
|
|
||||||
|
chai.use(chaiColors); |
||||||
|
|
||||||
|
describe('c3 api data', function () { |
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 5000, 2000, 1000, 4000, 1500, 2500] |
||||||
|
], |
||||||
|
names: { |
||||||
|
data1: 'Data Name 1', |
||||||
|
data2: 'Data Name 2' |
||||||
|
}, |
||||||
|
colors: { |
||||||
|
data1: '#FF0000', |
||||||
|
data2: '#00FF00' |
||||||
|
}, |
||||||
|
axes: { |
||||||
|
data1: 'y', |
||||||
|
data2: 'y2' |
||||||
|
} |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y2: { |
||||||
|
show: true |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('data()', function () { |
||||||
|
|
||||||
|
it('should return all of data if no argument given', function () { |
||||||
|
var results = chart.data(), |
||||||
|
expected = ['data1', 'data2']; |
||||||
|
results.forEach(function (result, i) { |
||||||
|
expect(result.id).to.equal(expected[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return specifid data if string argument given', function () { |
||||||
|
var results = chart.data('data1'); |
||||||
|
expect(results.length).to.equal(1); |
||||||
|
expect(results[0].id).to.equal('data1'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return specifid data if array argument given', function () { |
||||||
|
var results = chart.data(['data1', 'data2']); |
||||||
|
expect(results.length).to.equal(2); |
||||||
|
expect(results[0].id).to.equal('data1'); |
||||||
|
expect(results[1].id).to.equal('data2'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('data.shown()', function () { |
||||||
|
|
||||||
|
it('should return only shown targets', function () { |
||||||
|
var results; |
||||||
|
chart.hide('data1'); |
||||||
|
results = chart.data.shown(); |
||||||
|
expect(results.length).to.equal(1); |
||||||
|
expect(results[0].id).to.equal('data2'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('data.values()', function () { |
||||||
|
|
||||||
|
it('should return values for specified target', function () { |
||||||
|
var values = chart.data.values('data1'), |
||||||
|
expectedValues = [30, 200, 100, 400, 150, 250]; |
||||||
|
expect(values.length).to.equal(6); |
||||||
|
values.forEach(function (v, i) { |
||||||
|
expect(v).to.equal(expectedValues[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return null when no args', function () { |
||||||
|
var values = chart.data.values(); |
||||||
|
expect(values).to.be.null; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('data.names()', function () { |
||||||
|
|
||||||
|
it('should return data.names specified as argument', function () { |
||||||
|
var results = chart.data.names(); |
||||||
|
expect(results.data1).to.equal('Data Name 1'); |
||||||
|
expect(results.data2).to.equal('Data Name 2'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return data.names specified as api', function () { |
||||||
|
var results = chart.data.names({ |
||||||
|
data1: 'New Data Name 1', |
||||||
|
data2: 'New Data Name 2' |
||||||
|
}); |
||||||
|
expect(results.data1).to.equal('New Data Name 1'); |
||||||
|
expect(results.data2).to.equal('New Data Name 2'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set data.names specified as api', function () { |
||||||
|
expect(d3.select('.c3-legend-item-data1 text').text()).to.equal("New Data Name 1"); |
||||||
|
expect(d3.select('.c3-legend-item-data2 text').text()).to.equal("New Data Name 2"); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('data.colors()', function () { |
||||||
|
|
||||||
|
it('should return data.colors specified as argument', function () { |
||||||
|
var results = chart.data.colors(); |
||||||
|
expect(results.data1).to.be.color('#FF0000'); |
||||||
|
expect(results.data2).to.be.color('#00FF00'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return data.colors specified as api', function () { |
||||||
|
var results = chart.data.colors({ |
||||||
|
data1: '#00FF00', |
||||||
|
data2: '#FF0000' |
||||||
|
}); |
||||||
|
expect(results.data1).to.be.color('#00FF00'); |
||||||
|
expect(results.data2).to.be.color('#FF0000'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set data.colors specified as api', function () { |
||||||
|
expect(d3.select('.c3-line-data1').style('stroke')).to.be.color("#00ff00"); |
||||||
|
expect(d3.select('.c3-line-data2').style('stroke')).to.be.color("#ff0000"); |
||||||
|
expect(d3.select('.c3-legend-item-data1 .c3-legend-item-tile').style('stroke')).to.be.color("#00ff00"); |
||||||
|
expect(d3.select('.c3-legend-item-data2 .c3-legend-item-tile').style('stroke')).to.be.color("#ff0000"); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('data.axes()', function () { |
||||||
|
|
||||||
|
it('should return data.axes specified as argument', function () { |
||||||
|
var results = chart.data.axes(); |
||||||
|
expect(results.data1).to.equal('y'); |
||||||
|
expect(results.data2).to.equal('y2'); |
||||||
|
expect(d3.select('.c3-axis-y g.tick text').text()).to.equal('0'); |
||||||
|
expect(d3.select('.c3-axis-y2 g.tick text').text()).to.equal('1000'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return data.axes specified as api', function () { |
||||||
|
var results = chart.data.axes({ |
||||||
|
data1: 'y2', |
||||||
|
data2: 'y' |
||||||
|
}); |
||||||
|
expect(results.data1).to.equal('y2'); |
||||||
|
expect(results.data2).to.equal('y'); |
||||||
|
expect(d3.select('.c3-axis-y g.tick text').text()).to.equal('1000'); |
||||||
|
expect(d3.select('.c3-axis-y2 g.tick text').text()).to.equal('0'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,443 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api focus', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400], |
||||||
|
['data2', 1000, 800, 500, 2000], |
||||||
|
['data3', 5000, 2000, 1000, 4000] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('focus', function () { |
||||||
|
|
||||||
|
it('should focus all targets', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-focused')).to.be.ok; |
||||||
|
}); |
||||||
|
legendItems.each(function () { |
||||||
|
var item = d3.select(this); |
||||||
|
expect(item.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should focus one target', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus('data2'); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(targets.data2.classed('c3-focused')).to.be.ok; |
||||||
|
expect(targets.data3.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should focus multiple targets', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(['data1', 'data2']); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-focused')).to.be.ok; |
||||||
|
expect(targets.data2.classed('c3-focused')).to.be.ok; |
||||||
|
expect(targets.data3.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('defocus', function () { |
||||||
|
|
||||||
|
it('should defocus all targets', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(line.classed('c3-defocused')).to.be.ok; |
||||||
|
}); |
||||||
|
legendItems.each(function () { |
||||||
|
var item = d3.select(this); |
||||||
|
expect(item.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(+item.style('opacity')).to.be.closeTo(0.3); |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should defocus one target', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus('data2'); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(targets.data2.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data3.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(1); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should defocus multiple targets', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(['data1', 'data2']); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data2.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data3.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(1); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should defocus multiple targets after focused', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.defocus(['data1', 'data2']); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data2.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data3.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(1); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('revert', function () { |
||||||
|
|
||||||
|
it('should revert all targets after focus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-focused')).to.not.be.ok; |
||||||
|
}); |
||||||
|
legendItems.each(function () { |
||||||
|
var item = d3.select(this); |
||||||
|
expect(item.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(+item.style('opacity')).to.be.closeTo(1); |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should revert all targets after defocus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-defocused')).to.not.be.ok; |
||||||
|
}); |
||||||
|
legendItems.each(function () { |
||||||
|
var item = d3.select(this); |
||||||
|
expect(item.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(+item.style('opacity')).to.be.closeTo(1); |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should revert one target after focus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert('data2'); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-focused')).to.be.ok; |
||||||
|
expect(targets.data2.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(targets.data3.classed('c3-focused')).to.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should revert one target after defocus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert('data2'); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(targets.data2.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(targets.data3.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should focus multiple targets after focus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert(['data1', 'data2']); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(targets.data2.classed('c3-focused')).to.not.be.ok; |
||||||
|
expect(targets.data3.classed('c3-focused')).to.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should focus multiple targets after defocus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert(['data1', 'data2']); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = { |
||||||
|
data1: main.select('.c3-chart-line.c3-target.c3-target-data1'), |
||||||
|
data2: main.select('.c3-chart-line.c3-target.c3-target-data2'), |
||||||
|
data3: main.select('.c3-chart-line.c3-target.c3-target-data3') |
||||||
|
}, |
||||||
|
legendItems = { |
||||||
|
data1: legend.select('.c3-legend-item-data1'), |
||||||
|
data2: legend.select('.c3-legend-item-data2'), |
||||||
|
data3: legend.select('.c3-legend-item-data3') |
||||||
|
}; |
||||||
|
expect(targets.data1.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(targets.data2.classed('c3-defocused')).to.not.be.ok; |
||||||
|
expect(targets.data3.classed('c3-defocused')).to.be.ok; |
||||||
|
expect(+legendItems.data1.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data2.style('opacity')).to.be.closeTo(1); |
||||||
|
expect(+legendItems.data3.style('opacity')).to.be.closeTo(0.3); |
||||||
|
expect(legendItems.data1.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data2.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
expect(legendItems.data3.classed('c3-legend-item-focused')).to.not.be.ok; |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('when legend.show = false', function () { |
||||||
|
|
||||||
|
it('should update args to hide legend', function () { |
||||||
|
args.legend = { |
||||||
|
show: false |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should focus all targets without showing legend', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-focused')).to.be.ok; |
||||||
|
}); |
||||||
|
expect(legendItems.size()).to.be.closeTo(0); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should defocus all targets without showing legend', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.defocus(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-defocused')).to.be.ok; |
||||||
|
}); |
||||||
|
expect(legendItems.size()).to.be.closeTo(0); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should revert all targets after focus', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.focus(); |
||||||
|
setTimeout(function () { |
||||||
|
chart.revert(); |
||||||
|
setTimeout(function () { |
||||||
|
var targets = main.select('.c3-chart-line.c3-target'), |
||||||
|
legendItems = legend.select('.c3-legend-item'); |
||||||
|
targets.each(function () { |
||||||
|
var line = d3.select(this); |
||||||
|
expect(line.classed('c3-focused')).to.not.be.ok; |
||||||
|
}); |
||||||
|
expect(legendItems.size()).to.be.closeTo(0); |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,121 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api grid', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('ygrid.add and ygrid.remove', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update y grids', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
expectedGrids = [ |
||||||
|
{ |
||||||
|
value: 100, |
||||||
|
text: 'Pressure Low' |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: 200, |
||||||
|
text: 'Pressure High' |
||||||
|
} |
||||||
|
], |
||||||
|
grids; |
||||||
|
|
||||||
|
// Call ygrids.add
|
||||||
|
chart.ygrids.add(expectedGrids); |
||||||
|
setTimeout(function () { |
||||||
|
grids = main.selectAll('.c3-ygrid-line'); |
||||||
|
expect(grids.size()).to.equal(expectedGrids.length); |
||||||
|
grids.each(function (d, i) { |
||||||
|
var y = +d3.select(this).select('line').attr('y1'), |
||||||
|
text = d3.select(this).select('text').text(), |
||||||
|
expectedY = Math.round(chart.internal.y(expectedGrids[i].value)), |
||||||
|
expectedText = expectedGrids[i].text; |
||||||
|
expect(y).to.equal(expectedY); |
||||||
|
expect(text).to.equal(expectedText); |
||||||
|
}); |
||||||
|
|
||||||
|
// Call ygrids.remove
|
||||||
|
chart.ygrids.remove(expectedGrids); |
||||||
|
setTimeout(function () { |
||||||
|
grids = main.selectAll('.c3-ygrid-line'); |
||||||
|
expect(grids.size()).to.equal(0); |
||||||
|
}, 500); |
||||||
|
|
||||||
|
}, 500); |
||||||
|
|
||||||
|
setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 1200); |
||||||
|
}); |
||||||
|
|
||||||
|
it("should update x ygrids even if it's zoomed", function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
expectedGrids = [ |
||||||
|
{ |
||||||
|
value: 0, |
||||||
|
text: 'Pressure Low' |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: 1, |
||||||
|
text: 'Pressure High' |
||||||
|
} |
||||||
|
], |
||||||
|
grids, domain; |
||||||
|
|
||||||
|
chart.zoom([0, 2]); |
||||||
|
setTimeout(function () { |
||||||
|
|
||||||
|
// Call xgrids
|
||||||
|
chart.xgrids(expectedGrids); |
||||||
|
setTimeout(function () { |
||||||
|
grids = main.selectAll('.c3-xgrid-line'); |
||||||
|
expect(grids.size()).to.equal(expectedGrids.length); |
||||||
|
grids.each(function (d, i) { |
||||||
|
var x = +d3.select(this).select('line').attr('x1'), |
||||||
|
text = d3.select(this).select('text').text(), |
||||||
|
expectedX = Math.round(chart.internal.x(expectedGrids[i].value)), |
||||||
|
expectedText = expectedGrids[i].text; |
||||||
|
expect(x).to.equal(expectedX); |
||||||
|
expect(text).to.equal(expectedText); |
||||||
|
}); |
||||||
|
|
||||||
|
// check if it was not rescaled
|
||||||
|
domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.be.below(0); |
||||||
|
expect(domain[1]).to.be.above(400); |
||||||
|
|
||||||
|
// Call xgrids.remove
|
||||||
|
chart.xgrids.remove(expectedGrids); |
||||||
|
setTimeout(function () { |
||||||
|
grids = main.selectAll('.c3-xgrid-line'); |
||||||
|
expect(grids.size()).to.equal(0); |
||||||
|
}, 500); // for xgrids.remove()
|
||||||
|
|
||||||
|
}, 500); // for xgrids()
|
||||||
|
|
||||||
|
}, 500); // for zoom
|
||||||
|
|
||||||
|
setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 1700); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,123 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api load', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('indexed data', function () { |
||||||
|
|
||||||
|
describe('as column', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 5000, 2000, 1000, 4000, 1500, 2500] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should load additional data', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.load({ |
||||||
|
columns: [ |
||||||
|
['data3', 800, 500, 900, 500, 1000, 700] |
||||||
|
] |
||||||
|
}); |
||||||
|
setTimeout(function () { |
||||||
|
var target = main.select('.c3-chart-line.c3-target.c3-target-data3'), |
||||||
|
legendItem = legend.select('.c3-legend-item.c3-legend-item-data3'); |
||||||
|
expect(target.size()).to.equal(1); |
||||||
|
expect(legendItem.size()).to.equal(1); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('category data', function () { |
||||||
|
|
||||||
|
it('should update arg to category data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 'cat1', 'cat2', 'cat3', 'cat4', 'cat5', 'cat6'], |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 5000, 2000, 1000, 4000, 1500, 2500] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'category' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
describe('as column', function () { |
||||||
|
|
||||||
|
it('should load additional data', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.load({ |
||||||
|
columns: [ |
||||||
|
['data3', 800, 500, 900, 500, 1000, 700] |
||||||
|
] |
||||||
|
}); |
||||||
|
setTimeout(function () { |
||||||
|
var target = main.select('.c3-chart-line.c3-target.c3-target-data3'), |
||||||
|
legendItem = legend.select('.c3-legend-item.c3-legend-item-data3'), |
||||||
|
tickTexts = main.selectAll('.c3-axis-x g.tick text'), |
||||||
|
expected = ['cat1', 'cat2', 'cat3', 'cat4', 'cat5', 'cat6']; |
||||||
|
expect(target.size()).to.equal(1); |
||||||
|
expect(legendItem.size()).to.equal(1); |
||||||
|
tickTexts.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('tspan').text(); |
||||||
|
expect(text).to.equal(expected[i]); |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should load additional data', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
legend = chart.internal.legend; |
||||||
|
chart.load({ |
||||||
|
columns: [ |
||||||
|
['x', 'new1', 'new2', 'new3', 'new4', 'new5', 'new6'], |
||||||
|
['data3', 800, 500, 900, 500, 1000, 700] |
||||||
|
] |
||||||
|
}); |
||||||
|
setTimeout(function () { |
||||||
|
var target = main.select('.c3-chart-line.c3-target.c3-target-data3'), |
||||||
|
legendItem = legend.select('.c3-legend-item.c3-legend-item-data3'), |
||||||
|
tickTexts = main.selectAll('.c3-axis-x g.tick text'), |
||||||
|
expected = ['new1', 'new2', 'new3', 'new4', 'new5', 'new6']; |
||||||
|
expect(target.size()).to.equal(1); |
||||||
|
expect(legendItem.size()).to.equal(1); |
||||||
|
tickTexts.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('tspan').text(); |
||||||
|
expect(text).to.equal(expected[i]); |
||||||
|
}); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,252 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api region', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('api.region', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
] |
||||||
|
}, |
||||||
|
regions: [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 300, |
||||||
|
end: 400, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 0, |
||||||
|
end: 100, |
||||||
|
class: 'green', |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update regions', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
expectedRegions = [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 250, |
||||||
|
end: 350, |
||||||
|
class: 'red' |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 25, |
||||||
|
end: 75, |
||||||
|
class: 'red' |
||||||
|
} |
||||||
|
], |
||||||
|
regions; |
||||||
|
|
||||||
|
// Call regions API
|
||||||
|
chart.regions(expectedRegions); |
||||||
|
setTimeout(function () { |
||||||
|
regions = main.selectAll('.c3-region'); |
||||||
|
expect(regions.size()).to.equal(expectedRegions.length); |
||||||
|
|
||||||
|
regions.each(function (d, i) { |
||||||
|
var region = d3.select(this), |
||||||
|
rect = region.select('rect'), |
||||||
|
y = +rect.attr('y'), |
||||||
|
height = +rect.attr('height'), |
||||||
|
expectedClass = 'red', |
||||||
|
unexpectedClass = 'green', |
||||||
|
expectedStart = Math.round(chart.internal.y(expectedRegions[i].start)), |
||||||
|
expectedEnd = Math.round(chart.internal.y(expectedRegions[i].end)), |
||||||
|
expectedY = expectedEnd, |
||||||
|
expectedHeight = expectedStart - expectedEnd; |
||||||
|
expect(y).to.be.closeTo(expectedY, -1); |
||||||
|
expect(height).to.be.closeTo(expectedHeight, -1); |
||||||
|
expect(region.classed(expectedClass)).to.be.ok; |
||||||
|
expect(region.classed(unexpectedClass)).to.not.be.ok; |
||||||
|
}); |
||||||
|
}, 500); |
||||||
|
|
||||||
|
setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('api.region.add', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
] |
||||||
|
}, |
||||||
|
regions: [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 300, |
||||||
|
end: 400, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 0, |
||||||
|
end: 100, |
||||||
|
class: 'green', |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should add regions', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
expectedRegions = [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 300, |
||||||
|
end: 400, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 0, |
||||||
|
end: 100, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 250, |
||||||
|
end: 350, |
||||||
|
class: 'red' |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 25, |
||||||
|
end: 75, |
||||||
|
class: 'red' |
||||||
|
} |
||||||
|
], |
||||||
|
expectedClasses = [ |
||||||
|
'green', |
||||||
|
'green', |
||||||
|
'red', |
||||||
|
'red', |
||||||
|
], |
||||||
|
regions; |
||||||
|
|
||||||
|
// Call regions API
|
||||||
|
chart.regions(expectedRegions); |
||||||
|
setTimeout(function () { |
||||||
|
regions = main.selectAll('.c3-region'); |
||||||
|
expect(regions.size()).to.equal(expectedRegions.length); |
||||||
|
|
||||||
|
regions.each(function (d, i) { |
||||||
|
var region = d3.select(this), |
||||||
|
rect = region.select('rect'), |
||||||
|
y = +rect.attr('y'), |
||||||
|
height = +rect.attr('height'), |
||||||
|
expectedClass = expectedClasses[i], |
||||||
|
expectedStart = Math.round(chart.internal.y(expectedRegions[i].start)), |
||||||
|
expectedEnd = Math.round(chart.internal.y(expectedRegions[i].end)), |
||||||
|
expectedY = expectedEnd, |
||||||
|
expectedHeight = expectedStart - expectedEnd; |
||||||
|
expect(y).to.be.closeTo(expectedY, -1); |
||||||
|
expect(height).to.be.closeTo(expectedHeight, -1); |
||||||
|
expect(region.classed(expectedClass)).to.be.ok; |
||||||
|
}); |
||||||
|
}, 500); |
||||||
|
|
||||||
|
setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('api.region.remove', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
] |
||||||
|
}, |
||||||
|
regions: [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 300, |
||||||
|
end: 400, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 0, |
||||||
|
end: 100, |
||||||
|
class: 'green', |
||||||
|
}, |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 250, |
||||||
|
end: 350, |
||||||
|
class: 'red' |
||||||
|
}, |
||||||
|
] |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should remove regions', function (done) { |
||||||
|
var main = chart.internal.main, |
||||||
|
expectedRegions = [ |
||||||
|
{ |
||||||
|
axis: 'y', |
||||||
|
start: 250, |
||||||
|
end: 350, |
||||||
|
class: 'red' |
||||||
|
}, |
||||||
|
], |
||||||
|
expectedClasses = ['red'], |
||||||
|
regions; |
||||||
|
|
||||||
|
// Call regions API
|
||||||
|
chart.regions(expectedRegions); |
||||||
|
setTimeout(function () { |
||||||
|
regions = main.selectAll('.c3-region'); |
||||||
|
expect(regions.size()).to.equal(expectedRegions.length); |
||||||
|
|
||||||
|
regions.each(function (d, i) { |
||||||
|
var region = d3.select(this), |
||||||
|
rect = region.select('rect'), |
||||||
|
y = +rect.attr('y'), |
||||||
|
height = +rect.attr('height'), |
||||||
|
expectedClass = expectedClasses[i], |
||||||
|
expectedStart = Math.round(chart.internal.y(expectedRegions[i].start)), |
||||||
|
expectedEnd = Math.round(chart.internal.y(expectedRegions[i].end)), |
||||||
|
expectedY = expectedEnd, |
||||||
|
expectedHeight = expectedStart - expectedEnd; |
||||||
|
expect(y).to.be.closeTo(expectedY, -1); |
||||||
|
expect(height).to.be.closeTo(expectedHeight, -1); |
||||||
|
expect(region.classed(expectedClass)).to.be.ok; |
||||||
|
}); |
||||||
|
}, 500); |
||||||
|
|
||||||
|
setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 1000); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,117 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 api zoom', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('zoom', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
}, |
||||||
|
zoom: { |
||||||
|
enabled: true |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be zoomed properly', function () { |
||||||
|
var target = [3, 5], domain; |
||||||
|
chart.zoom(target); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(domain[0]).to.equal(target[0]); |
||||||
|
expect(domain[1]).to.equal(target[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be zoomed properly again', function () { |
||||||
|
var target = [1, 4], domain; |
||||||
|
chart.zoom(target); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(domain[0]).to.equal(target[0]); |
||||||
|
expect(domain[1]).to.equal(target[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should load timeseries data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'date', |
||||||
|
columns: [ |
||||||
|
['date', '2014-01-01', '2014-01-02', '2014-08-01', '2014-10-19'], |
||||||
|
['data1', 30, 200, 100, 400] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'timeseries' |
||||||
|
} |
||||||
|
}, |
||||||
|
zoom: { |
||||||
|
enabled: true |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be zoomed properly', function () { |
||||||
|
var target = [new Date(2014, 7, 1), new Date(2014, 8, 1)], domain; |
||||||
|
chart.zoom(target); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(+domain[0]).to.equal(+target[0]); |
||||||
|
expect(+domain[1]).to.equal(+target[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be zoomed properly', function () { |
||||||
|
var target = ['2014-08-01', '2014-09-01'], domain; |
||||||
|
chart.zoom(target); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(+domain[0]).to.equal(+chart.internal.parseDate(target[0])); |
||||||
|
expect(+domain[1]).to.equal(+chart.internal.parseDate(target[1])); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('unzoom', function () { |
||||||
|
|
||||||
|
it('should load indexed data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
zoom: { |
||||||
|
enabled: true |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be unzoomed properly', function () { |
||||||
|
var target = [1, 4], orginal = chart.internal.x.domain(), domain; |
||||||
|
|
||||||
|
chart.zoom(target); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(domain[0]).to.equal(target[0]); |
||||||
|
expect(domain[1]).to.equal(target[1]); |
||||||
|
|
||||||
|
chart.unzoom(); |
||||||
|
domain = chart.internal.x.domain(); |
||||||
|
expect(domain[0]).to.equal(orginal[0]); |
||||||
|
expect(domain[1]).to.equal(orginal[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,161 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart arc', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('show pie chart', function () { |
||||||
|
|
||||||
|
it('should update args to have pie chart', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30], |
||||||
|
['data2', 150], |
||||||
|
['data3', 120] |
||||||
|
], |
||||||
|
type: 'pie' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct classes', function () { |
||||||
|
var chartArc = d3.select('.c3-chart-arcs'), |
||||||
|
arcs = { |
||||||
|
data1: chartArc.select('.c3-chart-arc.c3-target.c3-target-data1') |
||||||
|
.select('g.c3-shapes.c3-shapes-data1.c3-arcs.c3-arcs-data1') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data1'), |
||||||
|
data2: chartArc.select('.c3-chart-arc.c3-target.c3-target-data2') |
||||||
|
.select('g.c3-shapes.c3-shapes-data2.c3-arcs.c3-arcs-data2') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data2'), |
||||||
|
data3: chartArc.select('.c3-chart-arc.c3-target.c3-target-data3') |
||||||
|
.select('g.c3-shapes.c3-shapes-data3.c3-arcs.c3-arcs-data3') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data3') |
||||||
|
}; |
||||||
|
expect(arcs.data1.size()).to.equal(1); |
||||||
|
expect(arcs.data2.size()).to.equal(1); |
||||||
|
expect(arcs.data3.size()).to.equal(1); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct d', function () { |
||||||
|
expect(d3.select('.c3-arc-data1').attr('d')).toMatch(/M-124\..+,-171\..+A211\..+,211\..+ 0 0,1 -3\..+,-211\..+L0,0Z/); |
||||||
|
expect(d3.select('.c3-arc-data2').attr('d')).toMatch(/M1\..+,-211\..+A211\..+,211\..+ 0 0,1 1\..+,211\..+L0,0Z/); |
||||||
|
expect(d3.select('.c3-arc-data3').attr('d')).toMatch(/M1\..+,211\..+A211\..+,211\..+ 0 0,1 -124\..+,-171\..+L0,0Z/); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set args with data id that can be converted to a color', function () { |
||||||
|
args.data.columns = [ |
||||||
|
['black', 30], |
||||||
|
['data2', 150], |
||||||
|
['data3', 120] |
||||||
|
]; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct d even if data id can be converted to a color', function (done) { |
||||||
|
setTimeout(function () { |
||||||
|
expect(d3.select('.c3-arc-black').attr('d')).toMatch(/M-124\..+,-171\..+A211\..+,211\..+ 0 0,1 -3\..+,-211\..+L0,0Z/); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have empty pie chart', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', null], |
||||||
|
['data2', null], |
||||||
|
['data3', null] |
||||||
|
], |
||||||
|
type: 'pie' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct d attribute', function () { |
||||||
|
var chartArc = d3.select('.c3-chart-arcs'), |
||||||
|
arcs = { |
||||||
|
data1: chartArc.select('.c3-chart-arc.c3-target.c3-target-data1') |
||||||
|
.select('g.c3-shapes.c3-shapes-data1.c3-arcs.c3-arcs-data1') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data1'), |
||||||
|
data2: chartArc.select('.c3-chart-arc.c3-target.c3-target-data2') |
||||||
|
.select('g.c3-shapes.c3-shapes-data2.c3-arcs.c3-arcs-data2') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data2'), |
||||||
|
data3: chartArc.select('.c3-chart-arc.c3-target.c3-target-data3') |
||||||
|
.select('g.c3-shapes.c3-shapes-data3.c3-arcs.c3-arcs-data3') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data3') |
||||||
|
}; |
||||||
|
expect(arcs.data1.attr('d').indexOf('NaN')).to.equal(-1); |
||||||
|
expect(arcs.data2.attr('d').indexOf('NaN')).to.equal(-1); |
||||||
|
expect(arcs.data3.attr('d').indexOf('NaN')).to.equal(-1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('show gauge', function () { |
||||||
|
|
||||||
|
it('should update args to have a 180 degree gauge', function () { |
||||||
|
args = { |
||||||
|
gauge: { |
||||||
|
width: 10, |
||||||
|
max: 10, |
||||||
|
expand: true |
||||||
|
}, |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data', 8] |
||||||
|
], |
||||||
|
type: 'gauge' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct d for Pi radian gauge', function () { |
||||||
|
var chartArc = d3.select('.c3-chart-arcs'), |
||||||
|
data = chartArc.select('.c3-chart-arc.c3-target.c3-target-data') |
||||||
|
.select('g.c3-shapes.c3-shapes-data.c3-arcs.c3-arcs-data') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data'); |
||||||
|
|
||||||
|
expect(data.attr('d')).toMatch(/M-304,-3\..+A304,304 0 0,1 245\..+,-178\..+L237\..+,-172\..+A294,294 0 0,0 -294,-3\..+Z/); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have a 2 Pi radian gauge that starts at Pi/2', function() { |
||||||
|
args = { |
||||||
|
gauge: { |
||||||
|
width: 10, |
||||||
|
max: 10, |
||||||
|
expand: true, |
||||||
|
fullCircle: true |
||||||
|
}, |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data', 8] |
||||||
|
], |
||||||
|
type: 'gauge', |
||||||
|
fullCircle: true, |
||||||
|
startingAngle: Math.PI/2 |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have correct d for 2 Pi radian gauge starting at Pi/2', function() { |
||||||
|
var chartArc = d3.select('.c3-chart-arcs'), |
||||||
|
data = chartArc.select('.c3-chart-arc.c3-target.c3-target-data') |
||||||
|
.select('g.c3-shapes.c3-shapes-data.c3-arcs.c3-arcs-data') |
||||||
|
.select('path.c3-shape.c3-shape.c3-arc.c3-arc-data'); |
||||||
|
|
||||||
|
// This test has bee updated to make tests pass. @TODO double-check this test is accurate.
|
||||||
|
expect(data.attr('d')).toMatch(/M-221.*?,-2\..+A221.*?,221.*? 0 1,1 -68.*?,210.*?L-65.*?,201.*?A211.*?,211.*? 0 1,0 -211.*?,-2.*?Z/); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,842 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart axis', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
tick: { |
||||||
|
values: null, |
||||||
|
count: undefined |
||||||
|
} |
||||||
|
}, |
||||||
|
y2: { |
||||||
|
tick: { |
||||||
|
values: null, |
||||||
|
count: undefined |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.tick.count', function () { |
||||||
|
|
||||||
|
it('should update args to have only 1 tick on y axis', function () { |
||||||
|
args.axis.y.tick.count = 1; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have only 1 tick on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(1); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have 2 ticks on y axis', function () { |
||||||
|
args.axis.y.tick.count = 2; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 2 ticks on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(2); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have 3 ticks on y axis', function () { |
||||||
|
args.axis.y.tick.count = 3; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 3 ticks on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.tick.values', function () { |
||||||
|
|
||||||
|
var values = [100, 500]; |
||||||
|
|
||||||
|
it('should update args to have only 2 ticks on y axis', function () { |
||||||
|
args.axis.y.tick.values = values; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have only 2 tick on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(2); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have specified tick texts', function () { |
||||||
|
d3.select('.c3-axis-y').selectAll('g.tick').each(function (d, i) { |
||||||
|
var text = d3.select(this).select('text').text(); |
||||||
|
expect(+text).to.equal(values[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis y timeseries', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
["times", 60000, 120000, 180000, 240000] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
type : 'timeseries', |
||||||
|
tick: { |
||||||
|
time: { |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 7 ticks on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(7); // the count starts at initial value and increments by the set interval
|
||||||
|
}); |
||||||
|
|
||||||
|
it('should have specified 30 second intervals', function () { |
||||||
|
var prevValue; |
||||||
|
d3.select('.c3-axis-y').selectAll('g.tick').each(function (d, i) { |
||||||
|
if (i !== 0) { |
||||||
|
var result = d - prevValue; |
||||||
|
expect(result).toEqual(30000); // expressed in milliseconds
|
||||||
|
} |
||||||
|
prevValue = d; |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to set axis.y.time', function () { |
||||||
|
args.axis.y.tick.time = { |
||||||
|
value : 'seconds', |
||||||
|
interval : 60 |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 4 ticks on y axis', function () { |
||||||
|
var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); |
||||||
|
expect(ticksSize).to.equal(4); // the count starts at initial value and increments by the set interval
|
||||||
|
}); |
||||||
|
|
||||||
|
it('should have specified 60 second intervals', function () { |
||||||
|
var prevValue; |
||||||
|
d3.select('.c3-axis-y').selectAll('g.tick').each(function (d, i) { |
||||||
|
if (i !== 0) { |
||||||
|
var result = d - prevValue; |
||||||
|
expect(result).toEqual(60000); // expressed in milliseconds
|
||||||
|
} |
||||||
|
prevValue = d; |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.x.tick.values', function () { |
||||||
|
describe('function is provided', function () { |
||||||
|
var tickGenerator = function () { |
||||||
|
var values = []; |
||||||
|
for (var i = 0; i <= 300; i += 50) { |
||||||
|
values.push(i); |
||||||
|
} |
||||||
|
return values; |
||||||
|
}; |
||||||
|
beforeEach(function () { |
||||||
|
args.axis.x = { |
||||||
|
tick: { |
||||||
|
values: tickGenerator |
||||||
|
} |
||||||
|
}; |
||||||
|
chart = window.c3.generate(args); |
||||||
|
window.generatedTicks = tickGenerator(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should use function to generate ticks', function () { |
||||||
|
d3.select('.c3-axis-x').selectAll('g.tick').each(function (d, i) { |
||||||
|
var tick = d3.select(this).select('text').text(); |
||||||
|
expect(+tick).to.equal(window.generatedTicks[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.x.tick.width', function () { |
||||||
|
|
||||||
|
describe('indexed x axis and y/y2 axis', function () { |
||||||
|
|
||||||
|
describe('not rotated', function () { |
||||||
|
|
||||||
|
it('should update args successfully', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
], |
||||||
|
axes: { |
||||||
|
data2: 'y2' |
||||||
|
} |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y2: { |
||||||
|
show: true |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should construct indexed x axis properly', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'), |
||||||
|
expectedX = '0', |
||||||
|
expectedDy = '.71em'; |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
ticks.each(function (d, i) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(i + ''); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set axis.x.tick.format', function () { |
||||||
|
args.axis.x = { |
||||||
|
tick: { |
||||||
|
format: function () { |
||||||
|
return 'very long tick text on x axis'; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split x axis tick text to multiple lines', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'), |
||||||
|
expectedTexts = ['very long tick text', 'on x axis'], |
||||||
|
expectedX = '0'; |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
ticks.each(function () { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(2); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
if (i === 0) { |
||||||
|
expect(tspan.attr('dy')).to.equal('.71em'); |
||||||
|
} else { |
||||||
|
expect(tspan.attr('dy')).to.be.above(8); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should construct y axis properly', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-y').selectAll('g.tick'), |
||||||
|
expectedX = '-9', |
||||||
|
expectedDy = '3'; |
||||||
|
expect(ticks.size()).to.equal(9); |
||||||
|
ticks.each(function (d) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(d + ''); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should construct y2 axis properly', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-y2').selectAll('g.tick'), |
||||||
|
expectedX = '9', |
||||||
|
expectedDy = '3'; |
||||||
|
expect(ticks.size()).to.equal(9); |
||||||
|
ticks.each(function (d) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(d + ''); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set big values in y', function () { |
||||||
|
args.data.columns = [ |
||||||
|
['data1', 3000000000000000, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
]; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not split y axis tick text to multiple lines', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-y2').selectAll('g.tick'); |
||||||
|
ticks.each(function () { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('rotated', function () { |
||||||
|
|
||||||
|
it('should update args to rotate axis', function () { |
||||||
|
args.axis.rotated = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split x axis tick text to multiple lines', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'), |
||||||
|
expectedTexts = ['very long tick', 'text on x axis'], |
||||||
|
expectedX = '-9'; |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
ticks.each(function () { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(2); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
if (i === 0) { |
||||||
|
expect(tspan.attr('dy')).to.be.below(0); |
||||||
|
} else { |
||||||
|
expect(tspan.attr('dy')).to.be.above(9); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not split y axis tick text to multiple lines', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-y').selectAll('g.tick'), |
||||||
|
expectedTexts = [ |
||||||
|
'0', |
||||||
|
'500000000000000', |
||||||
|
'1000000000000000', |
||||||
|
'1500000000000000', |
||||||
|
'2000000000000000', |
||||||
|
'2500000000000000', |
||||||
|
'3000000000000000' |
||||||
|
], |
||||||
|
expectedX = '0', |
||||||
|
expectedDy = '.71em'; |
||||||
|
expect(ticks.size()).to.equal(7); |
||||||
|
ticks.each(function (d, i) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('category axis', function () { |
||||||
|
|
||||||
|
describe('not rotated', function () { |
||||||
|
|
||||||
|
it('should update args successfully', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 'this is a very long tick text on category axis', 'cat1', 'cat2', 'cat3', 'cat4', 'cat5'], |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'category' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate ticks properly', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); |
||||||
|
ticks.each(function (d, i) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'), |
||||||
|
expectedX = '0', |
||||||
|
expectedDy = '.71em'; |
||||||
|
if (i > 0) { // i === 0 should be checked in next test
|
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split tick text properly', function () { |
||||||
|
var tick = chart.internal.main.select('.c3-axis-x').select('g.tick'), |
||||||
|
tspans = tick.selectAll('tspan'), |
||||||
|
expectedTickTexts = [ |
||||||
|
'this is a very', |
||||||
|
'long tick text', |
||||||
|
'on category axis' |
||||||
|
], |
||||||
|
expectedX = '0'; |
||||||
|
expect(tspans.size()).to.equal(3); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTickTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
// unable to define pricise number because it differs depends on environment..
|
||||||
|
if (i === 0) { |
||||||
|
expect(tspan.attr('dy')).to.equal('.71em'); |
||||||
|
} else { |
||||||
|
expect(tspan.attr('dy')).to.be.above(8); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('rotated', function () { |
||||||
|
|
||||||
|
it('should update args to rotate axis', function () { |
||||||
|
args.axis.rotated = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate ticks on rotated axis properly', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); |
||||||
|
ticks.each(function (d, i) { |
||||||
|
var tspans = d3.select(this).selectAll('tspan'), |
||||||
|
expectedX = '-9', |
||||||
|
expectedDy = '3'; |
||||||
|
if (i > 0) { // i === 0 should be checked in next test
|
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
tspans.each(function () { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
expect(tspan.attr('dy')).to.equal(expectedDy); |
||||||
|
}); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split tick text on rotated axis properly', function () { |
||||||
|
var tick = chart.internal.main.select('.c3-axis-x').select('g.tick'), |
||||||
|
tspans = tick.selectAll('tspan'), |
||||||
|
expectedTickTexts = [ |
||||||
|
'this is a very', |
||||||
|
'long tick text on', |
||||||
|
'category axis' |
||||||
|
], |
||||||
|
expectedX = '-9'; |
||||||
|
expect(tspans.size()).to.equal(3); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTickTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
// unable to define pricise number because it differs depends on environment..
|
||||||
|
if (i === 0) { |
||||||
|
expect(tspan.attr('dy')).to.be.below(0); |
||||||
|
} else { |
||||||
|
expect(tspan.attr('dy')).to.be.above(8); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('option used', function () { |
||||||
|
|
||||||
|
describe('as null', function () { |
||||||
|
|
||||||
|
it('should update args not to split ticks', function () { |
||||||
|
args.axis.x.tick = { |
||||||
|
multiline: false |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split x tick', function () { |
||||||
|
var tick = chart.internal.main.select('.c3-axis-x').select('g.tick'), |
||||||
|
tspans = tick.selectAll('tspan'); |
||||||
|
expect(tspans.size()).to.equal(1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('as value', function () { |
||||||
|
|
||||||
|
it('should update args not to split ticks', function () { |
||||||
|
args.axis.x.tick = { |
||||||
|
width: 150 |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should split x tick to 2 lines properly', function () { |
||||||
|
var tick = chart.internal.main.select('.c3-axis-x').select('g.tick'), |
||||||
|
tspans = tick.selectAll('tspan'), |
||||||
|
expectedTickTexts = [ |
||||||
|
'this is a very long tick', |
||||||
|
'text on category axis' |
||||||
|
], |
||||||
|
expectedX = '-9'; |
||||||
|
expect(tspans.size()).to.equal(2); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTickTexts[i]); |
||||||
|
expect(tspan.attr('x')).to.equal(expectedX); |
||||||
|
// unable to define pricise number because it differs depends on environment..
|
||||||
|
if (i === 0) { |
||||||
|
expect(tspan.attr('dy')).to.be.below(0); |
||||||
|
} else { |
||||||
|
expect(tspan.attr('dy')).to.be.above(8); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('with axis.x.tick.format', function () { |
||||||
|
|
||||||
|
it('should update args to use axis.x.tick.format', function () { |
||||||
|
args.axis.x.tick.format = function () { |
||||||
|
return ['this is a very long tick text', 'on category axis']; |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have multiline tick text', function () { |
||||||
|
var tick = chart.internal.main.select('.c3-axis-x').select('g.tick'), |
||||||
|
tspans = tick.selectAll('tspan'), |
||||||
|
expectedTickTexts = ['this is a very long tick text', 'on category axis']; |
||||||
|
expect(tspans.size()).to.equal(2); |
||||||
|
tspans.each(function (d, i) { |
||||||
|
var tspan = d3.select(this); |
||||||
|
expect(tspan.text()).to.equal(expectedTickTexts[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.x.tick.rotate', function () { |
||||||
|
|
||||||
|
describe('not rotated', function () { |
||||||
|
|
||||||
|
it('should update args successfully', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 'category 1', 'category 2', 'category 3', 'category 4', 'category 5', 'category 6'], |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'category', |
||||||
|
tick: { |
||||||
|
rotate: 60 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should rotate tick texts', function () { |
||||||
|
chart.internal.main.selectAll('.c3-axis-x g.tick').each(function () { |
||||||
|
var tick = d3.select(this), |
||||||
|
text = tick.select('text'), |
||||||
|
tspan = text.select('tspan'); |
||||||
|
expect(text.attr('transform')).to.equal('rotate(60)'); |
||||||
|
expect(text.attr('y')).to.equal('1.5'); |
||||||
|
expect(tspan.attr('dx')).to.equal('6.928203230275509'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have automatically calculated x axis height', function () { |
||||||
|
var box = chart.internal.main.select('.c3-axis-x').node().getBoundingClientRect(), |
||||||
|
height = chart.internal.getHorizontalAxisHeight('x'); |
||||||
|
expect(box.height).to.be.above(50); |
||||||
|
expect(height).to.be.closeTo(70, -1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.tick.rotate', function () { |
||||||
|
|
||||||
|
describe('not rotated', function () { |
||||||
|
|
||||||
|
it('should update args successfully', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250, 100, 600], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
rotated: true, |
||||||
|
y: { |
||||||
|
tick: { |
||||||
|
rotate: 45 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should rotate tick texts', function () { |
||||||
|
chart.internal.main.selectAll('.c3-axis-y g.tick').each(function () { |
||||||
|
var tick = d3.select(this), |
||||||
|
text = tick.select('text'), |
||||||
|
tspan = text.select('tspan'); |
||||||
|
expect(text.attr('transform')).to.equal('rotate(45)'); |
||||||
|
expect(text.attr('y')).to.equal('4'); |
||||||
|
expect(tspan.attr('dx')).to.be.closeTo('5.6', 0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have automatically calculated y axis width', function () { |
||||||
|
var box = chart.internal.main.select('.c3-axis-y').node().getBoundingClientRect(); |
||||||
|
expect(box.width).to.be.closeTo(590, 1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.x.tick.fit', function () { |
||||||
|
|
||||||
|
describe('axis.x.tick.fit = true', function () { |
||||||
|
|
||||||
|
it('should set args for indexed data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks on indexed data', function () { |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set args for x-based data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 10, 20, 100, 110, 200, 1000], |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks on indexed data', function () { |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks after hide and show', function () { |
||||||
|
chart.hide(); |
||||||
|
chart.show(); |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(6); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.x.tick.fit = false', function () { |
||||||
|
|
||||||
|
it('should set args for indexed data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
tick: { |
||||||
|
fit: false |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks on indexed data', function () { |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(11); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set args for x-based data', function () { |
||||||
|
args.data = { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 10, 20, 100, 110, 200, 1000], |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks on indexed data', function () { |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(10); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show fitted ticks after hide and show', function () { |
||||||
|
chart.hide(); |
||||||
|
chart.show(); |
||||||
|
var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); |
||||||
|
expect(ticks.size()).to.equal(10); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.inner', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
inner: false |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not have inner y axis', function () { |
||||||
|
var paddingLeft = chart.internal.getCurrentPaddingLeft(), |
||||||
|
tickTexts = chart.internal.main.selectAll('.c3-axis-y g.tick text'); |
||||||
|
expect(paddingLeft).to.be.above(19); |
||||||
|
tickTexts.each(function () { |
||||||
|
expect(+d3.select(this).attr('x')).to.be.below(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have inner y axis', function () { |
||||||
|
args.axis.y.inner = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have inner y axis', function () { |
||||||
|
var paddingLeft = chart.internal.getCurrentPaddingLeft(), |
||||||
|
tickTexts = chart.internal.main.selectAll('.c3-axis-y g.tick text'); |
||||||
|
expect(paddingLeft).to.equal(1); |
||||||
|
tickTexts.each(function () { |
||||||
|
expect(+d3.select(this).attr('x')).to.be.above(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y2.inner', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y2: { |
||||||
|
show: true, |
||||||
|
inner: false |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not have inner y axis', function () { |
||||||
|
var paddingRight = chart.internal.getCurrentPaddingRight(), |
||||||
|
tickTexts = chart.internal.main.selectAll('.c3-axis-2y g.tick text'); |
||||||
|
expect(paddingRight).to.be.above(19); |
||||||
|
tickTexts.each(function () { |
||||||
|
expect(+d3.select(this).attr('x')).to.be.above(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have inner y axis', function () { |
||||||
|
args.axis.y2.inner = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have inner y axis', function () { |
||||||
|
var paddingRight = chart.internal.getCurrentPaddingRight(), |
||||||
|
tickTexts = chart.internal.main.selectAll('.c3-axis-2y g.tick text'); |
||||||
|
expect(paddingRight).to.equal(2); |
||||||
|
tickTexts.each(function () { |
||||||
|
expect(+d3.select(this).attr('x')).to.be.below(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,47 @@ |
|||||||
|
function initDom() { |
||||||
|
|
||||||
|
|
||||||
|
var div = document.createElement('div'); |
||||||
|
div.id = 'chart'; |
||||||
|
div.style.width = '640px'; |
||||||
|
div.style.height = '480px'; |
||||||
|
document.body.appendChild(div); |
||||||
|
document.body.style.margin = '0px'; |
||||||
|
} |
||||||
|
typeof initDom !== 'undefined'; |
||||||
|
|
||||||
|
function setMouseEvent(chart, name, x, y, element) { |
||||||
|
|
||||||
|
|
||||||
|
var paddingLeft = chart.internal.main.node().transform.baseVal.getItem(0).matrix.e, |
||||||
|
event = document.createEvent("MouseEvents"); |
||||||
|
event.initMouseEvent(name, true, true, window, |
||||||
|
0, 0, 0, x + paddingLeft, y + 5, |
||||||
|
false, false, false, false, 0, null); |
||||||
|
chart.internal.d3.event = event; |
||||||
|
if (element) { element.dispatchEvent(event); } |
||||||
|
} |
||||||
|
typeof setMouseEvent !== 'undefined'; |
||||||
|
|
||||||
|
function initChart(chart, args, done) { |
||||||
|
|
||||||
|
|
||||||
|
if (typeof chart === 'undefined') { |
||||||
|
window.initDom(); |
||||||
|
} |
||||||
|
if (args) { |
||||||
|
chart = window.c3.generate(args); |
||||||
|
window.d3 = chart.internal.d3; |
||||||
|
window.d3.select('.jasmine_html-reporter') |
||||||
|
.style('position', 'absolute') |
||||||
|
.style('width', '640px') |
||||||
|
.style('right', 0); |
||||||
|
} |
||||||
|
|
||||||
|
window.setTimeout(function () { |
||||||
|
done(); |
||||||
|
}, 10); |
||||||
|
|
||||||
|
return chart; |
||||||
|
} |
||||||
|
typeof initChart !== 'undefined'; |
@ -0,0 +1,12 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3', function () { |
||||||
|
|
||||||
|
|
||||||
|
var c3 = window.c3; |
||||||
|
|
||||||
|
it('exists', function () { |
||||||
|
expect(c3).not.to.be.null; |
||||||
|
expect(typeof c3).to.equal('object'); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,63 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart class', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2 prefix', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3 мужчины', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('internal.getTargetSelectorSuffix', function () { |
||||||
|
|
||||||
|
it('should not replace any characters', function () { |
||||||
|
var input = 'data1', |
||||||
|
expected = '-' + input, |
||||||
|
suffix = chart.internal.getTargetSelectorSuffix(input); |
||||||
|
expect(suffix).to.equal(expected); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should replace space to "-"', function () { |
||||||
|
var input = 'data1 suffix', |
||||||
|
expected = '-data1-suffix', |
||||||
|
suffix = chart.internal.getTargetSelectorSuffix(input); |
||||||
|
expect(suffix).to.equal(expected); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should replace space to "-" with multibyte characters', function () { |
||||||
|
var input = 'data1 suffix 日本語', |
||||||
|
expected = '-data1-suffix-日本語', |
||||||
|
suffix = chart.internal.getTargetSelectorSuffix(input); |
||||||
|
expect(suffix).to.equal(expected); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should replace special charactors to "-"', function () { |
||||||
|
var input = 'data1 !@#$%^&*()_=+,.<>"\':;[]/|?~`{}\\', |
||||||
|
expected = '-data1--------------------------------', |
||||||
|
suffix = chart.internal.getTargetSelectorSuffix(input); |
||||||
|
expect(suffix).to.equal(expected); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('multibyte characters on chart', function () { |
||||||
|
|
||||||
|
it('should replace space to "-" with multibyte characters', function () { |
||||||
|
var selector = '.c3-target-data3-мужчины'; |
||||||
|
expect(chart.internal.main.select(selector).size()).to.equal(1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,160 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
svg: { |
||||||
|
classname: 'customclass' |
||||||
|
}, |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('init', function () { |
||||||
|
|
||||||
|
it('should be created', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg).not.to.be.null; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should set 3rd party property to Function', function () { |
||||||
|
Function.prototype.$extIsFunction = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be created even if 3rd party property has been set', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg).not.to.be.null; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be created with a custom class', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg.attr('class')).not.to.be.null; |
||||||
|
expect(svg.attr('class')).to.equal('customclass'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('size', function () { |
||||||
|
|
||||||
|
it('should have same width', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(+svg.attr('width')).to.equal(640); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have same height', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(+svg.attr('height')).to.equal(480); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('bindto', function () { |
||||||
|
|
||||||
|
describe('selector', function () { |
||||||
|
it('update args', function () { |
||||||
|
d3.select('#chart').html(''); |
||||||
|
args.bindto = '#chart'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should be created', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg.size()).to.equal(1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('d3.selection object', function () { |
||||||
|
it('update args', function () { |
||||||
|
d3.select('#chart').html(''); |
||||||
|
args.bindto = d3.select('#chart'); |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should be created', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg.size()).to.equal(1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('null', function () { |
||||||
|
it('update args', function () { |
||||||
|
d3.select('#chart').html(''); |
||||||
|
args.bindto = null; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should not be created', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg.size()).to.equal(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('empty string', function () { |
||||||
|
it('update args', function () { |
||||||
|
d3.select('#chart').html(''); |
||||||
|
args.bindto = ''; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should not be created', function () { |
||||||
|
var svg = d3.select('#chart svg'); |
||||||
|
expect(svg.size()).to.equal(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('empty data', function () { |
||||||
|
|
||||||
|
it('should upaate args for empty data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1'], |
||||||
|
['data2'] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should generate a chart', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); |
||||||
|
expect(ticks.size()).to.equal(0); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should upaate args for empty data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x'], |
||||||
|
['data1'], |
||||||
|
['data2'] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'timeseries' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should generate a chart', function () { |
||||||
|
var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); |
||||||
|
expect(ticks.size()).to.equal(0); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,135 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart domain', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: {}, |
||||||
|
y2: {} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.min', function () { |
||||||
|
|
||||||
|
it('should change axis.y.min to -100', function () { |
||||||
|
args.axis.y.min = -100; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when smaller than max of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.equal(-150); |
||||||
|
expect(domain[1]).to.equal(450); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change axis.y.min to 500', function () { |
||||||
|
args.axis.y.min = 500; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when bigger than max of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.equal(499); |
||||||
|
expect(domain[1]).to.equal(511); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change axis.y.min to undefined', function () { |
||||||
|
args.axis.y.min = undefined; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.max', function () { |
||||||
|
|
||||||
|
it('should change axis.y.max to 1000', function () { |
||||||
|
args.axis.y.max = 1000; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when bigger than min of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.equal(-89); |
||||||
|
expect(domain[1]).to.equal(1099); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change axis.y.max to 0', function () { |
||||||
|
args.axis.y.max = 0; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when smaller than min of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.equal(-11); |
||||||
|
expect(domain[1]).to.equal(1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('axis.y.padding', function () { |
||||||
|
|
||||||
|
it('should change axis.y.max to 1000', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 10, 20, 10, 40, 15, 25], |
||||||
|
['data2', 50, 40, 30, 45, 25, 45] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
padding: 200, |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when bigger than min of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.be.closeTo(-9, -1); |
||||||
|
expect(domain[1]).to.be.closeTo(69, -1); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change axis.y.max to 1000 with top/bottom padding', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 10, 20, 10, 40, 15, 25], |
||||||
|
['data2', 50, 40, 30, 45, 25, 45] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
padding: { |
||||||
|
top: 200, |
||||||
|
bottom: 200 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set properly when bigger than min of data', function () { |
||||||
|
var domain = chart.internal.y.domain(); |
||||||
|
expect(domain[0]).to.be.closeTo(-9, -1); |
||||||
|
expect(domain[1]).to.be.closeTo(69, -1); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,367 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart grid', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('y grid show', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
y: { |
||||||
|
tick: { |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
y: { |
||||||
|
show: false |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not show y grids', function () { |
||||||
|
expect(chart.internal.main.select('.c3-ygrids').size()).to.equal(0); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to show y grids', function () { |
||||||
|
args.grid.y.show = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show y grids', function () { |
||||||
|
var ygrids = chart.internal.main.select('.c3-ygrids'); |
||||||
|
expect(ygrids.size()).to.equal(1); |
||||||
|
expect(ygrids.selectAll('.c3-ygrid').size()).to.equal(9); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to show only 3 y grids', function () { |
||||||
|
args.grid.y.ticks = 3; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show only 3 y grids', function () { |
||||||
|
var ygrids = chart.internal.main.select('.c3-ygrids'); |
||||||
|
expect(ygrids.size()).to.equal(1); |
||||||
|
expect(ygrids.selectAll('.c3-ygrid').size()).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to show y grids depending on y axis ticks', function () { |
||||||
|
args.axis.y.tick.count = 5; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show grids depending on y axis ticks', function () { |
||||||
|
var ygrids = chart.internal.main.select('.c3-ygrids'), |
||||||
|
expectedYs = []; |
||||||
|
ygrids.selectAll('.c3-ygrid').each(function (d, i) { |
||||||
|
expectedYs[i] = +d3.select(this).attr('y1'); |
||||||
|
}); |
||||||
|
expect(ygrids.size()).to.equal(1); |
||||||
|
expect(ygrids.selectAll('.c3-ygrid').size()).to.equal(5); |
||||||
|
chart.internal.main.select('.c3-axis-y').selectAll('.tick').each(function (d, i) { |
||||||
|
var t = d3.transform(d3.select(this).attr('transform')); |
||||||
|
expect(t.translate[1]).to.equal(expectedYs[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('y grid lines', function () { |
||||||
|
|
||||||
|
describe('position', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 10, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
y: { |
||||||
|
lines: [ |
||||||
|
{value: 30, text: 'Label 30', position: 'start'}, |
||||||
|
{value: 145, text: 'Label 145', position: 'middle'}, |
||||||
|
{value: 225, text: 'Label 225'} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show 3 grid lines', function () { |
||||||
|
expect(chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line').size()).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid lines properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line'), |
||||||
|
expectedY1s = [373, 268, 196]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var y1 = d3.select(this).select('line').attr('y1'); |
||||||
|
expect(y1).to.be.closeTo(expectedY1s[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid texts properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line'), |
||||||
|
expectedPositions = ['start', 'middle', 'end'], |
||||||
|
expectedDxs = [4, 0, -4]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('text'), |
||||||
|
textAnchor = text.attr('text-anchor'), |
||||||
|
dx = text.attr('dx'); |
||||||
|
expect(textAnchor).to.equal(expectedPositions[i]); |
||||||
|
expect(+dx).to.equal(expectedDxs[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 10, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
rotated: true |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
y: { |
||||||
|
lines: [ |
||||||
|
{value: 30, text: 'Label 30', position: 'start'}, |
||||||
|
{value: 145, text: 'Label 145', position: 'middle'}, |
||||||
|
{value: 225, text: 'Label 225'} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show 3 grid lines', function () { |
||||||
|
expect(chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line').size()).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid lines properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line'), |
||||||
|
expectedX1s = [75, 220, 321]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var x1 = d3.select(this).select('line').attr('x1'); |
||||||
|
expect(x1).to.be.closeTo(expectedX1s[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid texts properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line'), |
||||||
|
expectedPositions = ['start', 'middle', 'end'], |
||||||
|
expectedDxs = [4, 0, -4]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('text'), |
||||||
|
textAnchor = text.attr('text-anchor'), |
||||||
|
dx = text.attr('dx'); |
||||||
|
expect(textAnchor).to.equal(expectedPositions[i]); |
||||||
|
expect(+dx).to.equal(expectedDxs[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('x grid lines', function () { |
||||||
|
|
||||||
|
describe('position', function () { |
||||||
|
|
||||||
|
it('should have correct height', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400], |
||||||
|
] |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
x: { |
||||||
|
lines: [ |
||||||
|
{value: 1, text: 'Label 1', position: 'start'}, |
||||||
|
{value: 2, text: 'Label 2', position: 'middle'}, |
||||||
|
{value: 3, text: 'Label 3'}, |
||||||
|
] |
||||||
|
} |
||||||
|
}, |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show 3 grid lines', function () { |
||||||
|
expect(chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line').size()).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid lines properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedX1s = [202, 397, 593]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var x1 = d3.select(this).select('line').attr('x1'); |
||||||
|
expect(x1).to.be.closeTo(expectedX1s[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid texts properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedPositions = ['start', 'middle', 'end'], |
||||||
|
expectedDxs = [4, 0, -4]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('text'), |
||||||
|
textAnchor = text.attr('text-anchor'), |
||||||
|
dx = text.attr('dx'); |
||||||
|
expect(textAnchor).to.equal(expectedPositions[i]); |
||||||
|
expect(+dx).to.equal(expectedDxs[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400], |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
rotated: true |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
x: { |
||||||
|
lines: [ |
||||||
|
{value: 1, text: 'Label 1', position: 'start'}, |
||||||
|
{value: 2, text: 'Label 2', position: 'middle'}, |
||||||
|
{value: 3, text: 'Label 3'}, |
||||||
|
] |
||||||
|
} |
||||||
|
}, |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show 3 grid lines', function () { |
||||||
|
expect(chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line').size()).to.equal(3); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid lines properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedY1s = [144, 283, 421]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var y1 = d3.select(this).select('line').attr('y1'); |
||||||
|
expect(y1).to.be.closeTo(expectedY1s[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate grid texts properly', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedPositions = ['start', 'middle', 'end'], |
||||||
|
expectedDxs = [4, 0, -4]; |
||||||
|
lines.each(function (d, i) { |
||||||
|
var text = d3.select(this).select('text'), |
||||||
|
textAnchor = text.attr('text-anchor'), |
||||||
|
dx = text.attr('dx'); |
||||||
|
expect(textAnchor).to.equal(expectedPositions[i]); |
||||||
|
expect(+dx).to.equal(expectedDxs[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('with padding.top', function () { |
||||||
|
|
||||||
|
it('should have correct height', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400], |
||||||
|
] |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
x: { |
||||||
|
lines: [ |
||||||
|
{value: 3, text: 'Label 3'} |
||||||
|
] |
||||||
|
} |
||||||
|
}, |
||||||
|
padding: { |
||||||
|
top: 50 |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show x grid lines', function () { |
||||||
|
var lines = chart.internal.main.select('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedX1 = 593, |
||||||
|
expectedText = ['Label 3']; |
||||||
|
lines.each(function (id, i) { |
||||||
|
var line = d3.select(this), |
||||||
|
l = line.select('line'), |
||||||
|
t = line.select('text'); |
||||||
|
expect(+l.attr('x1')).to.be.closeTo(expectedX1, -2); |
||||||
|
expect(t.text()).to.equal(expectedText[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('on category axis', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 'a', 'b', 'c', 'd'], |
||||||
|
['data1', 30, 200, 100, 400], |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'category' |
||||||
|
} |
||||||
|
}, |
||||||
|
grid: { |
||||||
|
x: { |
||||||
|
lines: [ |
||||||
|
{value: 3, text: 'Label 3'}, |
||||||
|
{value: 'a', text: 'Label a'} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show x grid lines', function () { |
||||||
|
var lines = chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line'), |
||||||
|
expectedX1 = [515, 74], |
||||||
|
expectedText = ['Label 3', 'Label a']; |
||||||
|
lines.each(function (id, i) { |
||||||
|
var line = d3.select(this), |
||||||
|
l = line.select('line'), |
||||||
|
t = line.select('text'); |
||||||
|
expect(+l.attr('x1')).to.be.closeTo(expectedX1[i], -2); |
||||||
|
expect(t.text()).to.equal(expectedText[i]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,118 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart interaction', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('generate event rects', function () { |
||||||
|
|
||||||
|
describe('custom x', function () { |
||||||
|
|
||||||
|
it('should generate bar chart', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 0, 1000, 3000, 10000], |
||||||
|
['data', 10, 10, 10, 10] |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 4 event rects properly', function () { |
||||||
|
var lefts = [78, 138, 205.5, 407.5], |
||||||
|
widths = [60, 67.5, 202, 194]; |
||||||
|
d3.selectAll('.c3-event-rect').each(function (d, i) { |
||||||
|
var box = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(box.left).to.be.closeTo(lefts[i], -2); |
||||||
|
expect(box.width).to.be.closeTo(widths[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should generate bar chart with only one data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', 0], |
||||||
|
['data', 10] |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 1 event rects properly', function () { |
||||||
|
var eventRects = d3.selectAll('.c3-event-rect'); |
||||||
|
expect(eventRects.size()).to.equal(1); |
||||||
|
eventRects.each(function () { |
||||||
|
var box = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(box.left).to.be.closeTo(40.5, -2); |
||||||
|
expect(box.width).to.be.closeTo(598, -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('timeseries', function () { |
||||||
|
|
||||||
|
it('should generate line chart with timeseries', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', '20140101', '20140201', '20140210', '20140301'], |
||||||
|
['data', 10, 10, 10, 10] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 4 event rects properly', function () { |
||||||
|
var lefts = [43.5, 193, 353, 500], |
||||||
|
widths = [149.5, 160, 147, 136]; |
||||||
|
d3.selectAll('.c3-event-rect').each(function (d, i) { |
||||||
|
var box = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(box.left).to.be.closeTo(lefts[i], -2); |
||||||
|
expect(box.width).to.be.closeTo(widths[i], -2); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
it('should generate line chart with only 1 data timeseries', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'x', |
||||||
|
columns: [ |
||||||
|
['x', '20140101'], |
||||||
|
['data', 10] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have 1 event rects properly', function () { |
||||||
|
var eventRects = d3.selectAll('.c3-event-rect'); |
||||||
|
expect(eventRects.size()).to.equal(1); |
||||||
|
eventRects.each(function () { |
||||||
|
var box = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(box.left).to.be.closeTo(40.5, -2); |
||||||
|
expect(box.width).to.be.closeTo(598, -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,280 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart legend', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('legend when multiple charts rendered', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30], |
||||||
|
['data2', 50], |
||||||
|
['data3', 100] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args with long data names', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['long data name 1', 30], |
||||||
|
['long data name 2', 50], |
||||||
|
['long data name 3', 50], |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have properly computed legend width', function () { |
||||||
|
var expectedLeft = [148, 226, 384], |
||||||
|
expectedWidth = [118, 118, 108]; |
||||||
|
d3.selectAll('.c3-legend-item').each(function (d, i) { |
||||||
|
var rect = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(rect.left).to.be.closeTo(expectedLeft[i], -2); |
||||||
|
expect(rect.width).to.be.closeTo(expectedWidth[i], -2); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('legend position', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be located on the center of chart', function () { |
||||||
|
var box = chart.internal.legend.node().getBoundingClientRect(); |
||||||
|
expect(box.left + box.right).to.equal(640); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('legend as inset', function () { |
||||||
|
|
||||||
|
it('should change the legend to "inset" successfully', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
position: 'inset', |
||||||
|
inset: { |
||||||
|
step: null |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be positioned properly', function () { |
||||||
|
var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); |
||||||
|
expect(box.top).to.equal(5.5); |
||||||
|
expect(box.left).to.be.above(30); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have automatically calculated height', function () { |
||||||
|
var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); |
||||||
|
expect(box.height).to.equal(48); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change the legend step to 1 successfully', function () { |
||||||
|
args.legend.inset.step = 1; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have automatically calculated height', function () { |
||||||
|
var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); |
||||||
|
expect(box.height).to.equal(28); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change the legend step to 2 successfully', function () { |
||||||
|
args.legend.inset.step = 2; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should have automatically calculated height', function () { |
||||||
|
var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); |
||||||
|
expect(box.height).to.equal(48); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args to have only one series', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
position: 'inset' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should locate legend properly', function () { |
||||||
|
var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); |
||||||
|
expect(box.height).to.equal(28); |
||||||
|
expect(box.width).to.be.above(64); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('legend.hide', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 130, 100, 200, 100, 250, 150] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
hide: true |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not show legends', function () { |
||||||
|
d3.selectAll('.c3-legend-item').each(function () { |
||||||
|
expect(d3.select(this).style('visibility')).to.equal('hidden'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 130, 100, 200, 100, 250, 150] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
hide: 'data2' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not show legends', function () { |
||||||
|
expect(d3.select('.c3-legend-item-data1').style('visibility')).to.equal('visible'); |
||||||
|
expect(d3.select('.c3-legend-item-data2').style('visibility')).to.equal('hidden'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('legend.show', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 130, 100, 200, 100, 250, 150] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
show: false |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not initially have rendered any legend items', function () { |
||||||
|
expect(d3.selectAll('.c3-legend-item').empty()).to.equal(true); |
||||||
|
}); |
||||||
|
|
||||||
|
it('allows us to show the legend on showLegend call', function () { |
||||||
|
chart.legend.show(); |
||||||
|
d3.selectAll('.c3-legend-item').each(function () { |
||||||
|
expect(d3.select(this).style('visibility')).to.equal('visible'); |
||||||
|
// This selects all the children, but we expect it to be empty
|
||||||
|
expect(d3.select(this).selectAll("*").length).not.toEqual(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('custom legend size', function() { |
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 130, 100, 200, 100, 250, 150] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
item: { |
||||||
|
tile: { |
||||||
|
width: 15, |
||||||
|
height: 2 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('renders the legend item with the correct width and height', function () { |
||||||
|
d3.selectAll('.c3-legend-item-tile').each(function () { |
||||||
|
expect(d3.select(this).style('stroke-width')).to.equal(args.legend.item.tile.height + 'px'); |
||||||
|
var tileWidth = d3.select(this).attr('x2') - d3.select(this).attr('x1'); |
||||||
|
expect(tileWidth).to.equal(args.legend.item.tile.width); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('custom legend padding', function() { |
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['padded1', 30, 200, 100, 400, 150, 250], |
||||||
|
['padded2', 130, 100, 200, 100, 250, 150] |
||||||
|
] |
||||||
|
}, |
||||||
|
legend: { |
||||||
|
padding: 10 |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('renders the correct amount of padding on the legend element', function () { |
||||||
|
d3.selectAll('.c3-legend-item-padded1 .c3-legend-item-tile, .c3-legend-item-padded2 .c3-legend-item-tile').each(function (el, index) { |
||||||
|
var itemWidth = d3.select(this).node().parentNode.getBBox().width, |
||||||
|
textBoxWidth = d3.select(d3.select(this).node().parentNode).select('text').node().getBBox().width, |
||||||
|
tileWidth = 15, // default value is 10, plus 5 more for padding
|
||||||
|
expectedWidth = textBoxWidth + tileWidth + (index ? 0 : 10) + args.legend.padding; |
||||||
|
|
||||||
|
expect(itemWidth).to.equal(expectedWidth); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,183 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
var setMouseEvent = window.setMouseEvent; |
||||||
|
|
||||||
|
describe('c3 chart shape bar', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('with groups', function () { |
||||||
|
|
||||||
|
describe('with indexed data', function () { |
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, -100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
], |
||||||
|
groups: [ |
||||||
|
['data1', 'data2'], |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
}, |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should be stacked', function () { |
||||||
|
var expectedBottom = [275, 293, 365, 281, 395, 290]; |
||||||
|
chart.internal.main.selectAll('.c3-bars-data1 .c3-bar').each(function (d, i) { |
||||||
|
var rect = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(rect.bottom).to.be.closeTo(expectedBottom[i], -1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('with timeseries data', function () { |
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'date', |
||||||
|
columns: [ |
||||||
|
['date', '2012-12-24', '2012-12-25', '2012-12-26', '2012-12-27', '2012-12-28', '2012-12-29'], |
||||||
|
['data1', 30, 200, -100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
], |
||||||
|
groups: [ |
||||||
|
['data1', 'data2'], |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'timeseries', |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should be stacked', function () { |
||||||
|
var expectedBottom = [275, 293, 365, 281, 395, 290]; |
||||||
|
chart.internal.main.selectAll('.c3-bars-data1 .c3-bar').each(function (d, i) { |
||||||
|
var rect = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(rect.bottom).to.be.closeTo(expectedBottom[i], -1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('with category data', function () { |
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
x: 'date', |
||||||
|
columns: [ |
||||||
|
['date', '2012-12-24', '2012-12-25', '2012-12-26', '2012-12-27', '2012-12-28', '2012-12-29'], |
||||||
|
['data1', 30, 200, -100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
], |
||||||
|
groups: [ |
||||||
|
['data1', 'data2'], |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
type: 'category', |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
it('should be stacked', function () { |
||||||
|
var expectedBottom = [275, 293, 365, 281, 395, 290]; |
||||||
|
chart.internal.main.selectAll('.c3-bars-data1 .c3-bar').each(function (d, i) { |
||||||
|
var rect = d3.select(this).node().getBoundingClientRect(); |
||||||
|
expect(rect.bottom).to.be.closeTo(expectedBottom[i], -1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('internal.isWithinBar', function () { |
||||||
|
|
||||||
|
describe('with normal axis', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', -150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'bar' |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
rotated: false |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not be within bar', function () { |
||||||
|
var bar = d3.select('.c3-target-data1 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 0, 0); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be within bar', function () { |
||||||
|
var bar = d3.select('.c3-target-data1 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 31, 280); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not be within bar of negative value', function () { |
||||||
|
var bar = d3.select('.c3-target-data3 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 68, 280); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be within bar of negative value', function () { |
||||||
|
var bar = d3.select('.c3-target-data3 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 68, 350); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('with rotated axis', function () { |
||||||
|
|
||||||
|
it('should change the chart as axis rotated', function () { |
||||||
|
args.axis.rotated = true; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not be within bar', function () { |
||||||
|
var bar = d3.select('.c3-target-data1 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 0, 0); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be within bar', function () { |
||||||
|
var bar = d3.select('.c3-target-data1 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 190, 20); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be within bar of negative value', function () { |
||||||
|
var bar = d3.select('.c3-target-data3 .c3-bar-0').node(); |
||||||
|
setMouseEvent(chart, 'click', 68, 50); |
||||||
|
expect(chart.internal.isWithinBar(bar)).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,172 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart shape line', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
var parseSvgPath = window.parseSvgPath; |
||||||
|
|
||||||
|
describe('shape-rendering for line chart', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', -150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'line' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
it("Should render the lines correctly", function(done) { |
||||||
|
setTimeout(function () { |
||||||
|
var target = chart.internal.main.select('.c3-chart-line.c3-target-data1'); |
||||||
|
var commands = parseSvgPath( target.select('.c3-line-data1').attr('d')); |
||||||
|
expect(commands.length).to.equal(6); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
it("should not have shape-rendering when it's line chart", function () { |
||||||
|
d3.selectAll('.c3-line').each(function () { |
||||||
|
var style = d3.select(this).style('shape-rendering'); |
||||||
|
expect(style).to.equal('auto'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change to step chart', function () { |
||||||
|
args.data.type = 'step'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it("should have shape-rendering = crispedges when it's step chart", function () { |
||||||
|
d3.selectAll('.c3-line').each(function () { |
||||||
|
var style = d3.select(this).style('shape-rendering').toLowerCase(); |
||||||
|
expect(style).to.equal('crispedges'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change to spline chart', function () { |
||||||
|
args.data.type = 'spline'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should use cardinal interpolation by default', function () { |
||||||
|
expect(chart.internal.config.spline_interpolation_type).to.equal('cardinal'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('point.show option', function () { |
||||||
|
|
||||||
|
it('should change args to include null data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, null, 100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', -150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'line' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not show the circle for null', function (done) { |
||||||
|
setTimeout(function () { |
||||||
|
var target = chart.internal.main.select('.c3-chart-line.c3-target-data1'); |
||||||
|
expect(+target.select('.c3-circle-0').style('opacity')).to.equal(1); |
||||||
|
expect(+target.select('.c3-circle-1').style('opacity')).to.equal(0); |
||||||
|
expect(+target.select('.c3-circle-2').style('opacity')).to.equal(1); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not draw a line segment for null data', function(done) { |
||||||
|
setTimeout(function () { |
||||||
|
var target = chart.internal.main.select('.c3-chart-line.c3-target-data1'); |
||||||
|
var commands = parseSvgPath( target.select('.c3-line-data1').attr('d')); |
||||||
|
var segments = 0; |
||||||
|
for(var i = 0; i < commands.length; i++) { |
||||||
|
(commands[i].command === 'L') ? segments++ : null; |
||||||
|
} |
||||||
|
expect(segments).to.equal(3); |
||||||
|
done(); |
||||||
|
}, 500); |
||||||
|
}); |
||||||
|
|
||||||
|
// it('should change args to include null data on scatter plot', function () {
|
||||||
|
// args = {
|
||||||
|
// data: {
|
||||||
|
// columns: [
|
||||||
|
// ['data1', 30, null, 100, 400, -150, 250],
|
||||||
|
// ['data2', 50, 20, 10, 40, 15, 25],
|
||||||
|
// ['data3', -150, 120, 110, 140, 115, 125]
|
||||||
|
// ],
|
||||||
|
// type: 'scatter'
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// expect(true).to.be.ok;
|
||||||
|
// });
|
||||||
|
|
||||||
|
// it('should not show the circle for null', function (done) {
|
||||||
|
// setTimeout(function () {
|
||||||
|
// var target = chart.internal.main.select('.c3-chart-line.c3-target-data1');
|
||||||
|
// expect(+target.select('.c3-circle-0').style('opacity')).to.equal(0.5);
|
||||||
|
// expect(+target.select('.c3-circle-1').style('opacity')).to.equal(0);
|
||||||
|
// expect(+target.select('.c3-circle-2').style('opacity')).to.equal(0.5);
|
||||||
|
// done();
|
||||||
|
// }, 500);
|
||||||
|
// });
|
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('spline.interpolation option', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, -150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', -150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'spline' |
||||||
|
}, |
||||||
|
spline: { |
||||||
|
interpolation: { |
||||||
|
type: 'monotone' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should update interpolation function', function() { |
||||||
|
expect(chart.internal.getInterpolate(chart.data()[0])).to.equal('monotone'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should not use a non-valid interpolation', function () { |
||||||
|
args.spline.interpolation.type = 'foo'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should use cardinal interpolation when given option is not valid', function() { |
||||||
|
expect(chart.internal.getInterpolate(chart.data()[0])).to.equal('cardinal'); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,50 @@ |
|||||||
|
/** |
||||||
|
* Parse the d property of an SVG path into an array of drawing commands. |
||||||
|
* @param {String} d SvgPath d attribute.] |
||||||
|
* @return {Array} an array of drawing commands. |
||||||
|
*/ |
||||||
|
|
||||||
|
function parseSvgPath(d) { //jshint ignore:line
|
||||||
|
|
||||||
|
|
||||||
|
var commands = []; |
||||||
|
var commandTokens = ['M','L','I','H','V','C','S','Q','T','A']; |
||||||
|
var command; |
||||||
|
var in_x = false; |
||||||
|
var in_y = false; |
||||||
|
var x = ''; |
||||||
|
var y = ''; |
||||||
|
for(var i = 0; i <= d.length; i++) { |
||||||
|
if (commandTokens.indexOf(d[i]) !== -1) { |
||||||
|
if (in_x || in_y) { |
||||||
|
commands.push({command: command, x: x, y: y}); |
||||||
|
x = ''; |
||||||
|
y = ''; |
||||||
|
} |
||||||
|
command = d[i]; |
||||||
|
in_x = true; |
||||||
|
in_y = false; |
||||||
|
} |
||||||
|
else { |
||||||
|
if (d[i] === ',') { |
||||||
|
if (in_y) { |
||||||
|
commands.push({command: command, x: x, y: y}); |
||||||
|
x = ''; |
||||||
|
y = ''; |
||||||
|
} |
||||||
|
in_x = !in_x; |
||||||
|
in_y = !in_y; |
||||||
|
} |
||||||
|
else if (in_x) { |
||||||
|
x += d[i]; |
||||||
|
} |
||||||
|
else if (in_y) { |
||||||
|
y += d[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (d[i] !== ',' && in_y) { |
||||||
|
commands.push({command: command, x: x, y: y}); |
||||||
|
} |
||||||
|
return commands; |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart title', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, config; |
||||||
|
|
||||||
|
describe('when given a title config option', function () { |
||||||
|
describe('with no padding and no position', function () { |
||||||
|
beforeEach(function(done) { |
||||||
|
config = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
title: { |
||||||
|
text: 'new title' |
||||||
|
} |
||||||
|
}; |
||||||
|
chart = window.initChart(chart, config, done); |
||||||
|
}); |
||||||
|
|
||||||
|
it('renders the title at the default config position', function () { |
||||||
|
var titleEl = d3.select(".c3-title"); |
||||||
|
expect(+titleEl.attr("x")).to.be.closeTo(294, -2); |
||||||
|
expect(+titleEl.attr("y")).toEqual(titleEl.node().getBBox().height); |
||||||
|
}); |
||||||
|
|
||||||
|
it('renders the title text', function () { |
||||||
|
var titleEl = d3.select(".c3-title"); |
||||||
|
expect(titleEl.node().textContent).toEqual('new title'); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('with padding', function () { |
||||||
|
var config, getConfig = function (titlePosition) { |
||||||
|
return { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250] |
||||||
|
] |
||||||
|
}, |
||||||
|
title: { |
||||||
|
text: 'positioned title', |
||||||
|
padding: { |
||||||
|
top: 20, |
||||||
|
right: 30, |
||||||
|
bottom: 40, |
||||||
|
left: 50 |
||||||
|
}, |
||||||
|
position: titlePosition |
||||||
|
} |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
describe('and position center', function () { |
||||||
|
beforeEach(function(done) { |
||||||
|
config = getConfig('top-center'); |
||||||
|
chart = window.initChart(chart, config, done); |
||||||
|
}); |
||||||
|
it('renders the title at the default config position', function () { |
||||||
|
var titleEl = d3.select(".c3-title"); |
||||||
|
expect(+titleEl.attr("x")).to.be.closeTo(275, -2); |
||||||
|
expect(+titleEl.attr("y")).to.be.closeTo(34, -1); |
||||||
|
}); |
||||||
|
it('adds the correct amount of padding to fit the title', function() { |
||||||
|
expect(chart.internal.getCurrentPaddingTop()).toEqual( |
||||||
|
config.title.padding.top + d3.select('.c3-title').node().getBBox().height + config.title.padding.bottom |
||||||
|
); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('and position left', function () { |
||||||
|
beforeEach(function(done) { |
||||||
|
config = getConfig('top-left'); |
||||||
|
chart = window.initChart(chart, config, done); |
||||||
|
}); |
||||||
|
it('renders the title at the default config position', function () { |
||||||
|
var titleEl = d3.select(".c3-title"); |
||||||
|
expect(+titleEl.attr("x")).to.be.closeTo(50, -1); |
||||||
|
expect(+titleEl.attr("y")).to.be.closeTo(34, -1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('and position right', function () { |
||||||
|
beforeEach(function(done) { |
||||||
|
config = getConfig('top-right'); |
||||||
|
chart = window.initChart(chart, config, done); |
||||||
|
}); |
||||||
|
it('renders the title at the default config position', function () { |
||||||
|
var titleEl = d3.select(".c3-title"); |
||||||
|
expect(+titleEl.attr("x")).to.be.closeTo(520, -2); |
||||||
|
expect(+titleEl.attr("y")).to.be.closeTo(34, -1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,124 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart tooltip', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
var tooltipConfiguration; |
||||||
|
|
||||||
|
var args = function () { |
||||||
|
return { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
}, |
||||||
|
tooltip: tooltipConfiguration |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args(), done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('tooltip position', function () { |
||||||
|
beforeAll(function () { |
||||||
|
tooltipConfiguration = {}; |
||||||
|
}); |
||||||
|
|
||||||
|
describe('without left margin', function () { |
||||||
|
|
||||||
|
it('should show tooltip on proper position', function () { |
||||||
|
var eventRect = d3.select('.c3-event-rect-2').node(); |
||||||
|
window.setMouseEvent(chart, 'mousemove', 100, 100, eventRect); |
||||||
|
|
||||||
|
var tooltipContainer = d3.select('.c3-tooltip-container'), |
||||||
|
top = Math.floor(+tooltipContainer.style('top').replace(/px/, '')), |
||||||
|
left = Math.floor(+tooltipContainer.style('left').replace(/px/, '')), |
||||||
|
topExpected = 115, |
||||||
|
leftExpected = 280; |
||||||
|
expect(top).to.equal(topExpected); |
||||||
|
expect(left).to.be.above(leftExpected); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('with left margin', function () { |
||||||
|
|
||||||
|
it('should set left margin', function () { |
||||||
|
d3.select('#chart').style('margin-left', '300px'); |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should show tooltip on proper position', function () { |
||||||
|
var eventRect = d3.select('.c3-event-rect-2').node(); |
||||||
|
window.setMouseEvent(chart, 'mousemove', 100, 100, eventRect); |
||||||
|
|
||||||
|
var tooltipContainer = d3.select('.c3-tooltip-container'), |
||||||
|
top = Math.floor(+tooltipContainer.style('top').replace(/px/, '')), |
||||||
|
left = Math.floor(+tooltipContainer.style('left').replace(/px/, '')), |
||||||
|
topExpected = 115, |
||||||
|
leftExpected = 280; |
||||||
|
expect(top).to.equal(topExpected); |
||||||
|
expect(left).to.be.above(leftExpected); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('tooltip positionFunction', function () { |
||||||
|
var topExpected = 37, leftExpected = 79; |
||||||
|
|
||||||
|
beforeAll(function () { |
||||||
|
tooltipConfiguration = { |
||||||
|
position: function (data, width, height, element) { |
||||||
|
expect(data.length).to.equal(args().data.columns.length); |
||||||
|
expect(data[0]).toEqual(jasmine.objectContaining({ |
||||||
|
index: 2, |
||||||
|
value: 100, |
||||||
|
id: 'data1' |
||||||
|
})); |
||||||
|
expect(width).to.be.above(0); |
||||||
|
expect(height).to.be.above(0); |
||||||
|
expect(element).to.equal(d3.select('.c3-event-rect-2').node()); |
||||||
|
return {top: topExpected, left: leftExpected}; |
||||||
|
} |
||||||
|
}; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should be set to the coordinate where the function returned', function () { |
||||||
|
var eventRect = d3.select('.c3-event-rect-2').node(); |
||||||
|
window.setMouseEvent(chart, 'mousemove', 100, 100, eventRect); |
||||||
|
|
||||||
|
var tooltipContainer = d3.select('.c3-tooltip-container'), |
||||||
|
top = Math.floor(+tooltipContainer.style('top').replace(/px/, '')), |
||||||
|
left = Math.floor(+tooltipContainer.style('left').replace(/px/, '')); |
||||||
|
expect(top).to.equal(topExpected); |
||||||
|
expect(left).to.equal(leftExpected); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('tooltip getTooltipContent', function () { |
||||||
|
beforeAll(function () { |
||||||
|
tooltipConfiguration = { |
||||||
|
data_order: 'desc' |
||||||
|
}; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should sort values desc', function () { |
||||||
|
var eventRect = d3.select('.c3-event-rect-2').node(); |
||||||
|
window.setMouseEvent(chart, 'mousemove', 100, 100, eventRect); |
||||||
|
|
||||||
|
var tooltipTable = d3.select('.c3-tooltip')[0]; |
||||||
|
var expected = ["", "c3-tooltip-name--data3", |
||||||
|
"c3-tooltip-name--data1", "c3-tooltip-name--data2"]; |
||||||
|
var i; |
||||||
|
for (i = 0; i < tooltipTable[0].rows.length; i++) { |
||||||
|
expect(tooltipTable[0].rows[i].className).to.equal(expected[i]); |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,139 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart types', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart, args; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('internal.hasArcType', function () { |
||||||
|
|
||||||
|
describe('with data', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'pie' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return true', function () { |
||||||
|
expect(chart.internal.hasArcType()).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change chart type to "bar"', function () { |
||||||
|
args.data.type = 'bar'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false', function () { |
||||||
|
expect(chart.internal.hasArcType()).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('with empty data', function () { |
||||||
|
|
||||||
|
it('should update args to have empty data', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [], |
||||||
|
type: 'pie' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return true', function () { |
||||||
|
expect(chart.internal.hasArcType()).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change chart type to "bar"', function () { |
||||||
|
args.data.type = 'bar'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false', function () { |
||||||
|
expect(chart.internal.hasArcType()).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('internal.hasType', function () { |
||||||
|
|
||||||
|
it('should update args', function () { |
||||||
|
args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 25], |
||||||
|
['data3', 150, 120, 110, 140, 115, 125] |
||||||
|
], |
||||||
|
type: 'pie' |
||||||
|
} |
||||||
|
}; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return true for "pie" type', function () { |
||||||
|
expect(chart.internal.hasType('pie')).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "line" type', function () { |
||||||
|
expect(chart.internal.hasType('line')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "bar" type', function () { |
||||||
|
expect(chart.internal.hasType('bar')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should unload successfully', function () { |
||||||
|
chart.unload([]); |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return true for "pie" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('pie')).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "line" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('line')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "bar" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('bar')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should change chart type to "bar" successfully', function () { |
||||||
|
args.data.type = 'bar'; |
||||||
|
expect(true).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "pie" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('pie')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return false for "line" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('line')).to.not.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
it('should return true for "bar" type even if no data', function () { |
||||||
|
expect(chart.internal.hasType('bar')).to.be.ok; |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
@ -0,0 +1,69 @@ |
|||||||
|
var expect = require('chai').expect; |
||||||
|
|
||||||
|
describe('c3 chart zoom', function () { |
||||||
|
|
||||||
|
|
||||||
|
var chart; |
||||||
|
|
||||||
|
var args = { |
||||||
|
data: { |
||||||
|
columns: [ |
||||||
|
['data1', 30, 200, 100, 400, 3150, 250], |
||||||
|
['data2', 50, 20, 10, 40, 15, 6025] |
||||||
|
] |
||||||
|
}, |
||||||
|
axis: { |
||||||
|
x: { |
||||||
|
extent: [1, 2] |
||||||
|
} |
||||||
|
}, |
||||||
|
zoom: { |
||||||
|
enable: true |
||||||
|
}, |
||||||
|
subchart: { |
||||||
|
show: true |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
beforeEach(function (done) { |
||||||
|
chart = window.initChart(chart, args, done); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('default extent', function () { |
||||||
|
|
||||||
|
describe('main chart domain', function () { |
||||||
|
|
||||||
|
it('should have original y domain', function () { |
||||||
|
var yDomain = chart.internal.y.domain(), |
||||||
|
expectedYDomain = [-591.5, 6626.5]; |
||||||
|
expect(yDomain[0]).to.equal(expectedYDomain[0]); |
||||||
|
expect(yDomain[1]).to.equal(expectedYDomain[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('main chart domain', function () { |
||||||
|
|
||||||
|
it('should have original y domain in subchart', function () { |
||||||
|
var yDomain = chart.internal.y.domain(), |
||||||
|
subYDomain = chart.internal.subY.domain(); |
||||||
|
expect(subYDomain[0]).to.equal(yDomain[0]); |
||||||
|
expect(subYDomain[1]).to.equal(yDomain[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
describe('main chart domain', function () { |
||||||
|
|
||||||
|
it('should have specified brush extent', function () { |
||||||
|
var brushExtent = chart.internal.brush.extent(), |
||||||
|
expectedBrushExtent = [1, 2]; |
||||||
|
expect(brushExtent[0]).to.equal(expectedBrushExtent[0]); |
||||||
|
expect(brushExtent[1]).to.equal(expectedBrushExtent[1]); |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}); |
Loading…
Reference in new issue