Skip to content

Commit 1fca6d7

Browse files
committed
use builder test added
1 parent 6ddc1a2 commit 1fca6d7

File tree

2 files changed

+283
-0
lines changed

2 files changed

+283
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import { TestScheduler } from 'rxjs/testing'
2+
import { Controller, useBuilder } from '../../../src'
3+
import { tap } from 'rxjs'
4+
import { act, renderHook, waitFor } from '@testing-library/react'
5+
6+
class TestController extends Controller<number> {
7+
constructor() {
8+
super(0)
9+
}
10+
inc() {
11+
this.emit(this.state + 1)
12+
}
13+
protected compareState(): boolean {
14+
return false
15+
}
16+
reEmit() {
17+
this.emit(this.state)
18+
}
19+
}
20+
21+
it('emit object values every reEmit', () => {
22+
const testScheduler = new TestScheduler((actual, expected) => {
23+
return expect(actual).toEqual(expected)
24+
})
25+
const testController = new TestController()
26+
const triggerMarbles = '-aaaa'
27+
const triggerValues = {
28+
a: () => testController.reEmit(),
29+
}
30+
31+
const expectedMarbles = '-aaaa'
32+
const expectedValues = {
33+
a: 0,
34+
}
35+
const eventObservable = testController.observable.pipe()
36+
testScheduler.run(({ expectObservable, cold }) => {
37+
expectObservable(eventObservable).toBe(expectedMarbles, expectedValues)
38+
expectObservable(cold(triggerMarbles, triggerValues).pipe(tap((fn) => fn())))
39+
})
40+
})
41+
42+
it('buildWhen respected', (done) => {
43+
const buildWhenFn = jest.fn((prev, curr) => prev === curr)
44+
const instance = new TestController()
45+
const { result } = renderHook(() => useBuilder(instance, buildWhenFn))
46+
instance.inc()
47+
instance.inc()
48+
instance.inc()
49+
instance.inc()
50+
instance.inc()
51+
expect(buildWhenFn).toHaveBeenCalledTimes(5)
52+
expect(buildWhenFn.mock.calls[0][0]).toBe(0)
53+
expect(buildWhenFn.mock.calls[0][1]).toBe(1)
54+
expect(buildWhenFn.mock.calls[1][0]).toBe(1)
55+
expect(buildWhenFn.mock.calls[1][1]).toBe(2)
56+
expect(buildWhenFn.mock.calls[2][0]).toBe(2)
57+
expect(buildWhenFn.mock.calls[2][1]).toBe(3)
58+
expect(buildWhenFn.mock.calls[3][0]).toBe(3)
59+
expect(buildWhenFn.mock.calls[3][1]).toBe(4)
60+
expect(buildWhenFn.mock.calls[4][0]).toBe(4)
61+
expect(buildWhenFn.mock.calls[4][1]).toBe(5)
62+
expect(result.current).toBe(0)
63+
done()
64+
})
65+
66+
it('rerender on state changed', async () => {
67+
const instance = new TestController()
68+
const { result } = renderHook(() => {
69+
return useBuilder(instance)
70+
})
71+
expect(result.current).toBe(0)
72+
act(() => {
73+
instance.inc()
74+
instance.inc()
75+
instance.inc()
76+
instance.inc()
77+
instance.inc()
78+
})
79+
await waitFor(() => expect(result.current).toBe(5))
80+
})
81+
82+
it('specified state compare respected', async () => {
83+
const stateCompareFn = jest.fn((prev, curr) => prev !== curr)
84+
const instance = new TestController()
85+
const { result } = renderHook(() => {
86+
return useBuilder(
87+
instance,
88+
() => true,
89+
(prev, curr) => stateCompareFn(prev, curr),
90+
)
91+
})
92+
expect(result.current).toBe(0)
93+
act(() => {
94+
instance.inc()
95+
instance.inc()
96+
instance.inc()
97+
instance.inc()
98+
})
99+
await waitFor(() => {
100+
expect(stateCompareFn).toHaveBeenCalledTimes(4)
101+
expect(stateCompareFn.mock.calls[0][0]).toBe(0)
102+
expect(stateCompareFn.mock.calls[0][1]).toBe(1)
103+
expect(stateCompareFn.mock.calls[1][0]).toBe(0)
104+
expect(stateCompareFn.mock.calls[1][1]).toBe(2)
105+
expect(stateCompareFn.mock.calls[2][0]).toBe(0)
106+
expect(stateCompareFn.mock.calls[2][1]).toBe(3)
107+
expect(stateCompareFn.mock.calls[3][0]).toBe(0)
108+
expect(stateCompareFn.mock.calls[3][1]).toBe(4)
109+
expect(result.current).toBe(0)
110+
})
111+
})
112+
113+
it('useBuilder controller return state', () => {
114+
const instance = new TestController()
115+
const { result } = renderHook(() => useBuilder(instance))
116+
expect(result.current).toBe(0)
117+
})
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import { TestScheduler } from 'rxjs/testing'
2+
import { Controller, ControllerProvider, useBuilder } from '../../../src'
3+
import { act, getByTestId, render, waitFor } from '@testing-library/react'
4+
import { tap } from 'rxjs'
5+
6+
class TestController extends Controller<number> {
7+
constructor(initialValue?: number) {
8+
super(initialValue ?? 0)
9+
}
10+
inc() {
11+
this.emit(this.state + 1)
12+
}
13+
protected compareState(): boolean {
14+
return false
15+
}
16+
reEmit() {
17+
this.emit(this.state)
18+
}
19+
}
20+
21+
it('emit object values every reEmit', () => {
22+
const testScheduler = new TestScheduler((actual, expected) => {
23+
return expect(actual).toEqual(expected)
24+
})
25+
const testController = new TestController()
26+
const triggerMarbles = '-aaaa'
27+
const triggerValues = {
28+
a: () => testController.reEmit(),
29+
}
30+
31+
const expectedMarbles = '-aaaa'
32+
const expectedValues = {
33+
a: 0,
34+
}
35+
const eventObservable = testController.observable.pipe()
36+
testScheduler.run(({ expectObservable, cold }) => {
37+
expectObservable(eventObservable).toBe(expectedMarbles, expectedValues)
38+
expectObservable(cold(triggerMarbles, triggerValues).pipe(tap((fn) => fn())))
39+
})
40+
})
41+
42+
type DisplayRenderedProps = {
43+
buildWhen?: (prev: number, curr: number) => boolean
44+
stateComp?: (prev: number, curr: number) => boolean
45+
}
46+
const DisplayRendered = ({ buildWhen, stateComp }: DisplayRenderedProps) => {
47+
const [state, controller] = useBuilder(TestController, buildWhen, stateComp)
48+
console.log(controller)
49+
return (
50+
<>
51+
<h1 data-testid='text'>{state}</h1>
52+
<h1 data-testid='controller'>{controller.constructor.name}</h1>
53+
</>
54+
)
55+
}
56+
57+
it('buildWhen respected', (done) => {
58+
const buildWhenFn = jest.fn((prev, curr) => prev === curr)
59+
const instance = new TestController()
60+
const { container } = render(
61+
<ControllerProvider ctor={TestController} source={instance}>
62+
<DisplayRendered buildWhen={buildWhenFn} />
63+
</ControllerProvider>,
64+
)
65+
instance.inc()
66+
instance.inc()
67+
instance.inc()
68+
instance.inc()
69+
instance.inc()
70+
expect(buildWhenFn).toHaveBeenCalledTimes(5)
71+
expect(buildWhenFn.mock.calls[0][0]).toBe(0)
72+
expect(buildWhenFn.mock.calls[0][1]).toBe(1)
73+
expect(buildWhenFn.mock.calls[1][0]).toBe(1)
74+
expect(buildWhenFn.mock.calls[1][1]).toBe(2)
75+
expect(buildWhenFn.mock.calls[2][0]).toBe(2)
76+
expect(buildWhenFn.mock.calls[2][1]).toBe(3)
77+
expect(buildWhenFn.mock.calls[3][0]).toBe(3)
78+
expect(buildWhenFn.mock.calls[3][1]).toBe(4)
79+
expect(buildWhenFn.mock.calls[4][0]).toBe(4)
80+
expect(buildWhenFn.mock.calls[4][1]).toBe(5)
81+
const rendered = getByTestId(container, 'text')
82+
const renderedText = rendered.textContent
83+
const expectedText = '0'
84+
expect(renderedText).toBe(expectedText)
85+
done()
86+
})
87+
88+
it('rerender on state changed', async () => {
89+
const instance = new TestController()
90+
const { container } = render(
91+
<ControllerProvider ctor={TestController} source={instance}>
92+
<DisplayRendered />
93+
</ControllerProvider>,
94+
)
95+
const rendered = getByTestId(container, 'text')
96+
const renderedText = rendered.textContent
97+
const expectedText = '0'
98+
expect(renderedText).toBe(expectedText)
99+
act(() => {
100+
instance.inc()
101+
instance.inc()
102+
instance.inc()
103+
instance.inc()
104+
instance.inc()
105+
})
106+
await waitFor(() => {
107+
const rendered = getByTestId(container, 'text')
108+
const renderedText = rendered.textContent
109+
const expectedText = '5'
110+
expect(renderedText).toBe(expectedText)
111+
})
112+
})
113+
114+
it('specified state compare respected', async () => {
115+
const stateCompareFn = jest.fn((prev, curr) => prev !== curr)
116+
const instance = new TestController()
117+
const { container } = render(
118+
<ControllerProvider ctor={TestController} source={instance}>
119+
<DisplayRendered stateComp={stateCompareFn} />
120+
</ControllerProvider>,
121+
)
122+
const rendered = getByTestId(container, 'text')
123+
const renderedText = rendered.textContent
124+
const expectedText = '0'
125+
expect(renderedText).toBe(expectedText)
126+
127+
act(() => {
128+
instance.inc()
129+
instance.inc()
130+
instance.inc()
131+
instance.inc()
132+
})
133+
await waitFor(() => {
134+
expect(stateCompareFn).toHaveBeenCalledTimes(4)
135+
expect(stateCompareFn.mock.calls[0][0]).toBe(0)
136+
expect(stateCompareFn.mock.calls[0][1]).toBe(1)
137+
expect(stateCompareFn.mock.calls[1][0]).toBe(0)
138+
expect(stateCompareFn.mock.calls[1][1]).toBe(2)
139+
expect(stateCompareFn.mock.calls[2][0]).toBe(0)
140+
expect(stateCompareFn.mock.calls[2][1]).toBe(3)
141+
expect(stateCompareFn.mock.calls[3][0]).toBe(0)
142+
expect(stateCompareFn.mock.calls[3][1]).toBe(4)
143+
const rendered = getByTestId(container, 'text')
144+
const renderedText = rendered.textContent
145+
const expectedText = '0'
146+
expect(renderedText).toBe(expectedText)
147+
})
148+
})
149+
150+
it('useBuilder cto return [state, controller]', () => {
151+
const instance = new TestController(5)
152+
const { container } = render(
153+
<ControllerProvider ctor={TestController} source={instance}>
154+
<DisplayRendered />
155+
</ControllerProvider>,
156+
)
157+
const renderedCount = getByTestId(container, 'text')
158+
const renderedText = renderedCount.textContent
159+
const expectedText = '5'
160+
expect(renderedText).toBe(expectedText)
161+
162+
const renderedController = getByTestId(container, 'controller')
163+
const renderedControllerText = renderedController.textContent
164+
const expectedControllerText = 'TestController'
165+
expect(renderedControllerText).toBe(expectedControllerText)
166+
})

0 commit comments

Comments
 (0)