@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
151 lines (137 loc) • 5.5 kB
JavaScript
import {TaskQueue} from 'aurelia-task-queue';
import {getArrayObserver} from '../src/array-observation';
describe('array observation', () => {
let taskQueue;
beforeAll(() => {
taskQueue = new TaskQueue();
});
it('getArrayObserver should return same observer instance for the same Array instance', () => {
let array = ['foo', 'bar', 'hello', 'world'];
let observer1 = getArrayObserver(taskQueue, array);
let observer2 = getArrayObserver(taskQueue, array);
expect(observer1 === observer2).toBe(true);
});
it('getArrayObserver should return different observer instances for different Array instances', () => {
let array1 = ['foo', 'bar', 'hello', 'world'];
let array2 = ['foo', 'bar', 'hello', 'world'];
let observer1 = getArrayObserver(taskQueue, array1);
let observer2 = getArrayObserver(taskQueue, array2);
expect(observer1 !== observer2).toBe(true);
});
it('pops', () => {
let array = ['foo', 'bar', 'hello', 'world'];
array.pop();
Array.prototype.pop.call(array);
expect(array).toEqual(['foo', 'bar']);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'addChangeRecord');
array.pop();
expect(observer.addChangeRecord).toHaveBeenCalled();
observer.addChangeRecord.calls.reset();
Array.prototype.pop.call(array);
expect(observer.addChangeRecord).toHaveBeenCalled();
expect(array).toEqual([]);
observer.addChangeRecord.calls.reset();
array.pop();
expect(observer.addChangeRecord).not.toHaveBeenCalled();
});
it('pushes', () => {
let array = [];
array.push('foo');
Array.prototype.push.call(array, 'bar');
expect(array).toEqual(['foo', 'bar']);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'addChangeRecord');
array.push('hello');
expect(observer.addChangeRecord).toHaveBeenCalled();
observer.addChangeRecord.calls.reset();
Array.prototype.push.call(array, 'world');
expect(observer.addChangeRecord).toHaveBeenCalled();
expect(array).toEqual(['foo', 'bar', 'hello', 'world']);
});
it('reverses', () => {
let array = [1, 2, 3, 4];
array.reverse();
expect(array).toEqual([4, 3, 2, 1]);
Array.prototype.reverse.call(array);
expect(array).toEqual([1, 2, 3, 4]);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'flushChangeRecords');
spyOn(observer, 'reset');
array.reverse();
expect(array).toEqual([4, 3, 2, 1]);
expect(observer.flushChangeRecords).toHaveBeenCalled();
expect(observer.reset).toHaveBeenCalled();
observer.flushChangeRecords.calls.reset();
observer.reset.calls.reset();
Array.prototype.reverse.call(array);
expect(array).toEqual([1, 2, 3, 4]);
expect(observer.flushChangeRecords).toHaveBeenCalled();
expect(observer.reset).toHaveBeenCalled();
});
it('shifts', () => {
let array = ['foo', 'bar', 'hello', 'world'];
array.shift();
Array.prototype.shift.call(array);
expect(array).toEqual(['hello', 'world']);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'addChangeRecord');
array.shift();
expect(observer.addChangeRecord).toHaveBeenCalled();
observer.addChangeRecord.calls.reset();
Array.prototype.shift.call(array);
expect(observer.addChangeRecord).toHaveBeenCalled();
expect(array).toEqual([]);
observer.addChangeRecord.calls.reset();
array.shift();
expect(observer.addChangeRecord).not.toHaveBeenCalled();
});
it('sorts', () => {
let array = [1, 2, 3, 4];
array.sort((a, b) => b - a);
expect(array).toEqual([4, 3, 2, 1]);
Array.prototype.sort.call(array, (a, b) => a - b);
expect(array).toEqual([1, 2, 3, 4]);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'flushChangeRecords');
spyOn(observer, 'reset');
array.sort((a, b) => b - a);
expect(array).toEqual([4, 3, 2, 1]);
expect(observer.flushChangeRecords).toHaveBeenCalled();
expect(observer.reset).toHaveBeenCalled();
observer.flushChangeRecords.calls.reset();
observer.reset.calls.reset();
Array.prototype.sort.call(array, (a, b) => a - b);
expect(array).toEqual([1, 2, 3, 4]);
expect(observer.flushChangeRecords).toHaveBeenCalled();
expect(observer.reset).toHaveBeenCalled();
});
it('splices', () => {
let array = [1, 2, 3, 4];
array.splice(1, 1, 'hello');
Array.prototype.splice.call(array, 2, 1, 'world');
expect(array).toEqual([1, 'hello', 'world', 4]);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'addChangeRecord');
array.splice(1, 1, 'foo');
expect(observer.addChangeRecord).toHaveBeenCalled();
observer.addChangeRecord.calls.reset();
Array.prototype.splice.call(array, 2, 1, 'bar');
expect(observer.addChangeRecord).toHaveBeenCalled();
expect(array).toEqual([1, 'foo', 'bar', 4]);
});
it('unshifts', () => {
let array = [];
array.unshift('foo');
Array.prototype.unshift.call(array, 'bar');
expect(array).toEqual(['bar', 'foo']);
let observer = getArrayObserver(taskQueue, array);
spyOn(observer, 'addChangeRecord');
array.unshift('hello');
expect(observer.addChangeRecord).toHaveBeenCalled();
observer.addChangeRecord.calls.reset();
Array.prototype.unshift.call(array, 'world');
expect(observer.addChangeRecord).toHaveBeenCalled();
expect(array).toEqual(['world', 'hello', 'bar', 'foo']);
});
});