'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { compareVersionArrays, parseStableVersions, latestStableVersion, nextReleaseVersion, nextBetaNumber, calculateVersion, } = require('../version'); // 便於建構測試資料的小工具 const rel = (tag) => ({ tag_name: tag }); test('compareVersionArrays 逐區段比較且較短者較小', () => { assert.ok(compareVersionArrays([1, 10], [1, 2, 3]) > 0); assert.ok(compareVersionArrays([1, 2], [1, 2, 0]) < 0); assert.ok(compareVersionArrays([2, 0, 0], [1, 9, 9]) > 0); assert.equal(compareVersionArrays([1, 2, 3], [1, 2, 3]), 0); }); test('parseStableVersions 排除 beta 與非法 tag 並去除 v 前綴', () => { const releases = [ rel('v1.2.3'), rel('2.0.0'), rel('v1.0.0-beta.1'), rel('latest'), { name: '沒有 tag_name' }, ]; assert.deepEqual(parseStableVersions(releases), [[1, 2, 3], [2, 0, 0]]); }); test('latestStableVersion 無資料時回傳 0.0.0', () => { assert.equal(latestStableVersion([]), '0.0.0'); assert.equal(latestStableVersion(null), '0.0.0'); }); test('latestStableVersion 取出最大穩定版', () => { const releases = [rel('v1.2.3'), rel('v1.9.9'), rel('v1.2.9'), rel('v0.5.0-beta.2')]; assert.equal(latestStableVersion(releases), '1.9.9'); }); 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([], '0.0.1'), 1); assert.equal(nextBetaNumber([rel('v0.0.1')], '0.0.1'), 1); }); test('nextBetaNumber 取最大流水號加一', () => { const releases = [rel('v1.3.0-beta.1'), rel('v1.3.0-beta.3'), rel('v1.3.0-beta.2')]; assert.equal(nextBetaNumber(releases, '1.3.0'), 4); }); test('calculateVersion 無 release 的穩定版', () => { assert.deepEqual(calculateVersion([], false), { latest: '0.0.0', version: '0.0.1' }); }); test('calculateVersion 無 release 的 beta 版', () => { assert.deepEqual(calculateVersion([], true), { latest: '0.0.0', version: '0.0.1-beta.1' }); }); test('calculateVersion 既有穩定版推下一個穩定版', () => { const releases = [rel('v1.2.3'), rel('v1.2.2')]; assert.deepEqual(calculateVersion(releases, false), { latest: '1.2.3', version: '1.2.4' }); }); test('calculateVersion 既有穩定版推下一個 beta 版', () => { const releases = [rel('v1.2.3'), rel('v1.2.4-beta.1')]; assert.deepEqual(calculateVersion(releases, true), { latest: '1.2.3', version: '1.2.4-beta.2' }); });