'use strict'; const { test } = require('node:test'); const assert = require('node:assert/strict'); const { compareVersionArrays, parseStableVersions, latestStableVersion, nextReleaseVersion, nextBetaNumber, nextVersion, calculateVersion, } = require('../version'); test('compareVersionArrays 逐區段數值比較,較短者視為較小', () => { assert.ok(compareVersionArrays([1, 10, 0], [1, 9, 0]) > 0); assert.ok(compareVersionArrays([1, 2], [1, 2, 0]) < 0); assert.equal(compareVersionArrays([1, 2, 3], [1, 2, 3]), 0); assert.ok(compareVersionArrays([2, 0, 0], [1, 9, 9]) > 0); }); test('parseStableVersions 排除 beta、去除前綴 v 並驗證數字格式', () => { const releases = [ { tag_name: 'v1.2.3' }, { tag_name: '2.0.0' }, { tag_name: 'v1.3.0-beta.1' }, { tag_name: 'nightly' }, { tag_name: null }, null, ]; assert.deepEqual(parseStableVersions(releases), [[1, 2, 3], [2, 0, 0]]); }); test('parseStableVersions 對非陣列回傳空陣列', () => { assert.deepEqual(parseStableVersions(null), []); assert.deepEqual(parseStableVersions(undefined), []); }); test('latestStableVersion 在無資料時回傳 0.0.0', () => { assert.equal(latestStableVersion([]), '0.0.0'); assert.equal(latestStableVersion([{ tag_name: 'v1.0.0-beta.1' }]), '0.0.0'); }); test('latestStableVersion 取最新的穩定版(含跨區段比較)', () => { assert.equal(latestStableVersion([ { tag_name: 'v1.9.0' }, { tag_name: 'v1.10.0' }, { tag_name: 'v1.2.3' }, ]), '1.10.0'); }); test('nextReleaseVersion 對 patch 進位', () => { assert.equal(nextReleaseVersion('0.0.0'), '0.0.1'); assert.equal(nextReleaseVersion('1.2.3'), '1.2.4'); }); test('nextReleaseVersion 在 patch 達 10 時進位至 minor', () => { assert.equal(nextReleaseVersion('1.2.9'), '1.3.0'); }); test('nextReleaseVersion 在 minor 也達 10 時進位至 major', () => { assert.equal(nextReleaseVersion('1.9.9'), '2.0.0'); }); test('nextBetaNumber 在查無對應 beta 時回傳 1', () => { assert.equal(nextBetaNumber([], '1.2.4'), 1); assert.equal(nextBetaNumber([{ tag_name: 'v9.9.9-beta.5' }], '1.2.4'), 1); assert.equal(nextBetaNumber(null, '1.2.4'), 1); }); test('nextBetaNumber 取對應 beta 流水號最大值 + 1', () => { const releases = [ { tag_name: 'v1.2.4-beta.1' }, { tag_name: 'v1.2.4-beta.3' }, { tag_name: 'v1.2.4-beta.2' }, { tag_name: 'v1.2.5-beta.9' }, ]; assert.equal(nextBetaNumber(releases, '1.2.4'), 4); }); test('nextVersion 依舊版本計算下一個穩定版', () => { assert.equal(nextVersion('1.2.3', [], false), '1.2.4'); assert.equal(nextVersion('0.0.0', [], false), '0.0.1'); }); test('nextVersion 依舊版本計算下一個 beta 版', () => { const releases = [{ tag_name: 'v1.2.4-beta.2' }]; assert.equal(nextVersion('1.2.3', releases, true), '1.2.4-beta.3'); }); test('calculateVersion 計算下一個穩定版', () => { assert.deepEqual( calculateVersion([{ tag_name: 'v1.2.3' }], false), { latest: '1.2.3', version: '1.2.4' }, ); }); test('calculateVersion 計算下一個 beta 版', () => { const releases = [ { tag_name: 'v1.2.3' }, { tag_name: 'v1.2.4-beta.2' }, ]; assert.deepEqual( calculateVersion(releases, true), { latest: '1.2.3', version: '1.2.4-beta.3' }, ); }); test('calculateVersion 在無任何 release 時的預設值', () => { assert.deepEqual(calculateVersion([], false), { latest: '0.0.0', version: '0.0.1' }); assert.deepEqual(calculateVersion([], true), { latest: '0.0.0', version: '0.0.1-beta.1' }); });