/
memoize.spec.ts
95 lines (85 loc) · 2.88 KB
/
memoize.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { Memoize } from './memoize'
describe('memoize', () => {
const sharedHasher = jest.fn((...args: any[]) => args.join(':'))
class Dummy {
_getter = jest.fn(function getter(this: any) {
return this.data.getter
})
_method0 = jest.fn(function method0(this: any) {
return this.data.method0
})
_method1 = jest.fn(function method1(this: any, ...args: any[]) {
return [this.data.method1, ...args].join(':')
})
_method2 = jest.fn(function method2(this: any, ...args: any[]) {
return [this.data.method2, ...args].join(':')
})
constructor(public data: any) {}
@Memoize()
get getter() {
return this._getter()
}
@Memoize()
method0() {
return this._method0()
}
@Memoize()
method1(...args: any[]) {
return this._method1(...args)
}
@Memoize(sharedHasher)
method2(...args: any[]) {
return this._method2(...args)
}
}
let subjectA!: Dummy
let subjectB!: Dummy
beforeEach(() => {
jest.clearAllMocks()
subjectA = new Dummy({
getter: 'getter A',
method0: 'method0 A',
method1: 'method1 A',
method2: 'method2 A',
})
subjectB = new Dummy({
getter: 'getter B',
method0: 'method0 B',
method1: 'method1 B',
method2: 'method2 B',
})
})
it('should remember getter values', () => {
expect(subjectA.getter).toBe('getter A')
expect(subjectA._getter).toHaveBeenCalledTimes(1)
expect(subjectB._getter).toHaveBeenCalledTimes(0)
expect(subjectB.getter).toBe('getter B')
expect(subjectA._getter).toHaveBeenCalledTimes(1)
expect(subjectB._getter).toHaveBeenCalledTimes(1)
expect(subjectA.getter).toBe('getter A')
expect(subjectB.getter).toBe('getter B')
expect(subjectA._getter).toHaveBeenCalledTimes(1)
expect(subjectB._getter).toHaveBeenCalledTimes(1)
})
it('should remember method values with no args', () => {
expect(subjectA.method0()).toBe('method0 A')
expect(subjectA._method0).toHaveBeenCalledTimes(1)
expect(subjectB._method0).toHaveBeenCalledTimes(0)
expect(subjectB.method0()).toBe('method0 B')
expect(subjectA._method0).toHaveBeenCalledTimes(1)
expect(subjectB._method0).toHaveBeenCalledTimes(1)
expect(subjectA.method0()).toBe('method0 A')
expect(subjectB.method0()).toBe('method0 B')
expect(subjectA._method0).toHaveBeenCalledTimes(1)
expect(subjectB._method0).toHaveBeenCalledTimes(1)
})
it('should remember method values with one args', () => {
expect(subjectA.method1('foo')).toBe('method1 A:foo')
expect(subjectA._method1).toHaveBeenCalledTimes(1)
expect(subjectA.method1('bar')).toBe('method1 A:bar')
expect(subjectA._method1).toHaveBeenCalledTimes(2)
expect(subjectA.method1('foo')).toBe('method1 A:foo')
expect(subjectA.method1('bar')).toBe('method1 A:bar')
expect(subjectA._method1).toHaveBeenCalledTimes(2)
})
})