mirror of
https://github.com/immich-app/immich.git
synced 2026-06-03 20:55:25 -04:00
c8a1d0e400
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
159 lines
5.4 KiB
Dart
159 lines
5.4 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:immich_mobile/utils/semver.dart';
|
|
|
|
void main() {
|
|
group('SemVer', () {
|
|
test('Parses valid semantic version strings correctly', () {
|
|
final version = SemVer.fromString('1.2.3');
|
|
expect(version.major, 1);
|
|
expect(version.minor, 2);
|
|
expect(version.patch, 3);
|
|
});
|
|
|
|
test('Throws FormatException for invalid version strings', () {
|
|
expect(() => SemVer.fromString('1.2'), throwsFormatException);
|
|
expect(() => SemVer.fromString('a.b.c'), throwsFormatException);
|
|
expect(() => SemVer.fromString('1.2.3.4'), throwsFormatException);
|
|
});
|
|
|
|
test('Compares equal versons correctly', () {
|
|
final v1 = SemVer.fromString('1.2.3');
|
|
final v2 = SemVer.fromString('1.2.3');
|
|
expect(v1 == v2, isTrue);
|
|
expect(v1 > v2, isFalse);
|
|
expect(v1 < v2, isFalse);
|
|
});
|
|
|
|
test('Compares major version correctly', () {
|
|
final v1 = SemVer.fromString('2.0.0');
|
|
final v2 = SemVer.fromString('1.9.9');
|
|
expect(v1 == v2, isFalse);
|
|
expect(v1 > v2, isTrue);
|
|
expect(v1 < v2, isFalse);
|
|
});
|
|
|
|
test('Compares minor version correctly', () {
|
|
final v1 = SemVer.fromString('1.3.0');
|
|
final v2 = SemVer.fromString('1.2.9');
|
|
expect(v1 == v2, isFalse);
|
|
expect(v1 > v2, isTrue);
|
|
expect(v1 < v2, isFalse);
|
|
});
|
|
|
|
test('Compares patch version correctly', () {
|
|
final v1 = SemVer.fromString('1.2.4');
|
|
final v2 = SemVer.fromString('1.2.3');
|
|
expect(v1 == v2, isFalse);
|
|
expect(v1 > v2, isTrue);
|
|
expect(v1 < v2, isFalse);
|
|
});
|
|
|
|
test('Gives correct major difference type', () {
|
|
final v1 = SemVer.fromString('2.0.0');
|
|
final v2 = SemVer.fromString('1.9.9');
|
|
expect(v1.differenceType(v2), SemVerType.major);
|
|
});
|
|
|
|
test('Gives correct minor difference type', () {
|
|
final v1 = SemVer.fromString('1.3.0');
|
|
final v2 = SemVer.fromString('1.2.9');
|
|
expect(v1.differenceType(v2), SemVerType.minor);
|
|
});
|
|
|
|
test('Gives correct patch difference type', () {
|
|
final v1 = SemVer.fromString('1.2.4');
|
|
final v2 = SemVer.fromString('1.2.3');
|
|
expect(v1.differenceType(v2), SemVerType.patch);
|
|
});
|
|
|
|
test('Gives null difference type for equal versions', () {
|
|
final v1 = SemVer.fromString('1.2.3');
|
|
final v2 = SemVer.fromString('1.2.3');
|
|
expect(v1.differenceType(v2), isNull);
|
|
});
|
|
|
|
test('toString returns correct format', () {
|
|
final version = SemVer.fromString('1.2.3');
|
|
expect(version.toString(), '1.2.3');
|
|
});
|
|
|
|
test('Parses versions with leading v correctly', () {
|
|
final version1 = SemVer.fromString('v1.2.3');
|
|
expect(version1.major, 1);
|
|
expect(version1.minor, 2);
|
|
expect(version1.patch, 3);
|
|
|
|
final version2 = SemVer.fromString('V1.2.3');
|
|
expect(version2.major, 1);
|
|
expect(version2.minor, 2);
|
|
expect(version2.patch, 3);
|
|
});
|
|
|
|
test('Orders later prerelease above earlier prerelease', () {
|
|
const rc1 = SemVer(major: 1, minor: 151, patch: 0, prerelease: 1);
|
|
const rc2 = SemVer(major: 1, minor: 151, patch: 0, prerelease: 2);
|
|
expect(rc2 > rc1, isTrue);
|
|
expect(rc1 < rc2, isTrue);
|
|
expect(rc1 == rc2, isFalse);
|
|
});
|
|
|
|
test('Final release outranks its prerelease of the same version', () {
|
|
const rc = SemVer(major: 1, minor: 151, patch: 0, prerelease: 1);
|
|
const release = SemVer(major: 1, minor: 151, patch: 0);
|
|
expect(release > rc, isTrue);
|
|
expect(rc < release, isTrue);
|
|
});
|
|
|
|
test('Higher major outranks a prerelease regardless of ordinal', () {
|
|
const rc = SemVer(major: 1, minor: 151, patch: 0, prerelease: 9);
|
|
const next = SemVer(major: 2, minor: 0, patch: 0);
|
|
expect(next > rc, isTrue);
|
|
});
|
|
|
|
test('Equal prerelease versions compare as equal', () {
|
|
const a = SemVer(major: 1, minor: 151, patch: 0, prerelease: 3);
|
|
const b = SemVer(major: 1, minor: 151, patch: 0, prerelease: 3);
|
|
expect(a == b, isTrue);
|
|
expect(a > b, isFalse);
|
|
expect(a < b, isFalse);
|
|
});
|
|
|
|
test('Reports prerelease difference type', () {
|
|
const rc1 = SemVer(major: 1, minor: 151, patch: 0, prerelease: 1);
|
|
const rc2 = SemVer(major: 1, minor: 151, patch: 0, prerelease: 2);
|
|
expect(rc1.differenceType(rc2), SemVerType.prerelease);
|
|
});
|
|
|
|
test('toString includes prerelease suffix when present', () {
|
|
const rc = SemVer(major: 1, minor: 151, patch: 0, prerelease: 2);
|
|
expect(rc.toString(), '1.151.0-rc.2');
|
|
});
|
|
|
|
test('Parses prerelease ordinal from -rc strings', () {
|
|
final dotted = SemVer.fromString('1.151.0-rc.2');
|
|
expect(dotted.major, 1);
|
|
expect(dotted.minor, 151);
|
|
expect(dotted.patch, 0);
|
|
expect(dotted.prerelease, 2);
|
|
|
|
expect(SemVer.fromString('v1.151.0-rc.3').prerelease, 3);
|
|
expect(SemVer.fromString('1.2.3-rc.2+build.5').prerelease, 2);
|
|
});
|
|
|
|
test('Plain version string has null prerelease', () {
|
|
expect(SemVer.fromString('3.0.0').prerelease, isNull);
|
|
});
|
|
|
|
test('Invalid rc suffixes parse without error and have null prerelease', () {
|
|
final debug = SemVer.fromString('1.2.3-debug');
|
|
expect(debug.major, 1);
|
|
expect(debug.minor, 2);
|
|
expect(debug.patch, 3);
|
|
expect(debug.prerelease, isNull);
|
|
|
|
expect(SemVer.fromString('1.2.3+build.5').prerelease, isNull);
|
|
expect(SemVer.fromString('1.151.0-rc4').prerelease, isNull);
|
|
});
|
|
});
|
|
}
|