Adding the lab project
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import {
|
||||
generateInitialCondition,
|
||||
getInitialConditionRuntime,
|
||||
listInitialConditionRuntimes,
|
||||
registerInitialConditionRuntime
|
||||
} from '../admin/src/caInitialConditionGenerators.js'
|
||||
|
||||
describe('CA initial condition runtimes', () => {
|
||||
it('registers the built-in random soup generator', () => {
|
||||
expect(listInitialConditionRuntimes().map((runtime) => runtime.id)).toContain('random-soup')
|
||||
expect(getInitialConditionRuntime('random-soup')?.label).toBe('Random soup')
|
||||
})
|
||||
|
||||
it('generates deterministic cell coordinates for the same seed and density', () => {
|
||||
const input = {
|
||||
caClass: { dimensions: 2, states: 2 },
|
||||
settings: { simulation: { grid: { size: [5, 5, 1] } } },
|
||||
params: { density: 0.35, seed: 'repeatable' }
|
||||
}
|
||||
|
||||
expect(generateInitialCondition('random-soup', input)).toEqual(generateInitialCondition('random-soup', input))
|
||||
})
|
||||
|
||||
it('clamps density and records generator provenance in the persisted initial condition', () => {
|
||||
const generated = generateInitialCondition('random-soup', {
|
||||
caClass: { dimensions: 2, states: 2 },
|
||||
settings: { simulation: { grid: { size: [3, 3, 1] } } },
|
||||
params: { density: 2, seed: 'full' }
|
||||
})
|
||||
|
||||
expect(generated.cells).toHaveLength(9)
|
||||
expect(generated.generator).toEqual({ kind: 'random-soup', density: 1, seed: 'full' })
|
||||
})
|
||||
|
||||
it('lets custom initial condition runtimes plug into the same contract', () => {
|
||||
registerInitialConditionRuntime({
|
||||
id: 'test-single-cell',
|
||||
label: 'Test single cell',
|
||||
generate: () => ({ type: 'cells', cells: [[1, 1, 0]], generator: { kind: 'test-single-cell' } })
|
||||
})
|
||||
|
||||
expect(generateInitialCondition('test-single-cell', {
|
||||
caClass: { dimensions: 2, states: 2 },
|
||||
settings: {},
|
||||
params: {}
|
||||
}).cells).toEqual([[1, 1, 0]])
|
||||
})
|
||||
|
||||
it('rejects duplicate runtime ids and missing implementations', () => {
|
||||
expect(() =>
|
||||
registerInitialConditionRuntime({
|
||||
id: 'random-soup',
|
||||
label: 'Duplicate random soup',
|
||||
generate: () => ({ type: 'cells', cells: [], generator: { kind: 'random-soup' } })
|
||||
})
|
||||
).toThrow('already registered')
|
||||
|
||||
expect(() =>
|
||||
generateInitialCondition('missing-generator', {
|
||||
caClass: { dimensions: 2, states: 2 },
|
||||
settings: {},
|
||||
params: {}
|
||||
})
|
||||
).toThrow('unavailable')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user