UNPKG

@threlte/core

Version:

A 3D framework for the web, built on top of Svelte and Three.js

46 lines (45 loc) 2.16 kB
import { BufferGeometry, Group, Mesh, MeshBasicMaterial, PerspectiveCamera } from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; import { describe, it, expect, vi } from 'vitest'; import { render } from '@threlte/test'; import { extend, T } from '../T'; import Bindable from './__fixtures__/Bindable.svelte'; describe('<T>', () => { it('instantiates a Three.js object when the "is" argument is a class', () => { const { scene } = render(T, { props: { is: Group } }); expect(scene.getObjectByProperty('type', 'Group')).not.toBeFalsy(); }); it('instantiates a Three.js object when a property is accessed', () => { const { scene } = render(T.Group); expect(scene.getObjectByProperty('type', 'Group')).not.toBeFalsy(); }); it('reuses a Three.js class instance passed to an "is" argument', () => { const group = new Group(); const { scene } = render(T, { props: { is: group } }); expect(scene.getObjectByProperty('type', group.type)).toBe(group); }); it('passes "args" to a class constructor', () => { const geometry = new BufferGeometry(); const material = new MeshBasicMaterial(); const { scene } = render(T.Mesh, { props: { args: [geometry, material] } }); const mesh = scene.getObjectByProperty('type', 'Mesh'); expect(mesh.geometry).toBe(geometry); expect(mesh.material).toBe(material); }); it('extends the Three.js catalogue', () => { extend({ OrbitControls }); const oncreate = vi.fn(); render(T.OrbitControls, { props: { oncreate, args: [new PerspectiveCamera(), document.createElement('div')] } }); expect(oncreate).toHaveBeenCalledOnce(); }); it('creates a bindable ref', async () => { const group = new Group(); const onRefCreate = vi.fn(); render(Bindable, { props: { is: group, onRefCreate } }); expect(onRefCreate).toHaveBeenCalledTimes(2); expect(onRefCreate).toHaveBeenNthCalledWith(1, undefined); expect(onRefCreate).toHaveBeenNthCalledWith(2, group); }); });