Skip to content

Commit 770fd0a

Browse files
[v9] chore(tests): cleanup test config, harden previous renderer tests (#2491)
1 parent e440d08 commit 770fd0a

20 files changed

+303
-761
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
run: yarn run build
3434

3535
- name: Jest run
36-
run: yarn run test
36+
run: yarn run dev && yarn run test
3737

3838
- name: Report Fiber size
3939
run: yarn run analyze-fiber

jest.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ module.exports = {
2222
moduleFileExtensions: ['js', 'ts', 'tsx'],
2323
verbose: false,
2424
testTimeout: 30000,
25-
setupFilesAfterEnv: ['<rootDir>/packages/shared/setupTests.ts', '<rootDir>/packages/fiber/tests/setupTests.ts'],
25+
setupFilesAfterEnv: ['<rootDir>/packages/shared/setupTests.ts'],
2626
}

packages/fiber/__mocks__/expo-file-system.ts

-1
This file was deleted.

packages/fiber/__mocks__/expo-gl.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import * as React from 'react'
2-
import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext'
2+
import type { GLViewProps, ExpoWebGLRenderingContext } from 'expo-gl'
3+
4+
export function GLView({ onContextCreate }: GLViewProps) {
5+
const canvas = React.useMemo(() => Object.assign(document.createElement('canvas'), { width: 1280, height: 800 }), [])
36

4-
export const GLView = ({ onContextCreate }: { onContextCreate: (gl: any) => void }) => {
57
React.useLayoutEffect(() => {
6-
const gl = createWebGLContext({ width: 1280, height: 800 } as HTMLCanvasElement)
7-
onContextCreate(gl)
8-
}, [])
8+
const gl = canvas.getContext('webgl2') as ExpoWebGLRenderingContext
9+
gl.endFrameEXP = () => {}
10+
onContextCreate?.(gl)
11+
}, [canvas, onContextCreate])
912

1013
return null
1114
}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
const mock = {}
2-
export default mock
1+
export default class {
2+
getEventHandlers = () => ({})
3+
reset() {}
4+
}

packages/fiber/__mocks__/react-native/index.ts

+23-20
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,26 @@ import * as React from 'react'
22
import { ViewProps, LayoutChangeEvent } from 'react-native'
33

44
// Mocks a View or container as React sees it
5-
const Container = React.memo(
6-
React.forwardRef(({ onLayout, ...props }: ViewProps, ref) => {
7-
React.useLayoutEffect(() => {
8-
onLayout?.({
9-
nativeEvent: {
10-
layout: {
11-
x: 0,
12-
y: 0,
13-
width: 1280,
14-
height: 800,
15-
},
5+
class NativeContainer extends React.Component<ViewProps> {
6+
componentDidMount(): void {
7+
this.props.onLayout?.({
8+
nativeEvent: {
9+
layout: {
10+
x: 0,
11+
y: 0,
12+
width: 1280,
13+
height: 800,
1614
},
17-
} as LayoutChangeEvent)
15+
},
16+
} as LayoutChangeEvent)
17+
}
1818

19-
ref = { current: { props } }
20-
}, [])
21-
22-
return null
23-
}),
24-
)
19+
render() {
20+
return this.props.children
21+
}
22+
}
2523

26-
export const View = Container
27-
export const Pressable = Container
24+
export const View = NativeContainer
2825

2926
export const StyleSheet = {
3027
absoluteFill: {
@@ -35,3 +32,9 @@ export const StyleSheet = {
3532
bottom: 0,
3633
},
3734
}
35+
36+
export const PixelRatio = {
37+
get() {
38+
return 1
39+
},
40+
}

packages/fiber/tests/native/canvas.test.tsx packages/fiber/tests/canvas.native.test.tsx

+15-20
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,43 @@
11
import * as React from 'react'
22
import { View } from 'react-native'
3-
import { act, create, ReactTestRenderer } from 'react-test-renderer'
4-
5-
import { Canvas } from '../../src/native'
3+
import { create } from 'react-test-renderer'
4+
import { Canvas, act } from '../src/native'
65

76
describe('native Canvas', () => {
87
it('should correctly mount', async () => {
9-
let renderer: ReactTestRenderer = null!
10-
11-
await act(async () => {
12-
renderer = create(
8+
const renderer = await act(async () =>
9+
create(
1310
<Canvas>
1411
<group />
1512
</Canvas>,
16-
)
17-
})
13+
),
14+
)
1815

19-
expect(renderer.toTree()).toMatchSnapshot()
16+
expect(renderer.toJSON()).toMatchSnapshot()
2017
})
2118

2219
it('should forward ref', async () => {
2320
const ref = React.createRef<View>()
2421

25-
await act(async () => {
22+
await act(async () =>
2623
create(
2724
<Canvas ref={ref}>
2825
<group />
2926
</Canvas>,
30-
)
31-
})
27+
),
28+
)
3229

33-
expect(ref.current).toBeDefined()
30+
expect(ref.current).toBeInstanceOf(View)
3431
})
3532

3633
it('should correctly unmount', async () => {
37-
let renderer: ReactTestRenderer = null!
38-
39-
await act(async () => {
40-
renderer = create(
34+
const renderer = await act(async () =>
35+
create(
4136
<Canvas>
4237
<group />
4338
</Canvas>,
44-
)
45-
})
39+
),
40+
)
4641

4742
expect(() => renderer.unmount()).not.toThrow()
4843
})

packages/fiber/tests/web/canvas.test.tsx packages/fiber/tests/canvas.test.tsx

+17-22
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,56 @@
1-
// use default export for jest.spyOn
21
import React from 'react'
3-
import { render, RenderResult } from '@testing-library/react'
4-
5-
import { Canvas, act } from '../../src'
2+
import { render } from '@testing-library/react'
3+
import { Canvas, act } from '../src'
64

75
describe('web Canvas', () => {
86
it('should correctly mount', async () => {
9-
let renderer: RenderResult = null!
10-
11-
await act(async () => {
12-
renderer = render(
7+
const renderer = await act(async () =>
8+
render(
139
<Canvas>
1410
<group />
1511
</Canvas>,
16-
)
17-
})
12+
),
13+
)
1814

1915
expect(renderer.container).toMatchSnapshot()
2016
})
2117

2218
it('should forward ref', async () => {
2319
const ref = React.createRef<HTMLCanvasElement>()
2420

25-
await act(async () => {
21+
await act(async () =>
2622
render(
2723
<Canvas ref={ref}>
2824
<group />
2925
</Canvas>,
30-
)
31-
})
26+
),
27+
)
3228

33-
expect(ref.current).toBeDefined()
29+
expect(ref.current).toBeInstanceOf(HTMLCanvasElement)
3430
})
3531

3632
it('should correctly unmount', async () => {
37-
let renderer: RenderResult = null!
38-
await act(async () => {
39-
renderer = render(
33+
const renderer = await act(async () =>
34+
render(
4035
<Canvas>
4136
<group />
4237
</Canvas>,
43-
)
44-
})
38+
),
39+
)
4540

4641
expect(() => renderer.unmount()).not.toThrow()
4742
})
4843

4944
it('plays nice with react SSR', async () => {
5045
const useLayoutEffect = jest.spyOn(React, 'useLayoutEffect')
5146

52-
await act(async () => {
47+
await act(async () =>
5348
render(
5449
<Canvas>
5550
<group />
5651
</Canvas>,
57-
)
58-
})
52+
),
53+
)
5954

6055
expect(useLayoutEffect).not.toHaveBeenCalled()
6156
})

packages/fiber/tests/core/events.test.tsx packages/fiber/tests/events.test.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as React from 'react'
22
import { render, fireEvent, RenderResult } from '@testing-library/react'
3-
4-
import { Canvas, act } from '../../src'
3+
import { Canvas, act } from '../src'
54

65
const getContainer = () => document.querySelector('canvas')?.parentNode?.parentNode as HTMLDivElement
76

packages/fiber/tests/core/hooks.test.tsx packages/fiber/tests/hooks.test.tsx

+11-76
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,11 @@
11
import * as React from 'react'
22
import * as THREE from 'three'
33
import * as Stdlib from 'three-stdlib'
4-
import { createCanvas } from '@react-three/test-renderer/src/createTestCanvas'
5-
import { createWebGLContext } from '@react-three/test-renderer/src/createWebGLContext'
4+
import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap } from '../src'
65

7-
import { asyncUtils } from '../../../shared/asyncUtils'
8-
9-
import { createRoot, advance, useLoader, act, useThree, useGraph, useFrame, ObjectMap } from '../../src'
10-
11-
const resolvers: (() => void)[] = []
12-
13-
const { waitFor } = asyncUtils(act, (resolver: () => void) => {
14-
resolvers.push(resolver)
15-
})
6+
const root = createRoot(document.createElement('canvas'))
167

178
describe('hooks', () => {
18-
let canvas: HTMLCanvasElement = null!
19-
20-
beforeEach(() => {
21-
canvas = createCanvas({
22-
beforeReturn: (canvas) => {
23-
function getContext(
24-
contextId: '2d',
25-
options?: CanvasRenderingContext2DSettings,
26-
): CanvasRenderingContext2D | null
27-
function getContext(
28-
contextId: 'bitmaprenderer',
29-
options?: ImageBitmapRenderingContextSettings,
30-
): ImageBitmapRenderingContext | null
31-
function getContext(contextId: 'webgl', options?: WebGLContextAttributes): WebGLRenderingContext | null
32-
function getContext(contextId: 'webgl2', options?: WebGLContextAttributes): WebGL2RenderingContext | null
33-
function getContext(contextId: string): RenderingContext | null {
34-
if (contextId === 'webgl' || contextId === 'webgl2') {
35-
return createWebGLContext(canvas)
36-
}
37-
return null
38-
}
39-
40-
canvas.getContext = getContext
41-
},
42-
})
43-
})
44-
459
it('can handle useThree hook', async () => {
4610
let result = {} as {
4711
camera: THREE.Camera
@@ -68,9 +32,7 @@ describe('hooks', () => {
6832
return <group />
6933
}
7034

71-
await act(async () => {
72-
createRoot(canvas).render(<Component />)
73-
})
35+
await act(async () => root.render(<Component />))
7436

7537
expect(result.camera instanceof THREE.Camera).toBeTruthy()
7638
expect(result.scene instanceof THREE.Scene).toBeTruthy()
@@ -96,14 +58,9 @@ describe('hooks', () => {
9658
)
9759
}
9860

99-
let scene: THREE.Scene = null!
100-
await act(
101-
async () =>
102-
(scene = createRoot(canvas)
103-
.configure({ frameloop: 'never' })
104-
.render(<Component />)
105-
.getState().scene),
106-
)
61+
const store = await act(async () => root.configure({ frameloop: 'never' }).render(<Component />))
62+
const { scene } = store.getState()
63+
10764
advance(Date.now())
10865
expect(scene.children[0].position.x).toEqual(1)
10966
expect(frameCalls.length).toBeGreaterThan(0)
@@ -125,18 +82,8 @@ describe('hooks', () => {
12582
return <primitive object={model} />
12683
}
12784

128-
let scene: THREE.Scene = null!
129-
await act(async () => {
130-
scene = createRoot(canvas)
131-
.render(
132-
<React.Suspense fallback={null}>
133-
<Component />
134-
</React.Suspense>,
135-
)
136-
.getState().scene
137-
})
138-
139-
await waitFor(() => expect(scene.children[0]).toBeDefined())
85+
const store = await act(async () => root.render(<Component />))
86+
const { scene } = store.getState()
14087

14188
expect(scene.children[0]).toBe(MockMesh)
14289
})
@@ -183,18 +130,8 @@ describe('hooks', () => {
183130
)
184131
}
185132

186-
let scene: THREE.Scene = null!
187-
await act(async () => {
188-
scene = createRoot(canvas)
189-
.render(
190-
<React.Suspense fallback={null}>
191-
<Component />
192-
</React.Suspense>,
193-
)
194-
.getState().scene
195-
})
196-
197-
await waitFor(() => expect(scene.children[0]).toBeDefined())
133+
const store = await act(async () => root.render(<Component />))
134+
const { scene } = store.getState()
198135

199136
expect(scene.children[0]).toBe(MockMesh)
200137
})
@@ -230,9 +167,7 @@ describe('hooks', () => {
230167
return <mesh />
231168
}
232169

233-
await act(async () => {
234-
createRoot(canvas).render(<Component />)
235-
})
170+
await act(async () => root.render(<Component />))
236171

237172
expect(result).toEqual({
238173
nodes: {

0 commit comments

Comments
 (0)