diff --git a/src/AcDream.Launcher.Core/Installation/LauncherInstaller.cs b/src/AcDream.Launcher.Core/Installation/LauncherInstaller.cs index f936aaa3..1307ddab 100644 --- a/src/AcDream.Launcher.Core/Installation/LauncherInstaller.cs +++ b/src/AcDream.Launcher.Core/Installation/LauncherInstaller.cs @@ -1,6 +1,7 @@ using AcDream.Launcher.Core.Integrity; using AcDream.Launcher.Core.Launching; using AcDream.Platform; +using System.Globalization; namespace AcDream.Launcher.Core.Installation; @@ -326,9 +327,9 @@ public sealed class LauncherInstaller : ILauncherInstaller { string message = $"The optimized world-data rebuild needs at least " - + $"{FullRebuildRequiredFreeBytes / (1024d * 1024d * 1024d):N1} GiB free " + + $"{FormatGiB(FullRebuildRequiredFreeBytes)} GiB free " + $"beside the active package; only " - + $"{availableBytes / (1024d * 1024d * 1024d):N1} GiB is available."; + + $"{FormatGiB(availableBytes)} GiB is available."; Report(progress, LauncherInstallPhase.Failed, message); throw new LauncherInstallException(message); } @@ -636,6 +637,9 @@ public sealed class LauncherInstaller : ILauncherInstaller .ConfigureAwait(false); } + private static string FormatGiB(long bytes) => + (bytes / (1024d * 1024d * 1024d)).ToString("N1", CultureInfo.InvariantCulture); + public async Task ApplyContentUpdateAsync( string datDirectory, int threads, diff --git a/tests/AcDream.Launcher.Core.Tests/Installation/LauncherInstallerTests.cs b/tests/AcDream.Launcher.Core.Tests/Installation/LauncherInstallerTests.cs index dcd326f9..0ad09778 100644 --- a/tests/AcDream.Launcher.Core.Tests/Installation/LauncherInstallerTests.cs +++ b/tests/AcDream.Launcher.Core.Tests/Installation/LauncherInstallerTests.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Globalization; using System.Text.Json.Nodes; using AcDream.Launcher.Core.Integrity; using AcDream.Launcher.Core.Installation; @@ -150,28 +151,37 @@ public sealed class LauncherInstallerTests : IDisposable [Fact] public async Task InsufficientFreeSpaceStopsBeforeBakeAndReportsExactRequirement() { - bool childStarted = false; - var runner = new FakeBakeProcessRunner((_, _, _) => + CultureInfo originalCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("sv-SE"); + try { - childStarted = true; - return Task.FromResult(new BakeProcessResult(0, string.Empty)); - }); - var installer = new LauncherInstaller( - _paths, - _bakeExecutable, - processRunner: runner, - availableFreeSpace: _ => - LauncherInstaller.FullRebuildRequiredFreeBytes - 1); + bool childStarted = false; + var runner = new FakeBakeProcessRunner((_, _, _) => + { + childStarted = true; + return Task.FromResult(new BakeProcessResult(0, string.Empty)); + }); + var installer = new LauncherInstaller( + _paths, + _bakeExecutable, + processRunner: runner, + availableFreeSpace: _ => + LauncherInstaller.FullRebuildRequiredFreeBytes - 1); - LauncherInstallException error = await Assert.ThrowsAsync( - () => installer.InstallAsync(_dats, threads: 2)); + LauncherInstallException error = await Assert.ThrowsAsync( + () => installer.InstallAsync(_dats, threads: 2)); - Assert.False(childStarted); - Assert.Contains("2.0 GiB", error.Message, StringComparison.Ordinal); - Assert.Contains("active package", error.Message, StringComparison.Ordinal); - Assert.False(File.Exists( - LauncherInstaller.GetFullRebuildCandidatePath( - Path.Combine(_paths.DataDirectory, "pak", "acdream.pak")))); + Assert.False(childStarted); + Assert.Contains("2.0 GiB", error.Message, StringComparison.Ordinal); + Assert.Contains("active package", error.Message, StringComparison.Ordinal); + Assert.False(File.Exists( + LauncherInstaller.GetFullRebuildCandidatePath( + Path.Combine(_paths.DataDirectory, "pak", "acdream.pak")))); + } + finally + { + CultureInfo.CurrentCulture = originalCulture; + } } [Fact]