Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
import assert from 'node:assert/strict'
import test from 'node:test'
import { VISUAL_SAMPLES, sampleById } from './samples.mjs'
import { analyzeWorkspace } from './project-validator.mjs'
function blockTypes(block, result = []) {
if (!block) return result
result.push(block.type)
for (const input of Object.values(block.inputs ?? {})) {
blockTypes(input.block, result)
blockTypes(input.shadow, result)
}
blockTypes(block.next?.block, result)
return result
}
test('five representative samples have unique ids and buildable workspace structure', () => {
assert.equal(VISUAL_SAMPLES.length, 5)
assert.equal(new Set(VISUAL_SAMPLES.map((sample) => sample.id)).size, VISUAL_SAMPLES.length)
for (const sample of VISUAL_SAMPLES) {
const analysis = analyzeWorkspace(sample.workspace, { target: 'm5stackchan-cores3' })
assert.equal(analysis.canBuild, true, `${sample.id}: ${JSON.stringify(analysis.diagnostics)}`)
assert.deepEqual(analysis.diagnostics, [], `${sample.id}: no warnings in the starting point`)
}
const logic = sampleById('logic').workspace
const logicTypes = logic.blocks.blocks.flatMap((block) => blockTypes(block))
for (const type of [
'variables_set',
'variables_get',
'lists_create_with',
'lists_getIndex',
'procedures_callnoreturn',
]) {
assert.ok(logicTypes.includes(type), `logic sample must exercise ${type}`)
}
assert.equal(sampleById('missing'), VISUAL_SAMPLES[0])
})
test('sensor sample targets the CoreS3 head LED', () => {
const sensorBlocks = sampleById('sensors').workspace.blocks.blocks
const imuBlock = sensorBlocks.find((block) => block.type === 'stackchan_on_imu')
const rainbowBlock = imuBlock?.inputs?.DO?.block
assert.equal(rainbowBlock?.type, 'stackchan_light_rainbow')
assert.equal(rainbowBlock?.fields?.NAME, 'head')
})
5e4094a64This file is pinned to the selected release. Download the original to open it in your design tool.