Skip to content

Commit

Permalink
fix prerelease major floating bug
Browse files Browse the repository at this point in the history
  • Loading branch information
nkolev92 committed Jan 30, 2020
1 parent 8515672 commit b9882c7
Show file tree
Hide file tree
Showing 6 changed files with 184 additions and 61 deletions.
36 changes: 25 additions & 11 deletions src/NuGet.Core/NuGet.Versioning/FloatRange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ public bool Satisfies(NuGetVersion version)
&& ((version.IsPrerelease && version.Release.StartsWith(_releasePrefix, StringComparison.OrdinalIgnoreCase))
|| !version.IsPrerelease);
}
else if (FloatBehavior == NuGetVersionFloatBehavior.PrereleaseMajor)
{
// allow the stable version to match
return (version.IsPrerelease && version.Release.StartsWith(_releasePrefix, StringComparison.OrdinalIgnoreCase))
|| !version.IsPrerelease;
}
else if (_floatBehavior == NuGetVersionFloatBehavior.Prerelease)
{
// allow the stable version to match
Expand Down Expand Up @@ -184,7 +190,7 @@ public static bool TryParse(string versionString, out FloatRange range)
else if (versionString.Length == 3
&& firstStarPosition == 0 && lastStarPosition == 2 && versionString[1] == '-')
{
range = new FloatRange(NuGetVersionFloatBehavior.AbsoluteLatest, new NuGetVersion("0.0.0-0"));
range = new FloatRange(NuGetVersionFloatBehavior.AbsoluteLatest, new NuGetVersion("0.0.0-0"), releasePrefix: string.Empty);
}
else if (firstStarPosition != lastStarPosition && lastStarPosition != -1 && versionString.IndexOf('+') == -1)
{
Expand All @@ -202,17 +208,22 @@ public static bool TryParse(string versionString, out FloatRange range)
var stablePart = versionString.Substring(0, dashPosition - 1); // Get the part without the *
stablePart += "0";
var versionParts = stablePart.Split('.').Length;
if (versionParts == 2)
switch (versionParts)
{
behavior = NuGetVersionFloatBehavior.PrereleaseMinor;
}
else if (versionParts == 3)
{
behavior = NuGetVersionFloatBehavior.PrereleasePatch;
}
else if (versionParts == 4)
{
behavior = NuGetVersionFloatBehavior.PrereleaseRevision;
case 1:
behavior = NuGetVersionFloatBehavior.PrereleaseMajor;
break;
case 2:
behavior = NuGetVersionFloatBehavior.PrereleaseMinor;
break;
case 3:
behavior = NuGetVersionFloatBehavior.PrereleasePatch;
break;
case 4:
behavior = NuGetVersionFloatBehavior.PrereleaseRevision;
break;
default:
break;
}

var releaseVersion = versionString.Substring(dashPosition + 1);
Expand Down Expand Up @@ -339,6 +350,9 @@ public override string ToString()
case NuGetVersionFloatBehavior.PrereleaseMinor:
result = string.Format(CultureInfo.InvariantCulture, "{0}.*-{1}*", MinVersion.Major, _releasePrefix);
break;
case NuGetVersionFloatBehavior.PrereleaseMajor:
result = string.Format(CultureInfo.InvariantCulture, "*-{1}*", MinVersion.Major, _releasePrefix);
break;
case NuGetVersionFloatBehavior.AbsoluteLatest:
result = "*-*";
break;
Expand Down
8 changes: 7 additions & 1 deletion src/NuGet.Core/NuGet.Versioning/NuGetVersionFloatBehavior.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public enum NuGetVersionFloatBehavior
Major,

/// <summary>
/// Float major and pre-release
/// Float major and pre-release, *-*
/// </summary>
AbsoluteLatest,

Expand All @@ -57,5 +57,11 @@ public enum NuGetVersionFloatBehavior
/// Float minor and pre-release x.*-*
/// </summary>
PrereleaseMinor,

/// <summary>
/// Float major and prerelease, but only with partial prerelease *-rc.*.
/// *-* is captured by <see cref="AbsoluteLatest"/>
/// </summary>
PrereleaseMajor,
}
}
4 changes: 4 additions & 0 deletions src/NuGet.Core/NuGet.Versioning/VersionRange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ public bool IsBetter(NuGetVersion current, NuGetVersion considering)
if (!HasPrereleaseBounds
&& considering.IsPrerelease
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.Prerelease
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.PrereleaseMajor
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.PrereleaseMinor
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.PrereleasePatch
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.PrereleaseRevision
&& _floatRange?.FloatBehavior != NuGetVersionFloatBehavior.AbsoluteLatest)
{
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/NuGet.Core/NuGet.Versioning/VersionRangeFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public static bool TryParse(string value, bool allowFloating, out VersionRange v
&& charArray[0] == '-'
&& charArray[0] == '*')
{
versionRange = new VersionRange(new NuGetVersion(0, 0, 0, releaseLabel: "0"), true, null, true, FloatRange.Parse(trimmedValue), originalString: value);
versionRange = new VersionRange(new NuGetVersion("0.0.0-0"), true, null, true, FloatRange.Parse(trimmedValue), originalString: value);
return true;
}

Expand Down
144 changes: 99 additions & 45 deletions test/NuGet.Core.Tests/NuGet.Versioning.Test/FloatingRangeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,6 @@ namespace NuGet.Versioning.Test
{
public class FloatingRangeTests
{
[Fact]
public void FloatRange_Float()
{
var range = new VersionRange(NuGetVersion.Parse("2.2.0"), true, null, false, new FloatRange(NuGetVersionFloatBehavior.AbsoluteLatest));

var versions = new List<NuGetVersion>()
{
NuGetVersion.Parse("0.1.0"),
NuGetVersion.Parse("1.0.0-alpha.2"),
NuGetVersion.Parse("2.0.0"),
NuGetVersion.Parse("2.2.0"),
NuGetVersion.Parse("3.0.0-pre"),
};

Assert.Equal(NuGetVersion.Parse("3.0.0-pre"), range.FindBestMatch(versions));
}


[Fact]
public void FloatRange_OutsideOfRange()
{
Expand Down Expand Up @@ -274,7 +256,6 @@ public void FloatingRange_FloatPrereleaseBest()
[Fact]
public void FloatingRange_FloatPrereleaseNotFoundBest()
{
// "1.0.0-*"
var range = VersionRange.Parse("1.0.0-*");

var versions = new List<NuGetVersion>()
Expand Down Expand Up @@ -426,6 +407,17 @@ public void FloatingRange_ToStringAbsoluteLatest()
Assert.Equal(NuGetVersionFloatBehavior.AbsoluteLatest, range.Float.FloatBehavior);
}

[Fact]
public void FloatingRange_ToStringPrereleaseMajor()
{
var range = VersionRange.Parse("*-rc.*");

Assert.Equal("[*-rc.*, )", range.ToNormalizedString());
Assert.Equal("0.0.0-rc.0", range.MinVersion.ToNormalizedString());
Assert.Equal("0.0.0-rc.0", range.Float.MinVersion.ToNormalizedString());
Assert.Equal(NuGetVersionFloatBehavior.PrereleaseMajor, range.Float.FloatBehavior);
}

[Fact]
public void FloatingRange_FloatPrereleaseRev()
{
Expand Down Expand Up @@ -453,6 +445,15 @@ public void FloatingRange_FloatPrereleaseMinor()
Assert.Equal(NuGetVersionFloatBehavior.PrereleaseMinor, range.FloatBehavior);
}

[Fact]
public void FloatingRange_FloatMajorPrerelease()
{
var range = FloatRange.Parse("*-rc.*");

Assert.Equal("0.0.0-rc.0", range.MinVersion.ToNormalizedString());
Assert.Equal(NuGetVersionFloatBehavior.PrereleaseMajor, range.FloatBehavior);
}

[Fact]
public void FloatingRange_FloatAbsoluteLatest()
{
Expand All @@ -462,6 +463,34 @@ public void FloatingRange_FloatAbsoluteLatest()
Assert.Equal(NuGetVersionFloatBehavior.AbsoluteLatest, range.FloatBehavior);
}

[Theory]
[InlineData("*", "0.0.0")]
[InlineData("*-*", "0.0.0-0")]
[InlineData("1.*", "1.0.0")]
[InlineData("1.1.*", "1.1.0")]
[InlineData("1.1.*-*", "1.1.0-0")]
[InlineData("1.1.1-*", "1.1.1-0")]
[InlineData("1.1.1-beta*", "1.1.1-beta")]
[InlineData("1.1.1-1*", "1.1.1-1")]
[InlineData("1.1.*-beta*", "1.1.0-beta")]
[InlineData("1.1.*-1*", "1.1.0-1")]
[InlineData("1.0.0-beta.1*", "1.0.0-beta.1")]
[InlineData("1.0.*-beta.1*", "1.0.0-beta.1")]
[InlineData("1.0.0-b-*", "1.0.0-b-")]
[InlineData("1.0.*-b-*", "1.0.0-b-")]
[InlineData("1.1.0-beta.*", "1.1.0-beta.0")]
[InlineData("1.1.*-beta.*", "1.1.0-beta.0")]
[InlineData("*-beta.*", "0.0.0-beta.0")]

public void FloatRange_ParsesCorrectMinVersion(string versionRange, string normalizedMinVersion)
{
var range = FloatRange.Parse(versionRange);

Assert.Equal(normalizedMinVersion, range.MinVersion.ToNormalizedString());
}

/// TODO NK - From here on below, the tests can probably be moved to VersionRangeFloatParsing_FindsBestMatch

[Fact]
public void FloatRange_FloatingPrereleaseRevision_OutsideOfRange()
{
Expand Down Expand Up @@ -950,6 +979,57 @@ public void FloatRange_PrereleaseMinor_NotMatching_SelectsFirstInRange()
Assert.Equal("1.20.0-alph.3", range.FindBestMatch(versions).ToNormalizedString());
}

[Fact]
public void FloatRange_PrereleaseMajor_IgnoresPartialPrereleaseMatches()
{
var range = VersionRange.Parse("[*-alpha*, )");

var versions = new List<NuGetVersion>()
{
NuGetVersion.Parse("0.1.0"),
NuGetVersion.Parse("0.2.0"),
NuGetVersion.Parse("1.0.0-alpha.2"),
NuGetVersion.Parse("1.9.0"),
NuGetVersion.Parse("1.20.0-alph.3"),
};

Assert.Equal("1.9.0", range.FindBestMatch(versions).ToNormalizedString());
}

[Fact]
public void FloatRange_PrereleaseMajor_NotMatching_SelectsFirstInRange()
{
var range = VersionRange.Parse("[*-rc*, )");

var versions = new List<NuGetVersion>()
{
NuGetVersion.Parse("0.1.0-beta"),
NuGetVersion.Parse("1.0.0-alpha.2"),
NuGetVersion.Parse("1.9.0-alpha.2"),
NuGetVersion.Parse("2.0.0-alpha.2"),
};

Assert.Equal("0.1.0-beta", range.FindBestMatch(versions).ToNormalizedString());
}

[Fact]
public void FloatRange_PrereleaseMajor_BestMatching()
{
var range = VersionRange.Parse("*-rc*");

var versions = new List<NuGetVersion>()
{
NuGetVersion.Parse("1.1.0"),
NuGetVersion.Parse("1.2.0-rc.1"),
NuGetVersion.Parse("1.2.0-rc.2"),
NuGetVersion.Parse("1.2.0-rc1"),
NuGetVersion.Parse("2.0.0"),
NuGetVersion.Parse("3.0.0-beta.1")
};

Assert.Equal("2.0.0", range.FindBestMatch(versions).ToNormalizedString());
}

[Fact]
public void FloatRange_FloatingPrereleaseRevision_WithPartialMatch()
{
Expand Down Expand Up @@ -1064,31 +1144,5 @@ public void FloatRange_FloatingPrereleaseMinor_WithExtraDashes()

Assert.Equal("1.9.0--beta", range.FindBestMatch(versions).ToNormalizedString());
}


[Theory]
[InlineData("*", "0.0.0")]
[InlineData("*-*", "0.0.0-0")]
[InlineData("1.*", "1.0.0")]
[InlineData("1.1.*", "1.1.0")]
[InlineData("1.1.*-*", "1.1.0-0")]
[InlineData("1.1.1-*", "1.1.1-0")]
[InlineData("1.1.1-beta*", "1.1.1-beta")]
[InlineData("1.1.1-1*", "1.1.1-1")]
[InlineData("1.1.*-beta*", "1.1.0-beta")]
[InlineData("1.1.*-1*", "1.1.0-1")]
[InlineData("1.0.0-beta.1*", "1.0.0-beta.1")]
[InlineData("1.0.*-beta.1*", "1.0.0-beta.1")]
[InlineData("1.0.0-b-*", "1.0.0-b-")]
[InlineData("1.0.*-b-*", "1.0.0-b-")]
[InlineData("1.1.0-beta.*", "1.1.0-beta.0")]
[InlineData("1.1.*-beta.*", "1.1.0-beta.0")]

public void FloatRange_ParsesCorrectMinVersion(string versionRange, string normalizedMinVersion)
{
var range = FloatRange.Parse(versionRange);

Assert.Equal(normalizedMinVersion, range.MinVersion.ToNormalizedString());
}
}
}
Loading

0 comments on commit b9882c7

Please sign in to comment.