diff options
author | Kristian Lyngstol <kly@kly@.no> | 2016-03-21 20:11:55 +0100 |
---|---|---|
committer | Kristian Lyngstol <kly@kly@.no> | 2016-03-21 20:11:55 +0100 |
commit | 727e4ab31aa6d1a754711d4cd29dbcefae2e952a (patch) | |
tree | d1b4f17addedf5fe9695d6018efd880d13f0c5c1 /web/nms-public.gathering.org/old/speedometer/c3-master/spec | |
parent | 7a6cf59e67d569a412f7670d9f04b2378c546dbc (diff) |
NMS: NMS Public
Diffstat (limited to 'web/nms-public.gathering.org/old/speedometer/c3-master/spec')
22 files changed, 4674 insertions, 0 deletions
diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.axis-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.axis-spec.js new file mode 100644 index 0000000..5764f73 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.axis-spec.js @@ -0,0 +1,54 @@ +describe('c3 api axis', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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()).toBe('New Y Axis Label'); + expect(label.attr('dx')).toBe('-0.5em'); + expect(label.attr('dy')).toBe('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()).toBe('New Y2 Axis Label'); + expect(label.attr('dx')).toBe('-0.5em'); + expect(label.attr('dy')).toBe('-0.5em'); + }); + + }); +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.data-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.data-spec.js new file mode 100644 index 0000000..60881cb --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.data-spec.js @@ -0,0 +1,164 @@ +describe('c3 api data', function () { + 'use strict'; + + 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).toBe(expected[i]); + }); + }); + + it('should return specifid data if string argument given', function () { + var results = chart.data('data1'); + expect(results.length).toBe(1); + expect(results[0].id).toBe('data1'); + }); + + it('should return specifid data if array argument given', function () { + var results = chart.data(['data1', 'data2']); + expect(results.length).toBe(2); + expect(results[0].id).toBe('data1'); + expect(results[1].id).toBe('data2'); + }); + + }); + + describe('data.shown()', function () { + + it('should return only shown targets', function () { + var results; + chart.hide('data1'); + results = chart.data.shown(); + expect(results.length).toBe(1); + expect(results[0].id).toBe('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).toBe(6); + values.forEach(function (v, i) { + expect(v).toBe(expectedValues[i]); + }); + }); + + it('should return null when no args', function () { + var values = chart.data.values(); + expect(values).toBeNull(); + }); + + }); + + describe('data.names()', function () { + + it('should return data.names specified as argument', function () { + var results = chart.data.names(); + expect(results.data1).toBe('Data Name 1'); + expect(results.data2).toBe('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).toBe('New Data Name 1'); + expect(results.data2).toBe('New Data Name 2'); + }); + + it('should set data.names specified as api', function () { + expect(d3.select('.c3-legend-item-data1 text').text()).toBe("New Data Name 1"); + expect(d3.select('.c3-legend-item-data2 text').text()).toBe("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).toBe('#FF0000'); + expect(results.data2).toBe('#00FF00'); + }); + + it('should return data.colors specified as api', function () { + var results = chart.data.colors({ + data1: '#00FF00', + data2: '#FF0000' + }); + expect(results.data1).toBe('#00FF00'); + expect(results.data2).toBe('#FF0000'); + }); + + it('should set data.colors specified as api', function () { + expect(d3.select('.c3-line-data1').style('stroke')).toBe("#00ff00"); + expect(d3.select('.c3-line-data2').style('stroke')).toBe("#ff0000"); + expect(d3.select('.c3-legend-item-data1 .c3-legend-item-tile').style('fill')).toBe("#00ff00"); + expect(d3.select('.c3-legend-item-data2 .c3-legend-item-tile').style('fill')).toBe("#ff0000"); + }); + + }); + + describe('data.axes()', function () { + + it('should return data.axes specified as argument', function () { + var results = chart.data.axes(); + expect(results.data1).toBe('y'); + expect(results.data2).toBe('y2'); + expect(d3.select('.c3-axis-y g.tick text').text()).toBe('0'); + expect(d3.select('.c3-axis-y2 g.tick text').text()).toBe('1000'); + }); + + it('should return data.axes specified as api', function () { + var results = chart.data.axes({ + data1: 'y2', + data2: 'y' + }); + expect(results.data1).toBe('y2'); + expect(results.data2).toBe('y'); + expect(d3.select('.c3-axis-y g.tick text').text()).toBe('1000'); + expect(d3.select('.c3-axis-y2 g.tick text').text()).toBe('0'); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.focus-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.focus-spec.js new file mode 100644 index 0000000..df64e80 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.focus-spec.js @@ -0,0 +1,441 @@ +describe('c3 api focus', function () { + 'use strict'; + + 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')).toBeTruthy(); + }); + legendItems.each(function () { + var item = d3.select(this); + expect(item.classed('c3-legend-item-focused')).toBeTruthy(); + }); + 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')).toBeFalsy(); + expect(targets.data2.classed('c3-focused')).toBeTruthy(); + expect(targets.data3.classed('c3-focused')).toBeFalsy(); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeTruthy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + 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')).toBeTruthy(); + expect(targets.data2.classed('c3-focused')).toBeTruthy(); + expect(targets.data3.classed('c3-focused')).toBeFalsy(); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeTruthy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeTruthy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + 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')).toBeFalsy(); + expect(line.classed('c3-defocused')).toBeTruthy(); + }); + legendItems.each(function () { + var item = d3.select(this); + expect(item.classed('c3-legend-item-focused')).toBeFalsy(); + expect(+item.style('opacity')).toBeCloseTo(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')).toBeFalsy(); + expect(targets.data2.classed('c3-defocused')).toBeTruthy(); + expect(targets.data3.classed('c3-defocused')).toBeFalsy(); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(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')).toBeTruthy(); + expect(targets.data2.classed('c3-defocused')).toBeTruthy(); + expect(targets.data3.classed('c3-defocused')).toBeFalsy(); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(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')).toBeTruthy(); + expect(targets.data2.classed('c3-defocused')).toBeTruthy(); + expect(targets.data3.classed('c3-defocused')).toBeFalsy(); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(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')).toBeFalsy(); + }); + legendItems.each(function () { + var item = d3.select(this); + expect(item.classed('c3-legend-item-focused')).toBeFalsy(); + expect(+item.style('opacity')).toBeCloseTo(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')).toBeFalsy(); + }); + legendItems.each(function () { + var item = d3.select(this); + expect(item.classed('c3-legend-item-focused')).toBeFalsy(); + expect(+item.style('opacity')).toBeCloseTo(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')).toBeTruthy(); + expect(targets.data2.classed('c3-focused')).toBeFalsy(); + expect(targets.data3.classed('c3-focused')).toBeTruthy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(1); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeTruthy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy(); + 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')).toBeTruthy(); + expect(targets.data2.classed('c3-defocused')).toBeFalsy(); + expect(targets.data3.classed('c3-defocused')).toBeTruthy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(0.3); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + 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')).toBeFalsy(); + expect(targets.data2.classed('c3-focused')).toBeFalsy(); + expect(targets.data3.classed('c3-focused')).toBeTruthy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(1); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy(); + 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')).toBeFalsy(); + expect(targets.data2.classed('c3-defocused')).toBeFalsy(); + expect(targets.data3.classed('c3-defocused')).toBeTruthy(); + expect(+legendItems.data1.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data2.style('opacity')).toBeCloseTo(1); + expect(+legendItems.data3.style('opacity')).toBeCloseTo(0.3); + expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy(); + expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy(); + done(); + }, 1000); + }, 1000); + }); + + }); + + describe('when legend.show = false', function () { + + it('should update args to hide legend', function () { + args.legend = { + show: false + }; + expect(true).toBeTruthy(); + }); + + 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')).toBeTruthy(); + }); + expect(legendItems.size()).toBeCloseTo(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')).toBeTruthy(); + }); + expect(legendItems.size()).toBeCloseTo(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')).toBeFalsy(); + }); + expect(legendItems.size()).toBeCloseTo(0); + done(); + }, 1000); + }, 1000); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.grid-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.grid-spec.js new file mode 100644 index 0000000..ebaeee6 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.grid-spec.js @@ -0,0 +1,119 @@ +describe('c3 api grid', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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()).toBe(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).toBe(expectedY); + expect(text).toBe(expectedText); + }); + + // Call ygrids.remove + chart.ygrids.remove(expectedGrids); + setTimeout(function () { + grids = main.selectAll('.c3-ygrid-line'); + expect(grids.size()).toBe(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()).toBe(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).toBe(expectedX); + expect(text).toBe(expectedText); + }); + + // check if it was not rescaled + domain = chart.internal.y.domain(); + expect(domain[0]).toBeLessThan(0); + expect(domain[1]).toBeGreaterThan(400); + + // Call xgrids.remove + chart.xgrids.remove(expectedGrids); + setTimeout(function () { + grids = main.selectAll('.c3-xgrid-line'); + expect(grids.size()).toBe(0); + }, 500); // for xgrids.remove() + + }, 500); // for xgrids() + + }, 500); // for zoom + + setTimeout(function () { + done(); + }, 1700); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.load-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.load-spec.js new file mode 100644 index 0000000..fbea981 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.load-spec.js @@ -0,0 +1,121 @@ +describe('c3 api load', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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()).toBe(1); + expect(legendItem.size()).toBe(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).toBeTruthy(); + }); + + 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()).toBe(1); + expect(legendItem.size()).toBe(1); + tickTexts.each(function (d, i) { + var text = d3.select(this).select('tspan').text(); + expect(text).toBe(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()).toBe(1); + expect(legendItem.size()).toBe(1); + tickTexts.each(function (d, i) { + var text = d3.select(this).select('tspan').text(); + expect(text).toBe(expected[i]); + }); + done(); + }, 500); + }); + + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.zoom-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.zoom-spec.js new file mode 100644 index 0000000..4a65927 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/api.zoom-spec.js @@ -0,0 +1,115 @@ +describe('c3 api zoom', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + it('should be zoomed properly', function () { + var target = [3, 5], domain; + chart.zoom(target); + domain = chart.internal.x.domain(); + expect(domain[0]).toBe(target[0]); + expect(domain[1]).toBe(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]).toBe(target[0]); + expect(domain[1]).toBe(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).toBeTruthy(); + }); + + 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]).toBe(+target[0]); + expect(+domain[1]).toBe(+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]).toBe(+chart.internal.parseDate(target[0])); + expect(+domain[1]).toBe(+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).toBeTruthy(); + }); + + 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]).toBe(target[0]); + expect(domain[1]).toBe(target[1]); + + chart.unzoom(); + domain = chart.internal.x.domain(); + expect(domain[0]).toBe(orginal[0]); + expect(domain[1]).toBe(orginal[1]); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/arc-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/arc-spec.js new file mode 100644 index 0000000..517bf64 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/arc-spec.js @@ -0,0 +1,100 @@ +describe('c3 chart arc', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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()).toBe(1); + expect(arcs.data2.size()).toBe(1); + expect(arcs.data3.size()).toBe(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).toBeTruthy(); + }); + + 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).toBeTruthy(); + }); + + 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')).toBe(-1); + expect(arcs.data2.attr('d').indexOf('NaN')).toBe(-1); + expect(arcs.data3.attr('d').indexOf('NaN')).toBe(-1); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/axis-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/axis-spec.js new file mode 100644 index 0000000..0f4aa2d --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/axis-spec.js @@ -0,0 +1,769 @@ +describe('c3 chart axis', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + it('should have only 1 tick on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(1); + }); + + it('should update args to have 2 ticks on y axis', function () { + args.axis.y.tick.count = 2; + expect(true).toBeTruthy(); + }); + + it('should have 2 ticks on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(2); + }); + + it('should update args to have 3 ticks on y axis', function () { + args.axis.y.tick.count = 3; + expect(true).toBeTruthy(); + }); + + it('should have 3 ticks on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(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).toBeTruthy(); + }); + + it('should have only 2 tick on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(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).toBe(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).toBeTruthy(); + }); + + it('should have 7 ticks on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(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).toBeTruthy(); + }); + + it('should have 4 ticks on y axis', function () { + var ticksSize = d3.select('.c3-axis-y').selectAll('g.tick').size(); + expect(ticksSize).toBe(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.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).toBeTruthy(); + }); + + 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()).toBe(6); + ticks.each(function (d, i) { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.text()).toBe(i + ''); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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).toBeTruthy(); + }); + + 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()).toBe(6); + ticks.each(function () { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(2); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + if (i === 0) { + expect(tspan.attr('dy')).toBe('.71em'); + } else { + expect(tspan.attr('dy')).toBeGreaterThan(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()).toBe(9); + ticks.each(function (d) { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.text()).toBe(d + ''); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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()).toBe(9); + ticks.each(function (d) { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.text()).toBe(d + ''); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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).toBeTruthy(); + }); + + 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()).toBe(1); + }); + }); + + }); + + describe('rotated', function () { + + it('should update args to rotate axis', function () { + args.axis.rotated = true; + expect(true).toBeTruthy(); + }); + + 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()).toBe(6); + ticks.each(function () { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(2); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + if (i === 0) { + expect(tspan.attr('dy')).toBeLessThan(0); + } else { + expect(tspan.attr('dy')).toBeGreaterThan(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()).toBe(7); + ticks.each(function (d, i) { + var tspans = d3.select(this).selectAll('tspan'); + expect(tspans.size()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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).toBeTruthy(); + }); + + 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()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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()).toBe(3); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTickTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + // unable to define pricise number because it differs depends on environment.. + if (i === 0) { + expect(tspan.attr('dy')).toBe('.71em'); + } else { + expect(tspan.attr('dy')).toBeGreaterThan(8); + } + }); + }); + }); + + describe('rotated', function () { + + it('should update args to rotate axis', function () { + args.axis.rotated = true; + expect(true).toBeTruthy(); + }); + + 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()).toBe(1); + tspans.each(function () { + var tspan = d3.select(this); + expect(tspan.attr('x')).toBe(expectedX); + expect(tspan.attr('dy')).toBe(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()).toBe(3); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTickTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + // unable to define pricise number because it differs depends on environment.. + if (i === 0) { + expect(tspan.attr('dy')).toBeLessThan(0); + } else { + expect(tspan.attr('dy')).toBeGreaterThan(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).toBeTruthy(); + }); + + 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()).toBe(1); + }); + + }); + + describe('as value', function () { + + it('should update args not to split ticks', function () { + args.axis.x.tick = { + width: 150 + }; + expect(true).toBeTruthy(); + }); + + 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()).toBe(2); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(expectedTickTexts[i]); + expect(tspan.attr('x')).toBe(expectedX); + // unable to define pricise number because it differs depends on environment.. + if (i === 0) { + expect(tspan.attr('dy')).toBeLessThan(0); + } else { + expect(tspan.attr('dy')).toBeGreaterThan(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).toBeTruthy(); + }); + + 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()).toBe(2); + tspans.each(function (d, i) { + var tspan = d3.select(this); + expect(tspan.text()).toBe(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).toBeTruthy(); + }); + + 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')).toBe('rotate(60)'); + expect(text.attr('y')).toBe('1.5'); + expect(tspan.attr('dx')).toBe('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).toBeGreaterThan(50); + expect(height).toBeCloseTo(70, -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).toBeTruthy(); + }); + + it('should show fitted ticks on indexed data', function () { + var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); + expect(ticks.size()).toBe(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).toBeTruthy(); + }); + + it('should show fitted ticks on indexed data', function () { + var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); + expect(ticks.size()).toBe(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()).toBe(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).toBeTruthy(); + }); + + it('should show fitted ticks on indexed data', function () { + var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); + expect(ticks.size()).toBe(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).toBeTruthy(); + }); + + it('should show fitted ticks on indexed data', function () { + var ticks = chart.internal.main.selectAll('.c3-axis-x g.tick'); + expect(ticks.size()).toBe(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()).toBe(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).toBeTruthy(); + }); + + 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).toBeGreaterThan(19); + tickTexts.each(function () { + expect(+d3.select(this).attr('x')).toBeLessThan(0); + }); + }); + + it('should update args to have inner y axis', function () { + args.axis.y.inner = true; + expect(true).toBeTruthy(); + }); + + 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).toBe(1); + tickTexts.each(function () { + expect(+d3.select(this).attr('x')).toBeGreaterThan(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).toBeTruthy(); + }); + + 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).toBeGreaterThan(19); + tickTexts.each(function () { + expect(+d3.select(this).attr('x')).toBeGreaterThan(0); + }); + }); + + it('should update args to have inner y axis', function () { + args.axis.y2.inner = true; + expect(true).toBeTruthy(); + }); + + 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).toBe(2); + tickTexts.each(function () { + expect(+d3.select(this).attr('x')).toBeLessThan(0); + }); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-helper.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-helper.js new file mode 100644 index 0000000..970cd1b --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-helper.js @@ -0,0 +1,47 @@ +function initDom() { + 'use strict'; + + 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) { + 'use strict'; + + 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) { + 'use strict'; + + 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'; diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-spec.js new file mode 100644 index 0000000..7be30b3 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/c3-spec.js @@ -0,0 +1,10 @@ +describe('c3', function () { + 'use strict'; + + var c3 = window.c3; + + it('exists', function () { + expect(c3).not.toBeNull(); + expect(typeof c3).toBe('object'); + }); +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/class-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/class-spec.js new file mode 100644 index 0000000..97d0e69 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/class-spec.js @@ -0,0 +1,61 @@ +describe('c3 chart class', function () { + 'use strict'; + + 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).toBe(expected); + }); + + it('should replace space to "-"', function () { + var input = 'data1 suffix', + expected = '-data1-suffix', + suffix = chart.internal.getTargetSelectorSuffix(input); + expect(suffix).toBe(expected); + }); + + it('should replace space to "-" with multibyte characters', function () { + var input = 'data1 suffix 日本語', + expected = '-data1-suffix-日本語', + suffix = chart.internal.getTargetSelectorSuffix(input); + expect(suffix).toBe(expected); + }); + + it('should replace special charactors to "-"', function () { + var input = 'data1 !@#$%^&*()_=+,.<>"\':;[]/|?~`{}\\', + expected = '-data1--------------------------------', + suffix = chart.internal.getTargetSelectorSuffix(input); + expect(suffix).toBe(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()).toBe(1); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/core-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/core-spec.js new file mode 100644 index 0000000..048df38 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/core-spec.js @@ -0,0 +1,150 @@ +describe('c3 chart', function () { + 'use strict'; + + 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] + ] + } + }; + + 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.toBeNull(); + }); + + it('should set 3rd party property to Function', function () { + Function.prototype.$extIsFunction = true; + expect(true).toBeTruthy(); + }); + + it('should be created even if 3rd party property has been set', function () { + var svg = d3.select('#chart svg'); + expect(svg).not.toBeNull(); + }); + + }); + + describe('size', function () { + + it('should have same width', function () { + var svg = d3.select('#chart svg'); + expect(+svg.attr('width')).toBe(640); + }); + + it('should have same height', function () { + var svg = d3.select('#chart svg'); + expect(+svg.attr('height')).toBe(480); + }); + + }); + + describe('bindto', function () { + + describe('selector', function () { + it('update args', function () { + d3.select('#chart').html(''); + args.bindto = '#chart'; + expect(true).toBeTruthy(); + }); + it('should be created', function () { + var svg = d3.select('#chart svg'); + expect(svg.size()).toBe(1); + }); + }); + + describe('d3.selection object', function () { + it('update args', function () { + d3.select('#chart').html(''); + args.bindto = d3.select('#chart'); + expect(true).toBeTruthy(); + }); + it('should be created', function () { + var svg = d3.select('#chart svg'); + expect(svg.size()).toBe(1); + }); + }); + + describe('null', function () { + it('update args', function () { + d3.select('#chart').html(''); + args.bindto = null; + expect(true).toBeTruthy(); + }); + it('should not be created', function () { + var svg = d3.select('#chart svg'); + expect(svg.size()).toBe(0); + }); + }); + + describe('empty string', function () { + it('update args', function () { + d3.select('#chart').html(''); + args.bindto = ''; + expect(true).toBeTruthy(); + }); + it('should not be created', function () { + var svg = d3.select('#chart svg'); + expect(svg.size()).toBe(0); + }); + }); + + }); + + describe('empty data', function () { + + it('should upaate args for empty data', function () { + args = { + data: { + columns: [ + ['data1'], + ['data2'] + ] + } + }; + expect(true).toBeTruthy(); + }); + + it('should generate a chart', function () { + var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); + expect(ticks.size()).toBe(0); + }); + + it('should upaate args for empty data', function () { + args = { + data: { + x: 'x', + columns: [ + ['x'], + ['data1'], + ['data2'] + ] + }, + axis: { + x: { + type: 'timeseries' + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should generate a chart', function () { + var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick'); + expect(ticks.size()).toBe(0); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/data-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/data-spec.js new file mode 100644 index 0000000..db7e929 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/data-spec.js @@ -0,0 +1,1220 @@ +describe('c3 chart data', function () { + 'use strict'; + + var chart, args; + + beforeEach(function (done) { + chart = window.initChart(chart, args, done); + }); + + describe('load json', function () { + + it('should update args', function () { + args = { + data: { + json: { + data1: [30, 20, 50], + data2: [200, 130, 90] + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should draw correctly', function () { + var expectedCx = [6, 299, 593], + expectedCy = [370, 390, 331]; + d3.selectAll('.c3-circles-data1 .c3-circle').each(function (d, i) { + var circle = d3.select(this); + expect(+circle.attr('cx')).toBeCloseTo(expectedCx[i], -2); + expect(+circle.attr('cy')).toBeCloseTo(expectedCy[i], -2); + }); + }); + + it('should update args', function () { + args = { + data: { + json: [{ + "date": "2014-06-03", + "443": "3000", + "995": "500" + }, { + "date": "2014-06-04", + "443": "1000" + }, { + "date": "2014-06-05", + "443": "5000", + "995": "1000" + }], + keys: { + x: 'date', + value: [ "443", "995" ] + } + }, + axis: { + x: { + type: "category" + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should draw correctly', function () { + var expectedCx = {443: [98, 294, 490], 995: [98, 294, 490]}, + expectedCy = {443: [193, 351, 36], 995: [390, 429, 351]}; + d3.selectAll('.c3-circles-443 .c3-circle').each(function (d, i) { + var circle = d3.select(this); + expect(+circle.attr('cx')).toBeCloseTo(expectedCx[443][i], -2); + expect(+circle.attr('cy')).toBeCloseTo(expectedCy[443][i], -2); + }); + d3.selectAll('.c3-circles-995 .c3-circle').each(function (d, i) { + var circle = d3.select(this); + expect(+circle.attr('cx')).toBeCloseTo(expectedCx[995][i], -2); + expect(+circle.attr('cy')).toBeCloseTo(expectedCy[995][i], -2); + }); + }); + + }); + + describe('function in data.order', 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] + ], + order: function () { + return 0; + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should return false in isOrderAsc and isOrderDesc functions', function () { + expect(chart.internal.isOrderAsc() || chart.internal.isOrderDesc()).toBe(false); + }); + }); + + describe('data.xs', 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] + ], + } + }; + expect(true).toBeTruthy(); + }); + + describe('normal x', function () { + + it('should have correct number of xs for each', function () { + expect(Object.keys(chart.internal.data.xs).length).toBe(3); + expect(chart.internal.data.xs.data1.length).toBe(6); + expect(chart.internal.data.xs.data2.length).toBe(6); + expect(chart.internal.data.xs.data3.length).toBe(6); + }); + + it('should have integer index as x', function () { + for (var i = 0; i < chart.internal.data.xs.data3.length; i++) { + expect(chart.internal.data.xs.data1[i]).toBe(i); + expect(chart.internal.data.xs.data2[i]).toBe(i); + expect(chart.internal.data.xs.data3[i]).toBe(i); + } + }); + + }); + + describe('timeseries x', function () { + describe('without xFormat', function () { + + it('should load timeseries data successfully', function () { + args = { + data: { + x : 'date', + columns: [ + ['date', '2013-01-01', '2013-01-02', '2013-01-03'], + ['data1', 30, 200, 100], + ['data2', 130, 300, 200] + ] + }, + axis : { + x : { + type : 'timeseries' + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have correct number of xs', function () { + expect(Object.keys(chart.internal.data.xs).length).toBe(2); + expect(chart.internal.data.xs.data1.length).toBe(3); + expect(chart.internal.data.xs.data2.length).toBe(3); + }); + + it('should have Date object as x', function () { + var xs = chart.internal.data.xs; + expect(+xs.data1[0]).toBe(+new Date(2013, 0, 1, 0, 0, 0)); + expect(+xs.data1[1]).toBe(+new Date(2013, 0, 2, 0, 0, 0)); + expect(+xs.data1[2]).toBe(+new Date(2013, 0, 3, 0, 0, 0)); + expect(+xs.data2[0]).toBe(+new Date(2013, 0, 1, 0, 0, 0)); + expect(+xs.data2[1]).toBe(+new Date(2013, 0, 2, 0, 0, 0)); + expect(+xs.data2[2]).toBe(+new Date(2013, 0, 3, 0, 0, 0)); + }); + }); + + describe('with xFormat', function () { + describe('timeseries x with xFormat', function () { + it('should load timeseries data successfully', function () { + args = { + data: { + x : 'date', + xFormat: '%Y%m%d', + columns: [ + ['date', '20130101', '20130102', '20130103'], + ['data1', 30, 200, 100], + ['data2', 130, 300, 200] + ] + }, + axis : { + x : { + type : 'timeseries' + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have correct number of xs', function () { + expect(Object.keys(chart.internal.data.xs).length).toBe(2); + expect(chart.internal.data.xs.data1.length).toBe(3); + expect(chart.internal.data.xs.data2.length).toBe(3); + }); + + it('should have Date object as x', function () { + var xs = chart.internal.data.xs; + expect(+xs.data1[0]).toBe(+new Date(2013, 0, 1, 0, 0, 0)); + expect(+xs.data1[1]).toBe(+new Date(2013, 0, 2, 0, 0, 0)); + expect(+xs.data1[2]).toBe(+new Date(2013, 0, 3, 0, 0, 0)); + expect(+xs.data2[0]).toBe(+new Date(2013, 0, 1, 0, 0, 0)); + expect(+xs.data2[1]).toBe(+new Date(2013, 0, 2, 0, 0, 0)); + expect(+xs.data2[2]).toBe(+new Date(2013, 0, 3, 0, 0, 0)); + }); + }); + }); + }); + + describe('milliseconds timeseries x', function () { + + describe('as date string', function () { + + it('should update args', function () { + args = { + data: { + x : 'date', + xFormat: '%Y-%m-%d %H:%M:%S.%L', + columns: [ + ['date', "2014-05-20 17:25:00.123", "2014-05-20 17:30:00.345"], + ['data1', 30, 200], + ['data2', 130, 300] + ] + }, + axis: { + x: { + type: 'timeseries', + tick: { + format: '%Y-%m-%d %H:%M:%S.%L', + multiline: false + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have correct number of xs', function () { + expect(Object.keys(chart.internal.data.xs).length).toBe(2); + expect(chart.internal.data.xs.data1.length).toBe(2); + expect(chart.internal.data.xs.data2.length).toBe(2); + }); + + it('should have Date object as x', function () { + var xs = chart.internal.data.xs; + expect(+xs.data1[0]).toBe(+new Date(2014, 4, 20, 17, 25, 0, 123)); + expect(+xs.data1[1]).toBe(+new Date(2014, 4, 20, 17, 30, 0, 345)); + expect(+xs.data2[0]).toBe(+new Date(2014, 4, 20, 17, 25, 0, 123)); + expect(+xs.data2[1]).toBe(+new Date(2014, 4, 20, 17, 30, 0, 345)); + }); + + it('should have milliseconds tick format', function () { + var expected = ["2014-05-20 17:25:00.123", "2014-05-20 17:30:00.345"]; + chart.internal.main.selectAll('.c3-axis-x g.tick text').each(function (d, i) { + expect(d3.select(this).text()).toBe(expected[i]); + }); + }); + + }); + + describe('as unixtime number', function () { + + it('should update args', function () { + args = { + data: { + x : 'date', + columns: [ + ['date', 1417622461123, 1417622522345], + ['data1', 30, 200], + ['data2', 130, 300] + ] + }, + axis: { + x: { + type: 'timeseries', + tick: { + format: '%Y-%m-%d %H:%M:%S.%L' + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have correct number of xs', function () { + expect(Object.keys(chart.internal.data.xs).length).toBe(2); + expect(chart.internal.data.xs.data1.length).toBe(2); + expect(chart.internal.data.xs.data2.length).toBe(2); + }); + + it('should have Date object as x', function () { + var xs = chart.internal.data.xs; + expect(+xs.data1[0]).toBe(1417622461123); + expect(+xs.data1[1]).toBe(1417622522345); + expect(+xs.data2[0]).toBe(1417622461123); + expect(+xs.data2[1]).toBe(1417622522345); + }); + }); + + }); + + }); + + describe('data.label', function () { + + describe('on line chart', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', 1030, 2200, 2100], + ['data2', 1150, 2010, 1200], + ['data3', -1150, -2010, -1200], + ['data4', -1030, -2200, -2100], + ], + type: 'line', + labels: true, + } + }; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [128, 38, 46], + data2: [119, 53, 115], + data3: [311, 377, 315], + data4: [302, 392, 384], + }; + var expectedTextX = { + data1: [6, 294, 583], + data2: [6, 294, 583], + data3: [6, 294, 583], + data4: [6, 294, 583], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + it('should update args to be stacked', function () { + args.data.groups = [['data1', 'data2'], ['data3', 'data4']]; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [120, 38, 75], + data2: [161, 127, 159], + data3: [269, 303, 271], + data4: [310, 392, 355], + }; + var expectedTextX = { + data1: [6, 294, 583], + data2: [6, 294, 583], + data3: [6, 294, 583], + data4: [6, 294, 583], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + }); + + describe('on area chart', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', 1030, 2200, 2100], + ['data2', 1150, 2010, 1200], + ['data3', -1150, -2010, -1200], + ['data4', -1030, -2200, -2100], + ], + type: 'area', + labels: true, + } + }; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [128, 38, 46], + data2: [119, 53, 115], + data3: [311, 377, 315], + data4: [302, 392, 384], + }; + var expectedTextX = { + data1: [6, 294, 583], + data2: [6, 294, 583], + data3: [6, 294, 583], + data4: [6, 294, 583], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + it('should update args to be stacked', function () { + args.data.groups = [['data1', 'data2'], ['data3', 'data4']]; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [120, 38, 75], + data2: [161, 127, 159], + data3: [269, 303, 271], + data4: [310, 392, 355], + }; + var expectedTextX = { + data1: [6, 294, 583], + data2: [6, 294, 583], + data3: [6, 294, 583], + data4: [6, 294, 583], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + }); + + describe('on bar chart', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', 1030, 2200, 2100], + ['data2', 1150, 2010, 1200], + ['data3', -1150, -2010, -1200], + ['data4', -1030, -2200, -2100], + ], + type: 'bar', + labels: true, + } + }; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [128, 38, 46], + data2: [119, 53, 115], + data3: [311, 377, 315], + data4: [302, 392, 384], + }; + var expectedTextX = { + data1: [53, 249, 445], + data2: [83, 279, 475], + data3: [112, 308, 504], + data4: [142, 338, 534], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + it('should update args to be stacked', function () { + args.data.groups = [['data1', 'data2'], ['data3', 'data4']]; + expect(true).toBeTruthy(); + }); + + it('should locate data labels in correct position', function () { + var expectedTextY = { + data1: [120, 38, 75], + data2: [161, 127, 159], + data3: [269, 303, 271], + data4: [310, 392, 355], + }; + var expectedTextX = { + data1: [68.6, 264, 460], + data2: [68.6, 264, 460], + data3: [127, 323, 519], + data4: [127, 323, 519], + }; + Object.keys(expectedTextY).forEach(function (key) { + d3.selectAll('.c3-texts-' + key + ' text.c3-text').each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedTextY[key][i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedTextX[key][i], -2); + }); + }); + }); + + }); + + describe('for all targets', function () { + + it('should update args to show data label for all data', function () { + args = { + data: { + columns: [ + ['data1', 100, 200, 100, 400, 150, 250], + ['data2', 10, 20, 10, 40, 15, 25], + ['data3', 1000, 2000, 1000, 4000, 1500, 2500] + ], + labels: true + } + }; + expect(true).toBeTruthy(); + }); + + it('should have data labels on all data', function () { + d3.selectAll('.c3-texts-data1 text').each(function (d, i) { + expect(d3.select(this).text()).toBe(args.data.columns[0][i + 1] + ''); + }); + d3.selectAll('.c3-texts-data2 text').each(function (d, i) { + expect(d3.select(this).text()).toBe(args.data.columns[1][i + 1] + ''); + }); + d3.selectAll('.c3-texts-data3 text').each(function (d, i) { + expect(d3.select(this).text()).toBe(args.data.columns[2][i + 1] + ''); + }); + }); + + }); + + describe('for each target', function () { + + describe('as true', function () { + + it('should update args to show data label for only data1', function () { + args = { + data: { + columns: [ + ['data1', 100, 200, 100, 400, 150, 250], + ['data2', 10, 20, 10, 40, 15, 25], + ['data3', 1000, 2000, 1000, 4000, 1500, 2500] + ], + labels: { + format: { + data1: true + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have data labels on all data', function () { + d3.selectAll('.c3-texts-data1 text').each(function (d, i) { + expect(d3.select(this).text()).toBe(args.data.columns[0][i + 1] + ''); + }); + d3.selectAll('.c3-texts-data2 text').each(function () { + expect(d3.select(this).text()).toBe(''); + }); + d3.selectAll('.c3-texts-data3 text').each(function () { + expect(d3.select(this).text()).toBe(''); + }); + }); + }); + + describe('as function', function () { + + it('should update args to show data label for only data1', function () { + args = { + data: { + columns: [ + ['data1', 100, 200, 100, 400, 150, 250], + ['data2', 10, 20, 10, 40, 15, 25], + ['data3', 1000, 2000, 1000, 4000, 1500, 2500] + ], + labels: { + format: { + data1: d3.format('$') + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have data labels on all data', function () { + d3.selectAll('.c3-texts-data1 text').each(function (d, i) { + expect(d3.select(this).text()).toBe('$' + args.data.columns[0][i + 1]); + }); + d3.selectAll('.c3-texts-data2 text').each(function () { + expect(d3.select(this).text()).toBe(''); + }); + d3.selectAll('.c3-texts-data3 text').each(function () { + expect(d3.select(this).text()).toBe(''); + }); + }); + }); + + }); + + describe('with small values', function () { + + it('should update args to show data label', function () { + args = { + data: { + columns: [ + ['data1', 0.03, 0.2, 0.1, 0.4, 0.15, 0.250] + ], + labels: true + } + }; + expect(true).toBeTruthy(); + }); + + it('should have proper y domain', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-0.02); + expect(domain[1]).toBeCloseTo(0.45); + }); + }); + + describe('with positive values and null', function () { + + describe('on not rotated axis', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', 190, 200, 190, null], + ], + type: 'bar', + labels: { + format: function (v) { + if (v === null) { + return 'Not Applicable'; + } + return d3.format('$')(v); + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(0, -1); + expect(domain[1]).toBeCloseTo(227, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [67, 49, 67, 423], + expectedXs = [74, 221, 368, 515]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(189, -1); + expect(domain[1]).toBeCloseTo(201, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [375, 40, 375, 422], + expectedXs = [6, 198, 391, 583]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + describe('on rotated axis', function () { + + it('should update args', function () { + args.data.type = 'bar'; + args.axis = { + rotated: true + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(0, -1); + expect(domain[1]).toBeCloseTo(231, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [57, 163, 269, 375], + expectedXs = [490, 516, 490, 4]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(188, -1); + expect(domain[1]).toBeCloseTo(202, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [9, 147, 286, 424], + expectedXs = [76, 526, 76, 4]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + }); + + describe('with positive values and null', function () { + + describe('on not rotated axis', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', -190, -200, -190, null], + ], + type: 'bar', + labels: { + format: function (v) { + if (v === null) { + return 'Not Applicable'; + } + return d3.format('$')(v); + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-227, -1); + expect(domain[1]).toBeCloseTo(0, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [368, 387, 368, 12], + expectedXs = [74, 221, 368, 515]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-201, -1); + expect(domain[1]).toBeCloseTo(-189, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [58, 392, 58, 12], + expectedXs = [6, 198, 391, 583]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + describe('on rotated axis', function () { + + it('should update args', function () { + args.data.type = 'bar'; + args.axis = { + rotated: true + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-232, -1); + expect(domain[1]).toBeCloseTo(0, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [57, 163, 269, 375], + expectedXs = [103, 78, 103, 526]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-202, -1); + expect(domain[1]).toBeCloseTo(-188, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [9, 147, 286, 424], + expectedXs = [511, 67, 511, 526]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + }); + + describe('with positive and negative values and null', function () { + + describe('on non rotated axis', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', -190, 200, 190, null], + ], + type: 'bar', + labels: { + format: function (v) { + if (v === null) { + return 'Not Applicable'; + } + return d3.format('$')(v); + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-243, -1); + expect(domain[1]).toBeCloseTo(253, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [392, 43, 52, 215], + expectedXs = [74, 221, 368, 515]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-243, -1); + expect(domain[1]).toBeCloseTo(253, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [392, 40, 49, 212], + expectedXs = [6, 198, 391, 583]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + }); + + describe('on rotated axis', function () { + + it('should update args', function () { + args.data.type = 'bar'; + args.axis = { + rotated: true + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-254, -1); + expect(domain[1]).toBeCloseTo(260, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [57, 163, 269, 375], + expectedXs = [69, 525, 513, 295]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-254, -1); + expect(domain[1]).toBeCloseTo(260, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [9, 147, 286, 424], + expectedXs = [67, 527, 515, 297]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + }); + + }); + + describe('with positive grouped values', function () { + + describe('on non rotated axis', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', 30, 200, 100, 500], + ['data2', 50, 20, 10, 40], + ['data3', 250, 220, 210, 240], + ], + groups: [['data1', 'data2', 'data3']], + labels: true, + type: 'bar', + } + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(0, -1); + expect(domain[1]).toBeCloseTo(885, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [385, 317, 370, 164], + expectedXs = [74, 221, 368, 515]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-94, -1); + expect(domain[1]).toBeCloseTo(884, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [344, 284, 331, 144], + expectedXs = [6, 198, 391, 583]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + describe('on rotated axis', function () { + + it('should update args', function () { + args.data.type = 'bar'; + args.axis = { + rotated: true + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(0, -1); + expect(domain[1]).toBeCloseTo(888, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [57, 163, 269, 375], + expectedXs = [57, 150, 77, 363]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-87, -1); + expect(domain[1]).toBeCloseTo(887, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [9, 147, 286, 424], + expectedXs = [107, 192, 125, 386]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + }); + + }); + + describe('with negative grouped values', function () { + + describe('on non rotated axis', function () { + + it('should update args', function () { + args = { + data: { + columns: [ + ['data1', -30, -200, -100, -500], + ['data2', -50, -20, -10, -40], + ['data3', -250, -220, -210, -240] + ], + groups: [['data1', 'data2', 'data3']], + labels: true, + type: 'bar', + } + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-885, -1); + expect(domain[1]).toBeCloseTo(0, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [51, 118, 65, 272], + expectedXs = [74, 221, 368, 515]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-884, -1); + expect(domain[1]).toBeCloseTo(94, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [88, 149, 101, 288], + expectedXs = [6, 198, 391, 583]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + }); + + describe('on rotated axis', function () { + + it('should update args', function () { + args.data.type = 'bar'; + args.axis = { + rotated: true + }; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-894, -1); + expect(domain[1]).toBeCloseTo(0, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [57, 163, 269, 375], + expectedXs = [533, 440, 513, 230]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + + it('should update args', function () { + args.data.type = 'line'; + expect(true).toBeTruthy(); + }); + + it('should have y domain with proper padding', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-894, -1); + expect(domain[1]).toBeCloseTo(94, -1); + }); + + it('should locate labels above each data point', function () { + var texts = chart.internal.main.selectAll('.c3-texts-data1 text'), + expectedYs = [9, 147, 286, 424], + expectedXs = [480, 397, 462, 205]; + texts.each(function (d, i) { + var text = d3.select(this); + expect(+text.attr('y')).toBeCloseTo(expectedYs[i], -2); + expect(+text.attr('x')).toBeCloseTo(expectedXs[i], -2); + }); + }); + }); + + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/domain-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/domain-spec.js new file mode 100644 index 0000000..69f7995 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/domain-spec.js @@ -0,0 +1,110 @@ +describe('c3 chart domain', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + it('should be set properly when smaller than max of data', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBe(-150); + expect(domain[1]).toBe(450); + }); + + it('should change axis.y.min to 500', function () { + args.axis.y.min = 500; + expect(true).toBeTruthy(); + }); + + it('should be set properly when bigger than max of data', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBe(499); + expect(domain[1]).toBe(511); + }); + + it('should change axis.y.min to undefined', function () { + args.axis.y.min = undefined; + expect(true).toBeTruthy(); + }); + + }); + + describe('axis.y.max', function () { + + it('should change axis.y.max to 1000', function () { + args.axis.y.max = 1000; + expect(true).toBeTruthy(); + }); + + it('should be set properly when bigger than min of data', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBe(-89); + expect(domain[1]).toBe(1099); + }); + + it('should change axis.y.max to 0', function () { + args.axis.y.max = 0; + expect(true).toBeTruthy(); + }); + + it('should be set properly when smaller than min of data', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBe(-11); + expect(domain[1]).toBe(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: { + top: 200, + bottom: 200 + } + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should be set properly when bigger than min of data', function () { + var domain = chart.internal.y.domain(); + expect(domain[0]).toBeCloseTo(-9, -1); + expect(domain[1]).toBeCloseTo(69, -1); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/grid-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/grid-spec.js new file mode 100644 index 0000000..0443ec1 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/grid-spec.js @@ -0,0 +1,365 @@ +describe('c3 chart grid', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + it('should not show y grids', function () { + expect(chart.internal.main.select('.c3-ygrids').size()).toBe(0); + }); + + it('should update args to show y grids', function () { + args.grid.y.show = true; + expect(true).toBeTruthy(); + }); + + it('should show y grids', function () { + var ygrids = chart.internal.main.select('.c3-ygrids'); + expect(ygrids.size()).toBe(1); + expect(ygrids.selectAll('.c3-ygrid').size()).toBe(9); + }); + + it('should update args to show only 3 y grids', function () { + args.grid.y.ticks = 3; + expect(true).toBeTruthy(); + }); + + it('should show only 3 y grids', function () { + var ygrids = chart.internal.main.select('.c3-ygrids'); + expect(ygrids.size()).toBe(1); + expect(ygrids.selectAll('.c3-ygrid').size()).toBe(3); + }); + + it('should update args to show y grids depending on y axis ticks', function () { + args.axis.y.tick.count = 5; + expect(true).toBeTruthy(); + }); + + 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()).toBe(1); + expect(ygrids.selectAll('.c3-ygrid').size()).toBe(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]).toBe(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: 'Lable 30', position: 'start'}, + {value: 145, text: 'Lable 145', position: 'middle'}, + {value: 225, text: 'Lable 225'} + ] + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should show 3 grid lines', function () { + expect(chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line').size()).toBe(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).toBeCloseTo(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).toBe(expectedPositions[i]); + expect(+dx).toBe(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: 'Lable 30', position: 'start'}, + {value: 145, text: 'Lable 145', position: 'middle'}, + {value: 225, text: 'Lable 225'} + ] + } + } + }; + expect(true).toBeTruthy(); + }); + + it('should show 3 grid lines', function () { + expect(chart.internal.main.selectAll('.c3-ygrid-lines .c3-ygrid-line').size()).toBe(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).toBeCloseTo(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).toBe(expectedPositions[i]); + expect(+dx).toBe(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).toBeTruthy(); + }); + + it('should show 3 grid lines', function () { + expect(chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line').size()).toBe(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).toBeCloseTo(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).toBe(expectedPositions[i]); + expect(+dx).toBe(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).toBeTruthy(); + }); + + it('should show 3 grid lines', function () { + expect(chart.internal.main.selectAll('.c3-xgrid-lines .c3-xgrid-line').size()).toBe(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).toBeCloseTo(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).toBe(expectedPositions[i]); + expect(+dx).toBe(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).toBeTruthy(); + }); + + 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')).toBeCloseTo(expectedX1, -2); + expect(t.text()).toBe(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).toBeTruthy(); + }); + + 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')).toBeCloseTo(expectedX1[i], -2); + expect(t.text()).toBe(expectedText[i]); + }); + }); + + }); + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/interaction-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/interaction-spec.js new file mode 100644 index 0000000..4e62070 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/interaction-spec.js @@ -0,0 +1,116 @@ +describe('c3 chart interaction', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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).toBeCloseTo(lefts[i], -2); + expect(box.width).toBeCloseTo(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).toBeTruthy(); + }); + + it('should have 1 event rects properly', function () { + var eventRects = d3.selectAll('.c3-event-rect'); + expect(eventRects.size()).toBe(1); + eventRects.each(function () { + var box = d3.select(this).node().getBoundingClientRect(); + expect(box.left).toBeCloseTo(40.5, -2); + expect(box.width).toBeCloseTo(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).toBeTruthy(); + }); + + 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).toBeCloseTo(lefts[i], -2); + expect(box.width).toBeCloseTo(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).toBeTruthy(); + }); + + it('should have 1 event rects properly', function () { + var eventRects = d3.selectAll('.c3-event-rect'); + expect(eventRects.size()).toBe(1); + eventRects.each(function () { + var box = d3.select(this).node().getBoundingClientRect(); + expect(box.left).toBeCloseTo(40.5, -2); + expect(box.width).toBeCloseTo(598, -2); + }); + }); + + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/legend-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/legend-spec.js new file mode 100644 index 0000000..5773b1a --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/legend-spec.js @@ -0,0 +1,220 @@ +describe('c3 chart legend', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + 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).toBeTruthy(); + }); + + 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).toBeCloseTo(expectedLeft[i], -2); + expect(rect.width).toBeCloseTo(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).toBeTruthy(); + }); + + it('should be located on the center of chart', function () { + var box = chart.internal.legend.node().getBoundingClientRect(); + expect(box.left + box.right).toBe(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).toBeTruthy(); + }); + + it('should be positioned properly', function () { + var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); + expect(box.top).toBe(5.5); + expect(box.left).toBeGreaterThan(30); + }); + + it('should have automatically calculated height', function () { + var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); + expect(box.height).toBe(48); + }); + + it('should change the legend step to 1 successfully', function () { + args.legend.inset.step = 1; + expect(true).toBeTruthy(); + }); + + it('should have automatically calculated height', function () { + var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); + expect(box.height).toBe(28); + }); + + it('should change the legend step to 2 successfully', function () { + args.legend.inset.step = 2; + expect(true).toBeTruthy(); + }); + + it('should have automatically calculated height', function () { + var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); + expect(box.height).toBe(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).toBeTruthy(); + }); + + it('should locate legend properly', function () { + var box = d3.select('.c3-legend-background').node().getBoundingClientRect(); + expect(box.height).toBe(28); + expect(box.width).toBeGreaterThan(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).toBeTruthy(); + }); + + it('should not show legends', function () { + d3.selectAll('.c3-legend-item').each(function () { + expect(d3.select(this).style('visibility')).toBe('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).toBeTruthy(); + }); + + it('should not show legends', function () { + expect(d3.select('.c3-legend-item-data1').style('visibility')).toBe('visible'); + expect(d3.select('.c3-legend-item-data2').style('visibility')).toBe('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).toBeTruthy(); + }); + + it('should not initially have rendered any legend items', function () { + expect(d3.selectAll('.c3-legend-item').empty()).toBe(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')).toBe('visible'); + // This selects all the children, but we expect it to be empty + expect(d3.select(this).selectAll("*").length).not.toEqual(0); + }); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.bar-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.bar-spec.js new file mode 100644 index 0000000..78f2971 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.bar-spec.js @@ -0,0 +1,88 @@ +var setMouseEvent = window.setMouseEvent; + +describe('c3 chart shape bar', function () { + 'use strict'; + + var chart, args; + + beforeEach(function (done) { + chart = window.initChart(chart, args, done); + }); + + 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).toBeTruthy(); + }); + + 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)).toBeFalsy(); + }); + + 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)).toBeTruthy(); + }); + + 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)).toBeFalsy(); + }); + + 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)).toBeTruthy(); + }); + + }); + + describe('with rotated axis', function () { + + it('should change the chart as axis rotated', function () { + args.axis.rotated = true; + expect(true).toBeTruthy(); + }); + + 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)).toBeFalsy(); + }); + + 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)).toBeTruthy(); + }); + + 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)).toBeTruthy(); + }); + + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.line-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.line-spec.js new file mode 100644 index 0000000..b4f5dc8 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/shape.line-spec.js @@ -0,0 +1,99 @@ +describe('c3 chart shape line', function () { + 'use strict'; + + var chart, args; + + beforeEach(function (done) { + chart = window.initChart(chart, args, done); + }); + + 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).toBeTruthy(); + }); + + 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).toBe('auto'); + }); + }); + + it('should chnage to step chart', function () { + args.data.type = 'step'; + expect(true).toBeTruthy(); + }); + + 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'); + expect(style).toBe('crispedges'); + }); + }); + + }); + + 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).toBeTruthy(); + }); + + 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')).toBe(1); + expect(+target.select('.c3-circle-1').style('opacity')).toBe(0); + expect(+target.select('.c3-circle-2').style('opacity')).toBe(1); + 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).toBeTruthy(); + }); + + 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')).toBe(0.5); + expect(+target.select('.c3-circle-1').style('opacity')).toBe(0); + expect(+target.select('.c3-circle-2').style('opacity')).toBe(0.5); + done(); + }, 500); + }); + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/tooltip-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/tooltip-spec.js new file mode 100644 index 0000000..de3983f --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/tooltip-spec.js @@ -0,0 +1,101 @@ +describe('c3 chart tooltip', function () { + 'use strict'; + + 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).toBe(topExpected); + expect(left).toBeGreaterThan(leftExpected); + }); + + }); + + describe('with left margin', function () { + + it('should set left margin', function () { + d3.select('#chart').style('margin-left', '300px'); + expect(true).toBeTruthy(); + }); + + 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).toBe(topExpected); + expect(left).toBeGreaterThan(leftExpected); + }); + + }); + + }); + + describe('tooltip positionFunction', function () { + var topExpected = 37, leftExpected = 79; + + beforeAll(function () { + tooltipConfiguration = { + position: function (data, width, height, element) { + expect(data.length).toBe(args().data.columns.length); + expect(data[0]).toEqual(jasmine.objectContaining({ + index: 2, + value: 100, + id: 'data1' + })); + expect(width).toBeGreaterThan(0); + expect(height).toBeGreaterThan(0); + expect(element).toBe(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).toBe(topExpected); + expect(left).toBe(leftExpected); + }); + }); +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/type-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/type-spec.js new file mode 100644 index 0000000..9210d50 --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/type-spec.js @@ -0,0 +1,137 @@ +describe('c3 chart types', function () { + 'use strict'; + + 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).toBeTruthy(); + }); + + it('should return true', function () { + expect(chart.internal.hasArcType()).toBeTruthy(); + }); + + it('should change chart type to "bar"', function () { + args.data.type = 'bar'; + expect(true).toBeTruthy(); + }); + + it('should return false', function () { + expect(chart.internal.hasArcType()).toBeFalsy(); + }); + + }); + + describe('with empty data', function () { + + it('should update args to have empty data', function () { + args = { + data: { + columns: [], + type: 'pie' + } + }; + expect(true).toBeTruthy(); + }); + + it('should return true', function () { + expect(chart.internal.hasArcType()).toBeTruthy(); + }); + + it('should change chart type to "bar"', function () { + args.data.type = 'bar'; + expect(true).toBeTruthy(); + }); + + it('should return false', function () { + expect(chart.internal.hasArcType()).toBeFalsy(); + }); + + }); + + }); + + 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).toBeTruthy(); + }); + + it('should return true for "pie" type', function () { + expect(chart.internal.hasType('pie')).toBeTruthy(); + }); + + it('should return false for "line" type', function () { + expect(chart.internal.hasType('line')).toBeFalsy(); + }); + + it('should return false for "bar" type', function () { + expect(chart.internal.hasType('bar')).toBeFalsy(); + }); + + it('should unload successfully', function () { + chart.unload([]); + expect(true).toBeTruthy(); + }); + + it('should return true for "pie" type even if no data', function () { + expect(chart.internal.hasType('pie')).toBeTruthy(); + }); + + it('should return false for "line" type even if no data', function () { + expect(chart.internal.hasType('line')).toBeFalsy(); + }); + + it('should return false for "bar" type even if no data', function () { + expect(chart.internal.hasType('bar')).toBeFalsy(); + }); + + it('should change chart type to "bar" successfully', function () { + args.data.type = 'bar'; + expect(true).toBeTruthy(); + }); + + it('should return false for "pie" type even if no data', function () { + expect(chart.internal.hasType('pie')).toBeFalsy(); + }); + + it('should return false for "line" type even if no data', function () { + expect(chart.internal.hasType('line')).toBeFalsy(); + }); + + it('should return true for "bar" type even if no data', function () { + expect(chart.internal.hasType('bar')).toBeTruthy(); + }); + + + }); + +}); diff --git a/web/nms-public.gathering.org/old/speedometer/c3-master/spec/zoom-spec.js b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/zoom-spec.js new file mode 100644 index 0000000..7f1490b --- /dev/null +++ b/web/nms-public.gathering.org/old/speedometer/c3-master/spec/zoom-spec.js @@ -0,0 +1,67 @@ +describe('c3 chart zoom', function () { + 'use strict'; + + 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]).toBe(expectedYDomain[0]); + expect(yDomain[1]).toBe(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]).toBe(yDomain[0]); + expect(subYDomain[1]).toBe(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]).toBe(expectedBrushExtent[0]); + expect(brushExtent[1]).toBe(expectedBrushExtent[1]); + }); + + }); + + }); + +}); |