Added tests for brush on different axis classes

This required some refactoring of the original brush code.
Scale contains a generic.
Brush can take up to three generics.
This commit is contained in:
Matthias Jobst
2017-12-01 13:17:06 +01:00
parent eb30cc3907
commit 7be1d3666c
2 changed files with 55 additions and 20 deletions

View File

@@ -2720,3 +2720,34 @@ function testEnterSizeEmpty() {
selectionSize = newNodes.size();
}
// Example from Matthias Jobst http://github.com/MatthiasJobst
// Checks the brush with different Axis types
class BrushAxisTest {
brush: d3.svg.Brush<any,Date,Date>;
constructor() {
let scale = d3.time.scale<Date,Date>();
this.brush = d3.svg.brush<any,Date>()
.x(scale) // the x accessor accepts time scales
.y(scale); // as does y
}
brushes = () => {
let extent = this.brush.extent();
let brush = d3.svg.brush();
brush.x(d3.scale.linear()); // Linear scale
brush.y(d3.scale.log()); // Logarithmic scale
// Does not work:
// brush.extent(this.brush.extent());
// From https://github.com/d3/d3-3.x-api-reference/blob/master/Ordinal-Scales.md#ordinal_rangePoints
let ordinalScale = d3.scale.ordinal<number,number>()
.domain([1, 2, 3, 4])
.rangePoints([0, 100]);
let ordinalBrush = d3.svg.brush()
.x(ordinalScale) // Ordinal scale
.y(d3.scale.linear());
let colorScale = d3.scale.category10();
let colorBrush = d3.svg.brush<any,string,number>()
.x(colorScale) // Color scale
.y(d3.scale.pow());
}
}

View File

@@ -2581,40 +2581,44 @@ declare namespace d3 {
tickFormat(format: string): Axis;
}
export function brush(): Brush<any>;
export function brush<T>(): Brush<T>;
export function brush(): Brush<any, number, number>;
export function brush<T>(): Brush<T, number, number>;
export function brush<T,X>(): Brush<T, X, X>;
export function brush<T, X, Y>(): Brush<T, X, Y>;
namespace brush {
interface Scale {
domain(): number[] | Date[];
domain(domain: number[] | Date[]): Scale;
interface Scale<S> {
domain(): S[];
domain(domain: S[]): Scale<S>;
range(): number[] | Date[];
range(range: number[] | Date[]): Scale;
range(): S[];
range(range: number[]): Scale<S>;
invert?(y: number | Date): number | Date;
invert?(y: number): S;
}
}
interface Brush<T> {
interface Brush<T, X, Y> {
(selection: Selection<T>): void;
(selection: Transition<T>): void;
event(selection: Selection<T>): void;
event(selection: Transition<T>): void;
x(): brush.Scale;
x(x: brush.Scale): Brush<T>;
x(): brush.Scale<X>;
x(x: brush.Scale<X>): Brush<T, X, Y>;
x<A, B extends X>(x: d3.scale.Ordinal<A, B> | d3.time.Scale<A, B>): Brush<T, X, Y>;
y(): brush.Scale;
y(y: brush.Scale): Brush<T>;
y(): brush.Scale<Y>;
y(y: brush.Scale<Y>): Brush<T, X, Y>;
y<A, B extends Y>(x: d3.scale.Ordinal<A, B> | d3.time.Scale<A, B>): Brush<T, X, Y>;
// https://github.com/d3/d3-3.x-api-reference/blob/master/SVG-Controls.md#brush_extent
extent(): [number, number] | [[number, number], [number, number]] | [Date, Date] | [[Date, Date],[Date,Date]];
extent(extent: [number, number] | [[number, number], [number, number]] | [Date, Date] | [[Date, Date], [Date, Date]]): Brush<T>;
extent(): [X, X] | [Y, Y] | [[X, Y], [X, Y]] | null;
extent(extent: [X, X] | [Y, Y] | [[X, Y], [X, Y]]): Brush<T, X, Y>;
clamp(): boolean | [boolean, boolean];
clamp(clamp: boolean | [boolean, boolean]): Brush<T>;
clamp(clamp: boolean | [boolean, boolean]): Brush<T, X, Y>;
clear(): void;
@@ -2625,10 +2629,10 @@ declare namespace d3 {
on(type: 'brushend'): (datum: T, index: number) => void;
on(type: string): (datum: T, index: number) => void;
on(type: 'brushstart', listener: (datum: T, index: number) => void): Brush<T>;
on(type: 'brush', listener: (datum: T, index: number) => void): Brush<T>;
on(type: 'brushend', listener: (datum: T, index: number) => void): Brush<T>;
on(type: string, listener: (datum: T, index: number) => void): Brush<T>;
on(type: 'brushstart', listener: (datum: T, index: number) => void): Brush<T, X, Y>;
on(type: 'brush', listener: (datum: T, index: number) => void): Brush<T, X ,Y>;
on(type: 'brushend', listener: (datum: T, index: number) => void): Brush<T, X, Y>;
on(type: string, listener: (datum: T, index: number) => void): Brush<T, X, Y>;
}
}