semver/src/semver.tests/SemanticVersionComparerTests.cs

115 lines
4.6 KiB
C#
Raw Normal View History

2026-05-11 22:53:24 +02:00
// Copyright (c) The Geekeey Authors
// SPDX-License-Identifier: EUPL-1.2
namespace Geekeey.SemVer.Tests;
internal sealed class SemanticVersionComparerTests
{
[Test]
[Arguments("1.0.0", "2.0.0", -1)]
[Arguments("2.0.0", "1.0.0", 1)]
[Arguments("1.0.0", "1.1.0", -1)]
[Arguments("1.1.0", "1.0.0", 1)]
[Arguments("1.0.0", "1.0.1", -1)]
[Arguments("1.0.1", "1.0.0", 1)]
[Arguments("1.0.0-alpha", "1.0.0", -1)]
[Arguments("1.0.0", "1.0.0-alpha", 1)]
[Arguments("1.0.0-alpha", "1.0.0-alpha.1", -1)]
[Arguments("1.0.0-alpha.1", "1.0.0-alpha.beta", -1)]
[Arguments("1.0.0-alpha.beta", "1.0.0-beta", -1)]
[Arguments("1.0.0-beta", "1.0.0-beta.2", -1)]
[Arguments("1.0.0-beta.2", "1.0.0-beta.11", -1)]
[Arguments("1.0.0-beta.11", "1.0.0-rc.1", -1)]
[Arguments("1.0.0-rc.1", "1.0.0", -1)]
[Arguments("1.0.0-alpha.5", "1.0.0-alpha.10", -1)]
[Arguments("1.0.0-alpha.10", "1.0.0-alpha.5", 1)]
[Arguments("1.0.0-alpha.beta", "1.0.0-alpha.5", 1)]
[Arguments("1.0.0-alpha.5", "1.0.0-alpha.beta", -1)]
[Arguments("1.0.0-alpha.1.2", "1.0.0-alpha.1.2.3", -1)]
[Arguments("1.0.0-alpha.1.2.3", "1.0.0-alpha.1.2", 1)]
[Arguments("1.0.0-alpha-b", "1.0.0-alpha-a", 1)]
[Arguments("1.0.0-0.3.7", "1.0.0-x.7.z.92", -1)]
[Arguments("1.0.0-x.7.z.92", "1.0.0-0.3.7", 1)]
[Arguments("1.0.0+build.1", "1.0.0+build.2", 0)]
[Arguments("1.0.0-alpha+build.1", "1.0.0-alpha+build.2", 0)]
public async Task I_can_compare_by_precedence(string v1Str, string v2Str, int expected)
{
var v1 = SemanticVersion.Parse(v1Str);
var v2 = SemanticVersion.Parse(v2Str);
var result = SemanticVersionComparer.Priority.Compare(v1, v2);
await Assert.That(Math.Sign(result)).IsEqualTo(expected);
}
[Test]
[Arguments("1.0.0+build.1", "1.0.0+build.2", 0)]
[Arguments("1.0.0-alpha+build.1", "1.0.0-alpha+build.2", 0)]
public async Task I_can_confirm_precedence_ignores_metadata(string v1Str, string v2Str, int expected)
{
var v1 = SemanticVersion.Parse(v1Str);
var v2 = SemanticVersion.Parse(v2Str);
var result = SemanticVersionComparer.Priority.Compare(v1, v2);
await Assert.That(result).IsEqualTo(expected);
}
[Test]
[Arguments("1.0.0", "1.0.0+build.1", -1)]
[Arguments("1.0.0+build.1", "1.0.0", 1)]
[Arguments("1.0.0+build.1", "1.0.0+build.2", -1)]
[Arguments("1.0.0+build.1.1", "1.0.0+build.1", 1)]
[Arguments("1.0.0+a.b", "1.0.0+a.a", 1)]
[Arguments("1.0.0+a.a", "1.0.0+a.b", -1)]
[Arguments("1.0.0+a.b", "1.0.0+a.b.c", -1)]
[Arguments("1.0.0+a.b.c", "1.0.0+a.b", 1)]
[Arguments("1.0.0+1.2.3", "1.0.0+1.2.4", -1)]
[Arguments("1.0.0+1.2.4", "1.0.0+1.2.3", 1)]
[Arguments("1.0.0+01", "1.0.0+1", -1)]
public async Task I_can_compare_by_sort_order(string v1Str, string v2Str, int expected)
{
var v1 = SemanticVersion.Parse(v1Str);
var v2 = SemanticVersion.Parse(v2Str);
var result = SemanticVersionComparer.SortOrder.Compare(v1, v2);
await Assert.That(Math.Sign(result)).IsEqualTo(expected);
}
[Test]
public async Task I_can_confirm_precedence_equality_ignores_metadata()
{
var v1 = SemanticVersion.Parse("1.0.0-alpha+build.1");
var v2 = SemanticVersion.Parse("1.0.0-alpha+build.2");
await Assert.That(SemanticVersionComparer.Priority.Equals(v1, v2)).IsTrue();
await Assert.That(SemanticVersionComparer.Priority.GetHashCode(v1)).IsEqualTo(SemanticVersionComparer.Priority.GetHashCode(v2));
}
[Test]
public async Task I_can_confirm_sort_order_equality_includes_metadata()
{
var v1 = SemanticVersion.Parse("1.0.0-alpha+build.1");
var v2 = SemanticVersion.Parse("1.0.0-alpha+build.2");
await Assert.That(SemanticVersionComparer.SortOrder.Equals(v1, v2)).IsFalse();
await Assert.That(SemanticVersionComparer.SortOrder.GetHashCode(v1)).IsNotEqualTo(SemanticVersionComparer.SortOrder.GetHashCode(v2));
}
[Test]
public async Task I_can_confirm_equality_for_identical_versions()
{
var v1 = SemanticVersion.Parse("1.0.0-alpha.1");
var v2 = SemanticVersion.Parse("1.0.0-alpha.1");
await Assert.That(SemanticVersionComparer.Priority.Equals(v1, v2)).IsTrue();
await Assert.That(SemanticVersionComparer.SortOrder.Equals(v1, v2)).IsTrue();
await Assert.That(SemanticVersionComparer.Priority.GetHashCode(v1)).IsEqualTo(SemanticVersionComparer.Priority.GetHashCode(v2));
await Assert.That(SemanticVersionComparer.SortOrder.GetHashCode(v1)).IsEqualTo(SemanticVersionComparer.SortOrder.GetHashCode(v2));
}
[Test]
public async Task I_can_confirm_equality_for_different_versions()
{
var v1 = SemanticVersion.Parse("1.0.0-alpha.1");
var v2 = SemanticVersion.Parse("1.0.0-alpha.2");
await Assert.That(SemanticVersionComparer.Priority.Equals(v1, v2)).IsFalse();
await Assert.That(SemanticVersionComparer.SortOrder.Equals(v1, v2)).IsFalse();
}
}