@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering.
223 lines (193 loc) • 6.47 kB
text/typescript
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: number, b: number) => {
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: number, b: number) => {
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: number, b: number) => {
counter += 1
return a + b
}
const processor = (v: number, hasCache: boolean) => {
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)
})
})
})