import { describe, expect, it } from 'vitest'; import { bumpMinor, isSemver, semverGreater } from '../src/lib/marketplace/semver.ts'; describe('isSemver', () => { it('accepts strict X.Y.Z', () => { expect(isSemver('1.0.0')).toBe(true); expect(isSemver('0.0.1')).toBe(true); expect(isSemver('123.456.789')).toBe(true); }); it('rejects pre-releases', () => { expect(isSemver('1.0.0-rc1')).toBe(false); }); it('rejects 2-segment', () => { expect(isSemver('1.0')).toBe(false); }); }); describe('bumpMinor', () => { it('1.2.3 → 1.3.0', () => { expect(bumpMinor('1.2.3')).toBe('1.3.0'); }); it('0.9.99 → 0.10.0', () => { expect(bumpMinor('0.9.99')).toBe('0.10.0'); }); it('invalid → 1.0.0', () => { expect(bumpMinor('garbage')).toBe('1.0.0'); }); }); describe('semverGreater', () => { it('major', () => { expect(semverGreater('2.0.0', '1.99.99')).toBe(true); }); it('minor', () => { expect(semverGreater('1.2.0', '1.1.99')).toBe(true); }); it('patch', () => { expect(semverGreater('1.0.1', '1.0.0')).toBe(true); }); it('equal is not greater', () => { expect(semverGreater('1.0.0', '1.0.0')).toBe(false); }); it('invalid input → false', () => { expect(semverGreater('garbage', '1.0.0')).toBe(false); expect(semverGreater('1.0.0', 'garbage')).toBe(false); }); });