UNPKG

@d3fc/d3fc-discontinuous-scale

Version:

A D3 scale that supports domains that are not continuous, allowing 'breaks' in the scale, for example skipping weekends for a date scale.

99 lines (81 loc) 4.16 kB
import discontinuityRange from '../../src/discontinuity/range'; describe('discontinuityRange', () => { describe('clampUp', () => { it('should do nothing if no ranges are provided', () => { expect(discontinuityRange().clampUp(10)).toEqual(10); }); it('should clamp up if the number falls within a discontinuity', () => { expect(discontinuityRange([0, 10]).clampUp(5)).toEqual(10); expect(discontinuityRange([0, 10], [20, 30]).clampUp(25)).toEqual(30); expect(discontinuityRange([-10, 10], [20, 30]).clampUp(0)).toEqual(10); }); it('should not clamp up at the boundary of a discontinuity', () => { expect(discontinuityRange([0, 10]).clampUp(0)).toEqual(0); }); }); describe('clampDown', () => { it('should do nothing if no ranges are provided', () => { expect(discontinuityRange().clampDown(10)).toEqual(10); }); it('should clamp down if the number falls within a discontinuity', () => { expect(discontinuityRange([0, 10]).clampDown(5)).toEqual(0); expect(discontinuityRange([0, 10], [20, 30]).clampDown(25)).toEqual(20); expect(discontinuityRange([-10, 10], [20, 30]).clampDown(0)).toEqual(-10); }); it('should not clamp down at the boundary of a discontinuity', () => { expect(discontinuityRange([0, 10]).clampDown(10)).toEqual(10); }); }); describe('distance', () => { it('should do nothing if no ranges are provided', () => { expect(discontinuityRange().distance(10, 20)).toEqual(10); }); it('should remove discontinuities', () => { expect(discontinuityRange([0, 10]).distance(0, 20)).toEqual(10); expect(discontinuityRange([0, 10]).distance(5, 20)).toEqual(10); expect(discontinuityRange([0, 10], [10, 20]).distance(0, 30)).toEqual(10); expect(discontinuityRange([0, 10], [20, 30]).distance(0, 30)).toEqual(10); }); }); it('should support copy operations', () => { const original = discontinuityRange([5, 10], [20, 30]); expect(original.offset(0, 40)).toEqual(55); const copy = original.copy(); expect(copy.offset(0, 40)).toEqual(55); }); const millisPerDay = 24 * 3600 * 1000; it('should support dates', () => { var start = new Date(2015, 0, 9); var end = new Date(2015, 0, 10); const range = discontinuityRange([start, end]); expect(range.distance(new Date(2015, 0, 8), new Date(2015, 0, 11))).toEqual(millisPerDay * 2); expect(range.offset(new Date(2015, 0, 8), millisPerDay * 2)).toEqual(new Date(2015, 0, 11)); }); describe('offset', () => { it('should simply offset if no ranges are provided', () => { expect(discontinuityRange().offset(10, 5)).toEqual(15); expect(discontinuityRange().offset(-10, 50)).toEqual(40); expect(discontinuityRange().offset(10, -5)).toEqual(5); }); it('should offset with discontinuities', () => { // before discontinuity expect(discontinuityRange([5, 10]).offset(4, 2)).toEqual(11); // within discontinuity expect(discontinuityRange([5, 10]).offset(7, 2)).toEqual(12); // after discontinuity expect(discontinuityRange([5, 10]).offset(17, 2)).toEqual(19); // multiple discontinuities expect(discontinuityRange([5, 10], [20, 30]).offset(0, 40)).toEqual(55); }); it('should allow negative offsets with discontinuities', () => { // before discontinuity expect(discontinuityRange([5, 10]).offset(11, -2)).toEqual(4); // within discontinuity expect(discontinuityRange([5, 10]).offset(7, -2)).toEqual(3); // after discontinuity expect(discontinuityRange([5, 10]).offset(2, -2)).toEqual(0); // multiple discontinuities expect(discontinuityRange([5, 10], [20, 30]).offset(55, -40)).toEqual(0); }); }); });