// 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(); } }