UNPKG

interpolated-charts

Version:

Configurable d3 v4 charts with interpolation and missing data range

271 lines (214 loc) 9.65 kB
import { line, chartEvents } from '../../src/charts/line'; import { lineChartData } from '../data/line-chart'; import * as d3 from 'd3'; describe('line chart', () => { let lineChart, div; beforeEach(() => { lineChart = line(); div = document.createElement('div'); div.className = 'chart'; document.body.appendChild(div); d3 .select('.chart') .datum(lineChartData).call(lineChart); }); afterEach(() => { div.remove(); }); describe('render', () => { it('should create svg', () => { const svg = d3 .select(div) .select('.line-chart'); expect(svg.empty()).toBeFalsy(); }); it('should create group countainers', () => { const svg = d3 .select(div) .select('.line-chart'); expect(svg.select('.grid-container').empty()).toBeFalsy(); expect(svg.select('.x-axis-container').empty()).toBeFalsy(); expect(svg.select('.y-axis-container').empty()).toBeFalsy(); expect(svg.select('.data-lines-container').empty()).toBeFalsy(); expect(svg.select('.metadata-container').empty()).toBeFalsy(); }); it('should draw grid', () => { const horizontalGridLine = d3 .select(div) .select('.horizontal-grid-line'); const verticallGridLine = d3 .select(div) .select('.vertical-grid-line'); expect(horizontalGridLine.empty()).toBeFalsy(); expect(verticallGridLine.empty()).toBeFalsy(); }); it('should draw axises', () => { const xAxis = d3 .select(div) .select('.x-axis-container'); const yAxis = d3 .select(div) .select('.y-axis-container'); expect(xAxis.empty()).toBeFalsy(); expect(yAxis.empty()).toBeFalsy(); }); it('should draw chart line for every dataset', () => { const lines = d3 .select(div) .select('.data-lines-container') .selectAll('.line'); const chartDataSetCount = lineChartData.length; expect(lines.size()).toBe(chartDataSetCount); }); }); describe('events', () => { it('should dispatch mousemove', () => { const svg = d3 .select(div) .select('.line-chart'); const callback = jasmine.createSpy('mouseMoveCallback'); lineChart.on(chartEvents.chartMouseMove, callback); svg.dispatch('mousemove'); expect(callback.calls.count()).toBe(1); }); it('should dispatch mouseenter', () => { const svg = d3 .select(div) .select('.line-chart'); const callback = jasmine.createSpy('mouseEnterCallback'); lineChart.on(chartEvents.chartMouseEnter, callback); svg.dispatch('mouseenter'); expect(callback.calls.count()).toBe(1); }); it('should dispatch mouseleave', () => { const svg = d3 .select(div) .select('.line-chart'); const callback = jasmine.createSpy('mouseleaveCallback'); lineChart.on(chartEvents.chartMouseLeave, callback); svg.dispatch('mouseleave'); expect(callback.calls.count()).toBe(1); }); it('should dispatch click', () => { const svg = d3 .select(div) .select('.line-chart'); const callback = jasmine.createSpy('clickCallback'); lineChart.on(chartEvents.chartMouseClick, callback); svg.dispatch('click'); expect(callback.calls.count()).toBe(1); }); }); describe('api', () => { it('should provide width getter and setter', () => { const defaultWidth = lineChart.width(); const testWidth = 900; const setterResult = lineChart.width(testWidth); const newWidth = lineChart.width(); expect(defaultWidth).not.toBe(newWidth); expect(testWidth).toBe(newWidth); expect(setterResult).toBe(lineChart); }); it('should provide height getter and setter', () => { const defaultHeight = lineChart.height(); const testHeight = 550; const setterResult = lineChart.height(testHeight); const newHeight = lineChart.height(); expect(defaultHeight).not.toBe(newHeight); expect(testHeight).toBe(newHeight); expect(setterResult).toBe(lineChart); }); it('should provide margin getter and setter', () => { const defaultMargin = lineChart.margin(); const testMargin = { top: 30, right: 40, bottom: 20, left: 50 }; const setterResult = lineChart.margin(testMargin); const newMargin = lineChart.margin(); expect(defaultMargin).not.toBe(newMargin); expect(testMargin).toBe(newMargin); expect(setterResult).toBe(lineChart); }); it('should provide maxTimeRangeDifferenceToDraw getter and setter', () => { const defaultMaxTimeRangeDifferenceToDraw = lineChart.maxTimeRangeDifferenceToDraw(); const testMaxTimeRangeDifferenceToDraw = 1000 * 60 * 60; const setterResult = lineChart.maxTimeRangeDifferenceToDraw(testMaxTimeRangeDifferenceToDraw); const newMaxTimeRangeDifferenceToDraw = lineChart.maxTimeRangeDifferenceToDraw(); expect(defaultMaxTimeRangeDifferenceToDraw).not.toBe(newMaxTimeRangeDifferenceToDraw); expect(testMaxTimeRangeDifferenceToDraw).toBe(newMaxTimeRangeDifferenceToDraw); expect(setterResult).toBe(lineChart); }); it('should provide yAxisValueFormat getter and setter', () => { const defaultYAxisValueFormat = lineChart.yAxisValueFormat(); const testYAxisValueFormat = value => `${value}°C`; const setterResult = lineChart.yAxisValueFormat(testYAxisValueFormat); const newYAxisValueFormat = lineChart.yAxisValueFormat(); expect(defaultYAxisValueFormat).not.toBe(newYAxisValueFormat); expect(testYAxisValueFormat).toBe(newYAxisValueFormat); expect(setterResult).toBe(lineChart); }); it('should provide xAxisTimeFormat getter and setter', () => { const defaultXAxisTimeFormat = lineChart.xAxisTimeFormat(); const testXAxisTimeFormat = d3.timeFormat('%d-%m %H'); const setterResult = lineChart.xAxisTimeFormat(testXAxisTimeFormat); const newXAxisTimeFormat = lineChart.xAxisTimeFormat(); expect(defaultXAxisTimeFormat).not.toBe(newXAxisTimeFormat); expect(testXAxisTimeFormat).toBe(newXAxisTimeFormat); expect(setterResult).toBe(lineChart); }); it('should provide curve getter and setter', () => { const defaultCurve = lineChart.curve(); const testCurve = d3.curveCatmullRom; const setterResult = lineChart.curve(testCurve); const newCurve = lineChart.curve(); expect(defaultCurve).not.toBe(newCurve); expect(testCurve).toBe(newCurve); expect(setterResult).toBe(lineChart); }); it('should provide interpolationMaxIterationCount getter and setter', () => { const defaultInterpolationMaxIterationCount = lineChart.interpolationMaxIterationCount(); const testInterpolationMaxIterationCount = 10; const setterResult = lineChart.interpolationMaxIterationCount(testInterpolationMaxIterationCount); const newInterpolationMaxIterationCount = lineChart.interpolationMaxIterationCount(); expect(defaultInterpolationMaxIterationCount).not.toBe(newInterpolationMaxIterationCount); expect(testInterpolationMaxIterationCount).toBe(newInterpolationMaxIterationCount); expect(setterResult).toBe(lineChart); }); it('should provide interpolationAccuracy getter and setter', () => { const defaultInterpolationAccuracy = lineChart.interpolationAccuracy(); const testInterpolationAccuracy = 0.01; const setterResult = lineChart.interpolationAccuracy(testInterpolationAccuracy); const newInterpolationAccuracy = lineChart.interpolationAccuracy(); expect(defaultInterpolationAccuracy).not.toBe(newInterpolationAccuracy); expect(testInterpolationAccuracy).toBe(newInterpolationAccuracy); expect(setterResult).toBe(lineChart); }); it('should provide mouseMoveTimeTreshold getter and setter', () => { const defaultMouseMoveTimeTreshold = lineChart.mouseMoveTimeTreshold(); const testMouseMoveTimeTreshold = 100; const setterResult = lineChart.mouseMoveTimeTreshold(testMouseMoveTimeTreshold); const newMouseMoveTimeTreshold = lineChart.mouseMoveTimeTreshold(); expect(defaultMouseMoveTimeTreshold).not.toBe(newMouseMoveTimeTreshold); expect(testMouseMoveTimeTreshold).toBe(newMouseMoveTimeTreshold); expect(setterResult).toBe(lineChart); }); it('should compute chart width', () => { const margin = lineChart.margin(); const width = lineChart.width(); const chartWidth = lineChart.chartWidth(); expect(chartWidth).toBe(width - margin.left - margin.right); }); it('should compute chart height', () => { const margin = lineChart.margin(); const height = lineChart.height(); const chartHeight = lineChart.chartHeight(); expect(chartHeight).toBe(height - margin.top - margin.bottom); }); it('should provide subscription on events', () => { const eventHandler = () => {}; lineChart .on(chartEvents.chartMouseEnter, eventHandler) .on(chartEvents.chartMouseLeave, eventHandler) .on(chartEvents.chartMouseMove, eventHandler) .on(chartEvents.chartMouseClick, eventHandler); }); }); });