Viewing is open to everyone. Downloading and starring need a GitHub sign-in.
Sign in with GitHub
options.test.mjs
v0.1.0-build.85
Latest
Commit ede38f5
Sign in with GitHub to download. Each download is recorded with your GitHub username.
| 1 | // Pure-JS tests: option validation. |
| 2 | import test from 'node:test'; |
| 3 | import assert from 'node:assert/strict'; |
| 4 | import { |
| 5 | encodeOptions, rasterOptions, svgOptions, pdfOptions, styleSpec, parseColour, telemetryMode, payloadBytes, |
| 6 | rgbaFrame, certifyOptions, |
| 7 | } from '../js/options.mjs'; |
| 8 | |
| 9 | test('encode options', () => { |
| 10 | assert.deepEqual(encodeOptions(), { version: 0, level: 1, layout: 0 }); |
| 11 | assert.deepEqual(encodeOptions({ version: 31, level: 'H', layout: 'print' }), { version: 31, level: 3, layout: 1 }); |
| 12 | assert.equal(encodeOptions({ level: 'q' }).level, 2); |
| 13 | assert.throws(() => encodeOptions({ version: 32 }), RangeError); |
| 14 | assert.throws(() => encodeOptions({ version: 1.5 }), TypeError); |
| 15 | assert.throws(() => encodeOptions({ level: 'X' }), RangeError); |
| 16 | assert.throws(() => encodeOptions({ layout: 'poster' }), RangeError); |
| 17 | assert.throws(() => encodeOptions('M'), TypeError); |
| 18 | }); |
| 19 | |
| 20 | test('raster options', () => { |
| 21 | const d = rasterOptions(); |
| 22 | assert.equal(d.size, 512); |
| 23 | assert.equal(d.policy, 0); |
| 24 | assert.equal(d.transparent, false); |
| 25 | assert.equal(d.supersample, 4); |
| 26 | assert.equal(d.minFeaturePx, 1); |
| 27 | assert.equal(d.materials, true); |
| 28 | assert.equal(d.style, null); |
| 29 | assert.equal(rasterOptions({ policy: 'hybrid' }).policy, 2); |
| 30 | assert.throws(() => rasterOptions({ size: 15 }), RangeError); |
| 31 | assert.throws(() => rasterOptions({ size: 16385 }), RangeError); |
| 32 | assert.throws(() => rasterOptions({ size: '512' }), TypeError); |
| 33 | assert.throws(() => rasterOptions({ policy: 'smooth' }), RangeError); |
| 34 | assert.throws(() => rasterOptions({ transparent: 1 }), TypeError); |
| 35 | assert.throws(() => rasterOptions({ minFeaturePx: 0 }), RangeError); |
| 36 | assert.throws(() => rasterOptions({ supersample: 9 }), RangeError); |
| 37 | assert.throws(() => rasterOptions({ logo: { width: 2, height: 2, data: new Uint8Array(3) } }), RangeError); |
| 38 | }); |
| 39 | |
| 40 | test('style specs', () => { |
| 41 | assert.equal(styleSpec({}), null); |
| 42 | assert.deepEqual(styleSpec({ preset: 'concept' }), { preset: 1, rgb: [], num: [], logoHref: null }); |
| 43 | const s = styleSpec({ style: { background: '#123', ink: [1, 2, 3], inkShade: { r: 4, g: 5, b: 6 }, policy: 'adaptive', modules: 'circle', logoPlate: true } }); |
| 44 | assert.equal(s.preset, 0); |
| 45 | assert.deepEqual(s.rgb, [[0, 0x11, 0x22, 0x33], [1, 0x11, 0x22, 0x33], [2, 1, 2, 3], [3, 4, 5, 6]]); |
| 46 | assert.deepEqual(s.num, [[2, 2], [9, 1], [10, 1]]); |
| 47 | assert.deepEqual(styleSpec({ style: { accents: ['#ff0000', '#00ff00'] } }).num, [[0, 2]]); |
| 48 | assert.throws(() => styleSpec({ style: { colour: '#000' } }), TypeError); |
| 49 | assert.throws(() => styleSpec({ style: { policy: 'lenient' } }), RangeError); |
| 50 | assert.throws(() => styleSpec({ style: { accents: [1, 2, 3, 4, 5] } }), RangeError); |
| 51 | assert.throws(() => styleSpec({ style: { bevel: 2 } }), RangeError); |
| 52 | assert.throws(() => styleSpec({ preset: 'neon' }), RangeError); |
| 53 | assert.throws(() => parseColour('#12'), RangeError); |
| 54 | assert.throws(() => parseColour([0, 0, 256]), RangeError); |
| 55 | }); |
| 56 | |
| 57 | test('svg / pdf / certify options', () => { |
| 58 | assert.equal(svgOptions().scale, 16); |
| 59 | assert.equal(svgOptions({ size: 310 }).scale, 10); |
| 60 | assert.throws(() => svgOptions({ scale: 0 }), RangeError); |
| 61 | assert.deepEqual(pdfOptions(), { widthPt: 144, transparent: false, style: null }); |
| 62 | assert.throws(() => pdfOptions({ widthPt: 0 }), RangeError); |
| 63 | const c = certifyOptions({ transparent: true, backdrop: { colours: ['#fff', '#000'] } }); |
| 64 | assert.deepEqual(c.colours, [[255, 255, 255], [0, 0, 0]]); |
| 65 | assert.equal(c.pxPerModule, -1); |
| 66 | assert.equal(c.trials, 0); |
| 67 | assert.throws(() => certifyOptions({ model: { trials: 17 } }), RangeError); |
| 68 | }); |
| 69 | |
| 70 | test('telemetry mode validation never falls back to 1', () => { |
| 71 | for (const v of [0, 1, 2]) assert.equal(telemetryMode(v), v); |
| 72 | for (const v of [3, -1, 1.5, '1', true, null, undefined, NaN, 'off']) { |
| 73 | assert.throws(() => telemetryMode(v), RangeError, String(v)); |
| 74 | } |
| 75 | }); |
| 76 | |
| 77 | test('payload bytes and frames', () => { |
| 78 | assert.deepEqual([...payloadBytes('é')], [0xc3, 0xa9]); |
| 79 | const src = Uint8Array.of(1, 2, 3, 4); |
| 80 | const view = payloadBytes(src.subarray(1, 3)); |
| 81 | assert.deepEqual([...view], [2, 3]); |
| 82 | view[0] = 9; |
| 83 | assert.equal(src[1], 2, 'payload is copied'); |
| 84 | assert.throws(() => payloadBytes(42), TypeError); |
| 85 | assert.throws(() => rgbaFrame({ width: 2, height: 2, data: [0] }), TypeError); |
| 86 | assert.equal(rgbaFrame({ width: 1, height: 1, data: new Uint8ClampedArray(4) }).width, 1); |
| 87 | }); |