Adding the lab project
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import React from 'react'
|
||||
import { renderToStaticMarkup } from 'react-dom/server'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import {
|
||||
CaRenderer,
|
||||
getCaRendererRuntime,
|
||||
listCompatibleCaRendererRuntimes,
|
||||
listCaRendererRuntimes,
|
||||
registerCaRendererRuntime
|
||||
} from '../admin/src/CaRenderer.js'
|
||||
|
||||
describe('CA renderer runtimes', () => {
|
||||
it('registers built-in renderers and resolves aliases', () => {
|
||||
expect(listCaRendererRuntimes().map((runtime) => runtime.id)).toEqual(
|
||||
expect.arrayContaining(['2d-canvas', 'elementary-1d', 'wildfire-2d', 'voxel-3d'])
|
||||
)
|
||||
expect(getCaRendererRuntime('three-voxel')?.id).toBe('voxel-3d')
|
||||
expect(getCaRendererRuntime('elementary-ca')?.id).toBe('elementary-1d')
|
||||
expect(getCaRendererRuntime('forest-fire-2d')?.id).toBe('wildfire-2d')
|
||||
})
|
||||
|
||||
it('lets custom renderers register with the shared renderer contract', () => {
|
||||
registerCaRendererRuntime({
|
||||
id: 'test-renderer',
|
||||
label: 'Test renderer',
|
||||
supportedClasses: [{ dimensions: 2, states: 3 }],
|
||||
Component: function TestRenderer() {
|
||||
return React.createElement('div', null)
|
||||
}
|
||||
})
|
||||
|
||||
expect(getCaRendererRuntime('test-renderer')?.label).toBe('Test renderer')
|
||||
})
|
||||
|
||||
it('filters renderers by dimensionality and state space', () => {
|
||||
expect(listCompatibleCaRendererRuntimes({ dimensions: 3, states: 2 }).map((runtime) => runtime.id)).toEqual([
|
||||
'voxel-3d'
|
||||
])
|
||||
expect(listCompatibleCaRendererRuntimes({ dimensions: 1, states: 2 }).map((runtime) => runtime.id)).toEqual([
|
||||
'elementary-1d'
|
||||
])
|
||||
expect(listCompatibleCaRendererRuntimes({ dimensions: 2, states: 3 }).map((runtime) => runtime.id)).toContain(
|
||||
'test-renderer'
|
||||
)
|
||||
})
|
||||
|
||||
it('refuses to render a runtime for an incompatible CA space', () => {
|
||||
const markup = renderToStaticMarkup(
|
||||
React.createElement(CaRenderer, {
|
||||
caption: '',
|
||||
cells: [[false]],
|
||||
settings: {
|
||||
caClass: { dimensions: 3, states: 2 },
|
||||
renderer: { id: '2d-canvas' }
|
||||
},
|
||||
onCellsChange: () => undefined
|
||||
})
|
||||
)
|
||||
|
||||
expect(markup).toContain('does not support this CA space')
|
||||
expect(markup).not.toContain('Game of Life cell editor')
|
||||
})
|
||||
|
||||
it('rejects duplicate renderer ids', () => {
|
||||
expect(() =>
|
||||
registerCaRendererRuntime({
|
||||
id: '2d-canvas',
|
||||
label: 'Duplicate canvas',
|
||||
supportedClasses: [{ dimensions: 2, states: 2 }],
|
||||
Component: function DuplicateRenderer() {
|
||||
return React.createElement('div', null)
|
||||
}
|
||||
})
|
||||
).toThrow('already registered')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user