/** * Typescript definition tests for d3/d3-axis module * * Note: These tests are intended to test the definitions only * in the sense of typing and call signature consistency. They * are not intended as functional tests. */ import * as d3Axis from 'd3-axis'; import { scaleBand, ScaleBand, scaleLinear, ScaleLinear, scaleOrdinal, ScaleOrdinal, scalePoint, ScalePoint, scalePow, ScalePower, scaleTime, ScaleTime } from 'd3-scale'; import { select, Selection } from 'd3-selection'; import { Transition } from 'd3-transition'; import { timeMinute } from 'd3-time'; import { format } from 'd3-format'; // -------------------------------------------------------------------------- // Preparatory Steps // -------------------------------------------------------------------------- let num: number; let axisScaleNumber: d3Axis.AxisScale; let axisScaleDate: d3Axis.AxisScale; let axisScaleString: d3Axis.AxisScale; // -------------------------------------------------------------------------- // Test AxisScale Helper Interface // -------------------------------------------------------------------------- axisScaleNumber = scaleLinear(); axisScaleDate = scaleTime(); axisScaleString = scaleOrdinal(); axisScaleNumber = scaleBand(); axisScaleNumber = scalePoint(); axisScaleString = scaleBand(); axisScaleString = scalePoint(); // -------------------------------------------------------------------------- // Test AxisContainerElement // -------------------------------------------------------------------------- let containerElement: d3Axis.AxisContainerElement; const svg: SVGSVGElement = select('svg').node() !; // mock const g: SVGGElement = select('g').node() !; // mock const canvas: HTMLCanvasElement = select('canvas').node() !; // mock containerElement = svg; containerElement = g; // containerElement = canvas; // fails, incompatible type // -------------------------------------------------------------------------- // Test Axis Generators // -------------------------------------------------------------------------- let topAxis: d3Axis.Axis = d3Axis.axisTop(scaleLinear()); let rightAxis: d3Axis.Axis = d3Axis.axisRight(scaleTime()); let bottomAxis: d3Axis.Axis = d3Axis.axisBottom(scaleOrdinal()); let leftAxis: d3Axis.Axis = d3Axis.axisLeft(scaleLinear()); // -------------------------------------------------------------------------- // Test Configure Axis // -------------------------------------------------------------------------- // scale(...) ---------------------------------------------------------------- leftAxis = leftAxis.scale(scalePow()); const powerScale: ScalePower = leftAxis.scale>(); // powerScale = leftAxis.scale(); // fails, without casting as AxisScale is purposely generic bottomAxis = bottomAxis.scale(scaleOrdinal()); // bottomAxis = bottomAxis.scale(scalePow()) // fails, domain of scale incompatible with domain of axis const axisScale: d3Axis.AxisScale = bottomAxis.scale(); const ordinalScale: ScaleOrdinal = bottomAxis.scale>(); // ordinalScale = bottomAxis.scale(); // fails, without casting as AxisScale is purposely generic // ticks(...) ---------------------------------------------------------------- topAxis = topAxis.ticks(20, ',f'); rightAxis = rightAxis.ticks(timeMinute.every(5)); // tickArguments(...) ---------------------------------------------------------------- topAxis = topAxis.tickArguments([20, 's']); rightAxis = rightAxis.tickArguments([timeMinute.every(5)]); const tickArguments: any[] = leftAxis.tickArguments(); // tickValues(...) ---------------------------------------------------------------- topAxis = topAxis.tickValues([1, 3, 5, 7]); bottomAxis = bottomAxis.tickValues(['strongly negative', 'strongly positive']); leftAxis = leftAxis.tickValues(null); const tickValues: Date[] | null = rightAxis.tickValues(); // tickFormat(...) ---------------------------------------------------------------- topAxis = topAxis.tickFormat(format(',.0f')); topAxis = topAxis.tickFormat(null); const formatFn: ((domainValue: string, index: number) => string) | null = bottomAxis.tickFormat(); bottomAxis.tickFormat((d, i) => '#' + i); bottomAxis.tickFormat(d => d + '!'); // tickSize(...) ---------------------------------------------------------------- rightAxis = rightAxis.tickSize(5); num = rightAxis.tickSize(); // tickSizeInner(...) ---------------------------------------------------------------- rightAxis = rightAxis.tickSizeInner(3); num = rightAxis.tickSizeInner(); // tickSizeOuter(...) ---------------------------------------------------------------- rightAxis = rightAxis.tickSizeOuter(4); num = rightAxis.tickSizeOuter(); // tickPadding(...) ---------------------------------------------------------------- rightAxis = rightAxis.tickPadding(5); num = rightAxis.tickPadding(); // -------------------------------------------------------------------------- // Test Apply Axis // -------------------------------------------------------------------------- const gSelection: Selection = select('g'); const gTransition = gSelection.transition(); gSelection.call(topAxis); gTransition.call(topAxis); const svgSelection: Selection = select('g'); const svgTransition = svgSelection.transition(); svgSelection.call(leftAxis); svgTransition.call(leftAxis); const canvasSelection: Selection = select('canvas'); const canvasTransition = canvasSelection.transition(); // canvasSelection.call(rightAxis); // fails, incompatible context container element // canvasTransition.call(rightAxis); // fails, incompatible context container element