78 lines
2.8 KiB
C#
78 lines
2.8 KiB
C#
using CapySR.Common;
|
|||
|
|
using Xunit;
|
||
|
|
|
||
|
|
namespace CapySR.Tests;
|
||
|
|
|
||
|
|
// A beta dispatch stops answering once its window closes, so a client that updated past
|
||
|
|
// everything in config/versions.json has to be served from the closest build on hand.
|
||
|
|
public class GameVersionTests
|
||
|
|
{
|
||
|
|
private static readonly string[] Cached =
|
||
|
|
[
|
||
|
|
"OSBETAWin4.4.51",
|
||
|
|
"CNBETAWin4.4.53",
|
||
|
|
"CNBETAWin4.5.51",
|
||
|
|
"CNBETAWin4.5.52",
|
||
|
|
];
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void VersionsParseIntoAChannelAndNumbers()
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryParse("CNBETAWin4.5.53", out var version));
|
||
|
|
Assert.Equal("CNBETAWin", version.Channel);
|
||
|
|
Assert.Equal([4, 5, 53], version.Parts);
|
||
|
|
|
||
|
|
Assert.False(GameVersion.TryParse("nonsense", out _));
|
||
|
|
Assert.False(GameVersion.TryParse("CNBETAWin4.5.x", out _));
|
||
|
|
Assert.False(GameVersion.TryParse("", out _));
|
||
|
|
Assert.False(GameVersion.TryParse(null, out _));
|
||
|
|
}
|
||
|
|
|
||
|
|
[Theory]
|
||
|
|
[InlineData("CNBETAWin4.5.52", "CNBETAWin4.5.53", -1)]
|
||
|
|
[InlineData("CNBETAWin4.5.53", "CNBETAWin4.5.52", 1)]
|
||
|
|
[InlineData("CNBETAWin4.5.53", "CNBETAWin4.5.53", 0)]
|
||
|
|
[InlineData("CNBETAWin4.9.0", "CNBETAWin4.10.0", -1)]
|
||
|
|
// a missing trailing part counts as zero, so 4.5 and 4.5.0 are the same build
|
||
|
|
[InlineData("CNBETAWin4.5", "CNBETAWin4.5.0", 0)]
|
||
|
|
public void VersionsCompareNumerically(string left, string right, int expected)
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryParse(left, out var a));
|
||
|
|
Assert.True(GameVersion.TryParse(right, out var b));
|
||
|
|
Assert.Equal(expected, Math.Sign(a.CompareTo(b)));
|
||
|
|
}
|
||
|
|
|
||
|
|
// the case that matters: the client updated past anything the dispatch will still serve
|
||
|
|
[Fact]
|
||
|
|
public void ANewerClientBorrowsTheClosestOlderBuild()
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryFindNearest(Cached, "CNBETAWin4.5.53", out var nearest));
|
||
|
|
Assert.Equal("CNBETAWin4.5.52", nearest);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void ChannelsNeverBorrowFromEachOther()
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryFindNearest(Cached, "OSBETAWin4.9.99", out var os));
|
||
|
|
Assert.Equal("OSBETAWin4.4.51", os);
|
||
|
|
|
||
|
|
Assert.False(GameVersion.TryFindNearest(Cached, "CNPRODWin4.5.53", out _));
|
||
|
|
Assert.False(GameVersion.TryFindNearest(Cached, "nonsense", out _));
|
||
|
|
Assert.False(GameVersion.TryFindNearest([], "CNBETAWin4.5.53", out _));
|
||
|
|
}
|
||
|
|
|
||
|
|
// nothing older to fall back on, so the newest known build beats having no urls at all
|
||
|
|
[Fact]
|
||
|
|
public void AnOlderClientStillGetsUrls()
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryFindNearest(Cached, "CNBETAWin3.0.0", out var nearest));
|
||
|
|
Assert.Equal("CNBETAWin4.5.52", nearest);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void AnExactMatchIsPreferredOverEverythingElse()
|
||
|
|
{
|
||
|
|
Assert.True(GameVersion.TryFindNearest(Cached, "CNBETAWin4.5.51", out var nearest));
|
||
|
|
Assert.Equal("CNBETAWin4.5.51", nearest);
|
||
|
|
}
|
||
|
|
}
|