import assert from 'node:assert/strict'; import { test } from 'node:test'; import { parseVersion, resolveVersion } from './version.mjs'; test('release tag', () => { assert.deepEqual(parseVersion('v0.1.0'), { version: '0.1.0', versionCode: 10_099, prerelease: false }); assert.deepEqual(parseVersion('v1.2.3'), { version: '1.2.3', versionCode: 1_020_399, prerelease: false }); }); test('release candidate', () => { assert.deepEqual(parseVersion('v1.2.0-rc.2'), { version: '1.2.0-rc.2', versionCode: 1_020_002, prerelease: true }); }); test('version codes grow monotonically', () => { const order = ['v0.9.9', 'v1.0.0-rc.1', 'v1.0.0-rc.2', 'v1.0.0', 'v1.0.1', 'v1.1.0', 'v2.0.0']; const codes = order.map((t) => parseVersion(t).versionCode); assert.deepEqual([...codes].sort((a, b) => a - b), codes); }); test('rejects malformed tags', () => { for (const tag of ['1.2', 'v1.2.3-beta', 'v1.100.0', 'v1.2.3-rc.0', 'main']) { assert.throws(() => parseVersion(tag), undefined, tag); } }); test('explicit tag must be a release tag', () => { assert.throws(() => resolveVersion('v1.2.3-beta', undefined)); assert.equal(resolveVersion('v1.2.3', 'main').version, '1.2.3'); }); test('branch builds fall back to the dev version', () => { assert.equal(resolveVersion(undefined, 'main').version, '0.0.0-dev'); assert.equal(resolveVersion(undefined, undefined).version, '0.0.0-dev'); assert.equal(resolveVersion(undefined, 'v2.0.0').version, '2.0.0'); });