@v4fire/core
Version:
V4Fire core library
282 lines (222 loc) • 9.36 kB
JavaScript
/*!
* V4Fire Core
* https://github.com/V4Fire/Core
*
* Released under the MIT license
* https://github.com/V4Fire/Core/blob/master/LICENSE
*/
import Range from 'core/range';
describe('core/range', () => {
it('number range', () => {
expect(new Range(0, 3).toArray()).toEqual([0, 1, 2, 3]);
});
it('number range without including of bounds', () => {
expect(new Range([0], [3]).toArray()).toEqual([1, 2]);
});
it('reversed number range', () => {
expect(new Range(3, 0).toArray()).toEqual([3, 2, 1, 0]);
});
it('reversed number range without including of bounds', () => {
expect(new Range([3], [0]).toArray()).toEqual([2, 1]);
});
it('string range', () => {
expect(new Range('a', 'e').toArray()).toEqual(['a', 'b', 'c', 'd', 'e']);
expect(new Range('a', 'e'.codePointAt(0) - 2).toArray()).toEqual(['a', 'b', 'c']);
expect(new Range('a'.codePointAt(0) + 2, 'e').toArray()).toEqual(['c', 'd', 'e']);
});
it('string range without including of bounds', () => {
expect(new Range(['a'], ['e']).toArray()).toEqual(['b', 'c', 'd']);
});
it('string range (extended Unicode)', () => {
expect(new Range('😁', '😅').toArray()).toEqual(['😁', '😂', '😃', '😄', '😅']);
expect(new Range('😁', '😅'.codePointAt(0) - 2).toArray()).toEqual(['😁', '😂', '😃']);
});
it('string range (extended Unicode) without including of bounds', () => {
expect(new Range(['😁'], ['😅']).toArray()).toEqual(['😂', '😃', '😄']);
});
it('reversed string range', () => {
expect(new Range('e', 'a').toArray()).toEqual(['e', 'd', 'c', 'b', 'a']);
});
it('reversed string range without including of bounds', () => {
expect(new Range(['e'], ['a']).toArray()).toEqual(['d', 'c', 'b']);
});
it('date range', () => {
expect(new Range(Date.create('today'), Date.create('tomorrow')).toArray((12).hours())).toEqual([
Date.create('today'),
Date.create('today').set({hours: 12}),
Date.create('tomorrow')
]);
});
it('date range without including of bounds', () => {
expect(new Range([Date.create('today')], [Date.create('tomorrow')]).toArray((12).hours())).toEqual([
Date.create('today').set({milliseconds: 1}),
Date.create('today').set({milliseconds: 1, hours: 12})
]);
});
it('reversed date range', () => {
expect(new Range(Date.create('tomorrow'), Date.create('today')).toArray((12).hours())).toEqual([
Date.create('tomorrow'),
Date.create('today').set({hours: 12}),
Date.create('today')
]);
});
it('reversed date range without including of bounds', () => {
expect(new Range([Date.create('tomorrow')], [Date.create('today')]).toArray((12).hours())).toEqual([
Date.create('today').endOfDay(),
Date.create('today').add({milliseconds: -1, hours: 12})
]);
});
it('`span`', () => {
expect(new Range(0, 3).span()).toBe(4);
expect(new Range(0).span()).toBe(Infinity);
expect(new Range(3, 0).span()).toBe(4);
expect(new Range('a', 'd').span()).toBe(4);
expect(new Range(new Date(), new Date().add({milliseconds: 3})).span()).toBeGreaterThanOrEqual(4);
});
it('infinity ranges', () => {
expect(new Range().span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range().toString()).toBe('..');
expect(new Range().contains(-10)).toBe(true);
expect(() => new Range().toArray())
.toThrowError("Can't create an array of the infinitive range. Use an iterator instead.");
expect(new Range(0).span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range(0).toString()).toBe('0..');
expect(new Range(0).contains(-10)).toBe(false);
expect(new Range(0).contains(10)).toBe(true);
expect(new Range(0).contains(0)).toBe(true);
expect(new Range([0]).contains(0)).toBe(false);
expect(new Range(null, 0).span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range(-Infinity, 0).toString()).toBe('..0');
expect(new Range(null, 0).contains(-10)).toBe(true);
expect(new Range(null, 0).contains(10)).toBe(false);
expect(new Range(null, 0).contains(0)).toBe(true);
expect(new Range(null, [0]).contains(0)).toBe(false);
expect(new Range(new Date()).span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range('a').span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range('a').toString()).toBe('a..');
expect(new Range('a').contains('0')).toBe(false);
expect(new Range('a').contains('c')).toBe(true);
expect(new Range('a').contains('a')).toBe(true);
expect(new Range(['a']).contains('a')).toBe(false);
expect(new Range(null, 'a').span()).toBe(Number.POSITIVE_INFINITY);
expect(new Range(-Infinity, 'a').toString()).toBe('..a');
expect(new Range(null, 'a').contains('0')).toBe(true);
expect(new Range(null, 'a').contains('c')).toBe(false);
expect(new Range(null, 'a').contains('a')).toBe(true);
expect(new Range(null, ['a']).contains('a')).toBe(false);
});
it('`clamp`', () => {
expect(new Range(0, 3).clamp(2)).toBe(2);
expect(new Range(0, 3).clamp(20)).toBe(3);
expect(new Range(0, 3).clamp(-20)).toBe(0);
expect(new Range(0).clamp(20)).toBe(20);
expect(new Range(null, 3).clamp(-20)).toBe(-20);
expect(new Range(0).clamp(20)).toBe(20);
expect(new Range(40, 10).clamp(20)).toBe(20);
expect(new Range(40, 10).clamp(0)).toBe(10);
});
it('checking of containment', () => {
expect(new Range(0, 3).contains(1)).toBe(true);
expect(new Range(0, 3).contains(10)).toBe(false);
expect(new Range(0).contains(10)).toBe(true);
expect(new Range(1, 10).contains(new Range(4, 6))).toBe(true);
expect(new Range(1, 10).contains(new Range(4, 12))).toBe(false);
expect(new Range(1).contains(new Range(4, 6))).toBe(true);
expect(new Range(1, 10).contains(new Range(4))).toBe(false);
expect(new Range(1, 10).contains(new Range('a', 'z'))).toBe(false);
expect(new Range('a', 'd').contains('b')).toBe(true);
expect(new Range('a', 'd').contains('z')).toBe(false);
});
it('`intersection`', () => {
expect(new Range(0, 3).intersect(new Range(2, 10)).toArray())
.toEqual([2, 3]);
expect(new Range(5, -2).intersect(new Range(2, 10)).toArray())
.toEqual([5, 4, 3, 2]);
expect(new Range(-2, 5).intersect(new Range(10, 2)).toArray())
.toEqual([2, 3, 4, 5]);
expect(new Range(-1, 1).intersect(new Range(1, 2)).toArray())
.toEqual([1]);
expect(new Range(-1, 1).intersect(new Range([1], 2)).toArray())
.toEqual([]);
expect(new Range(1).intersect(new Range([1], 3)).toArray())
.toEqual([2, 3]);
expect(new Range(1, 10000).intersect(new Range('a', 'z')).toArray())
.toEqual([]);
});
it('`union`', () => {
expect(new Range(0, 3).union(new Range(2, 4)).toArray())
.toEqual([0, 1, 2, 3, 4]);
expect(new Range(5, -2).union(new Range(2, 3)).toArray())
.toEqual([5, 4, 3, 2, 1, 0, -1, -2]);
expect(new Range(-2, 5).union(new Range(3, 2)).toArray())
.toEqual([-2, -1, 0, 1, 2, 3, 4, 5]);
expect(new Range([-2], [5]).union(new Range(3, 2)).toArray())
.toEqual([-1, 0, 1, 2, 3, 4]);
expect(new Range(2).union(new Range(3, 2)).toString())
.toBe('2..');
expect(new Range(1, 10000).union(new Range('a', 'z')).toArray())
.toEqual([]);
});
it('`clone`', () => {
const r = new Range(0, 1);
expect(r.clone()).not.toBe(r);
expect(r.clone().toArray()).toEqual(r.toArray());
expect(new Range(0, [0]).clone().toArray()).toEqual([]);
});
it('`reverse`', () => {
const r = new Range(0, [3]);
expect(r.reverse()).not.toBe(r);
expect(r.reverse().toArray()).toEqual(r.toArray().reverse());
expect(new Range(0, [0]).reverse().toArray()).toEqual([]);
});
it('`isValid`', () => {
expect(new Range(0, 2).isValid()).toBe(true);
expect(new Range(0, '2').isValid()).toBe(true);
expect(new Range(0, 'a').isValid()).toBe(true);
expect(new Range(new Date(), new Date('foo')).isValid()).toBe(false);
});
it('`toString`', () => {
expect(new Range(0, 10).toString()).toBe('0..10');
expect(new Range(10, 0).toString()).toBe('10..0');
expect(new Range(0, 0).toString()).toBe('0..0');
expect(new Range(0, [0]).toString()).toBe('');
expect(new Range([0], 0).toString()).toBe('');
expect(new Range('a', 'd').toString()).toBe('a..d');
expect(new Range(['a'], 'd').toString()).toBe('b..d');
expect(new Range('a').toString()).toBe('a..');
expect(new Range(null, 'a').toString()).toBe('..a');
});
it('`toArray`', () => {
expect(new Range(0, 2).toArray()).toEqual([0, 1, 2]);
expect(new Range(2, 0).toArray()).toEqual([2, 1, 0]);
expect(new Range('a', 'd').toArray()).toEqual(['a', 'b', 'c', 'd']);
expect(new Range('d', 'a').toArray()).toEqual(['d', 'c', 'b', 'a']);
});
it('default iterator', () => {
const
r = new Range(0, 2);
expect(r[Symbol.iterator]().next()).toEqual({value: 0, done: false});
expect([...r]).toEqual([0, 1, 2]);
});
it('`values`', () => {
const
r = new Range(0, 4);
expect([...r.values()]).toEqual([0, 1, 2, 3, 4]);
expect([...r.values(2)]).toEqual([0, 2, 4]);
expect([...r.values(3)]).toEqual([0, 3]);
});
it('`entries`', () => {
const
r = new Range([4], 0);
expect([...r.entries()]).toEqual([[0, 3], [1, 2], [2, 1], [3, 0]]);
expect([...r.entries(2)]).toEqual([[0, 3], [1, 1]]);
expect([...r.entries(3)]).toEqual([[0, 3], [1, 0]]);
});
it('`indices`', () => {
const
r = new Range([4], [0]);
expect([...r.indices()]).toEqual([0, 1, 2]);
expect([...r.indices(2)]).toEqual([0, 1]);
expect([...r.indices(3)]).toEqual([0]);
});
});