| 1 | import test from 'node:test' ; |
| 2 | import assert from 'node:assert/strict' ; |
| 3 | import {recipe, FAMILIES} from '../src/index.js' ; |
| 4 | import {render} from '../src/render.js' ; |
| 5 | test('every grammar responds to independently varied composition, shape and feature axes' , () => { |
| 6 | for (const family of FAMILIES) { |
| 7 | const r = JSON.parse(JSON.stringify(recipe('axis-fixture' ))); |
| 8 | r.family = family; |
| 9 | for (const layer of ['layout' , 'silhouette' , 'features' ]) { |
| 10 | const variants = Array.from({length: 4}, (_, variant) => render({...r, [layer]: {...r[layer], variant}})); |
| 11 | assert.equal(new Set(variants).size, 4, `${family} ${layer}` ); |
| 12 | } |
| 13 | } |
| 14 | }); |
| 15 | test('texture variants change only the independent texture layer' , () => { |
| 16 | const r = recipe('texture-fixture' ); |
| 17 | const variants = Array.from({length: 3}, (_, variant) => render({...r, texture: {...r.texture, variant}})); |
| 18 | assert.equal(new Set(variants).size, 3); |
| 19 | const foreground = svg => svg.slice(svg.indexOf('<g transform=' )); |
| 20 | assert.equal(new Set(variants.map(foreground)).size, 1); |
| 21 | }); |