@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering.
194 lines • 7.63 kB
JavaScript
import sinon from 'sinon';
import { FunctionExt } from '.';
describe('FunctionExt', () => {
describe('#call', () => {
it('should invoke function with empty args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.call(spy, ctx);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith()).toBeTruthy();
});
it('should invoke function with one args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.call(spy, ctx, 1);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1)).toBeTruthy();
});
it('should invoke function with two args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.call(spy, ctx, 1, '2');
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2')).toBeTruthy();
});
it('should invoke function with three args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.call(spy, ctx, 1, '2', true);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true)).toBeTruthy();
});
it('should invoke function with four args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
FunctionExt.call(spy, ctx, 1, '2', true, obj);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj)).toBeTruthy();
});
it('should invoke function with five args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
FunctionExt.call(spy, ctx, 1, '2', true, obj, reg);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg)).toBeTruthy();
});
it('should invoke function with six args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
const arr = [1, 2, 3];
FunctionExt.call(spy, ctx, 1, '2', true, obj, reg, arr);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg, arr)).toBeTruthy();
});
it('should invoke function with more args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
const arr = [1, 2, 3];
FunctionExt.call(spy, ctx, 1, '2', true, obj, reg, arr, 'more');
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg, arr, 'more')).toBeTruthy();
});
});
describe('#apply', () => {
it('should invoke function with empty args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.apply(spy, ctx);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith()).toBeTruthy();
});
it('should invoke function with one args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.apply(spy, ctx, [1]);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1)).toBeTruthy();
});
it('should invoke function with two args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.apply(spy, ctx, [1, '2']);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2')).toBeTruthy();
});
it('should invoke function with three args', () => {
const spy = sinon.spy();
const ctx = {};
FunctionExt.apply(spy, ctx, [1, '2', true]);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true)).toBeTruthy();
});
it('should invoke function with four args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
FunctionExt.apply(spy, ctx, [1, '2', true, obj]);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj)).toBeTruthy();
});
it('should invoke function with five args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
FunctionExt.apply(spy, ctx, [1, '2', true, obj, reg]);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg)).toBeTruthy();
});
it('should invoke function with six args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
const arr = [1, 2, 3];
FunctionExt.apply(spy, ctx, [1, '2', true, obj, reg, arr]);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg, arr)).toBeTruthy();
});
it('should invoke function with more args', () => {
const spy = sinon.spy();
const ctx = {};
const obj = {};
const reg = /a/g;
const arr = [1, 2, 3];
FunctionExt.apply(spy, ctx, [1, '2', true, obj, reg, arr, 'more']);
expect(spy.calledOn(ctx)).toBeTruthy();
expect(spy.calledWith(1, '2', true, obj, reg, arr, 'more')).toBeTruthy();
});
});
describe('#cacher', () => {
it('shoule cache function results with same args', () => {
let counter = 0;
const raw = (a, b) => {
counter += 1;
return a + b;
};
const fn = FunctionExt.cacher(raw);
const ret1 = fn(1, 2);
expect(counter).toBe(1);
const ret2 = fn(1, 2);
expect(counter).toBe(1);
expect(ret1).toBe(ret2);
fn(2, 3);
expect(counter).toBe(2);
});
it('shoule remove cache when reach the max cache count', () => {
let counter = 0;
const raw = (a, b) => {
counter += 1;
return a + b;
};
const fn = FunctionExt.cacher(raw);
fn(1, 2);
expect(counter).toBe(1);
for (let i = 0; i < 1000; i += 1) {
fn(i, i);
}
fn(1, 2);
expect(counter).toBe(1002);
});
it('shoule cache function with specified context', () => {
const ctx = {};
const spy = sinon.spy();
const fn = FunctionExt.cacher(spy, ctx);
fn();
expect(spy.calledOn(ctx)).toBeTruthy();
});
it('shoule return result processed by post processor', () => {
let counter = 0;
const raw = (a, b) => {
counter += 1;
return a + b;
};
const processor = (v, hasCache) => {
return hasCache ? -v : v;
};
const fn = FunctionExt.cacher(raw, {}, processor);
const ret1 = fn(1, 2);
const ret2 = fn(1, 2);
expect(counter).toBe(1);
expect(ret1).toBe(3);
expect(ret2).toBe(-3);
});
});
});
//# sourceMappingURL=function.test.js.map