feat: update Godot integration and coordinated package dependencies
This commit is contained in:
11 files changed
+525
-49
No files matched your search
@@ -1,5 +1,7 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using NUnit.Framework;
|
||||
using UnityEngine;
|
||||
@@ -199,6 +201,48 @@ namespace ShrinkDataSaver.Tests
|
||||
CollectionAssert.AreEqual(backupBytes, repairedPrimary);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator LoadAsync_FallsBackToSecondaryBackup_WhenPrimaryAndFirstBackupCorrupted() =>
|
||||
UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
ShrinkSettings.Set("lang", "zh_cn");
|
||||
await ShrinkSettings.SaveAsync();
|
||||
|
||||
var backupBytes = await _storage.ReadAsync("settings.json");
|
||||
await _storage.WriteAsync("settings.json.bak2", backupBytes);
|
||||
await _storage.WriteAsync("settings.json.bak1", System.Text.Encoding.UTF8.GetBytes("{ broken"));
|
||||
await _storage.WriteAsync("settings.json", System.Text.Encoding.UTF8.GetBytes("{ broken"));
|
||||
|
||||
ShrinkSettings.ResetForTesting();
|
||||
ShrinkSettings.Initialize(_storage, "settings.json");
|
||||
|
||||
await ShrinkSettings.LoadAsync();
|
||||
|
||||
Assert.AreEqual("zh_cn", ShrinkSettings.Get<string>("lang"));
|
||||
var repairedPrimary = await _storage.ReadAsync("settings.json");
|
||||
CollectionAssert.AreEqual(backupBytes, repairedPrimary);
|
||||
});
|
||||
|
||||
[UnityTest]
|
||||
public IEnumerator SaveAsync_PropagatesStorageFailure() => UniTask.ToCoroutine(async () =>
|
||||
{
|
||||
ShrinkSettings.ResetForTesting();
|
||||
ShrinkSettings.Initialize(new FailingStorageProvider(), "settings.json");
|
||||
ShrinkSettings.Set("lang", "zh_cn");
|
||||
|
||||
var failed = false;
|
||||
try
|
||||
{
|
||||
await ShrinkSettings.SaveAsync();
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
failed = true;
|
||||
}
|
||||
|
||||
Assert.IsTrue(failed);
|
||||
});
|
||||
|
||||
// ── Overwrite ──
|
||||
|
||||
[Test]
|
||||
@@ -208,5 +252,23 @@ namespace ShrinkDataSaver.Tests
|
||||
ShrinkSettings.Set("key", "second");
|
||||
Assert.AreEqual("second", ShrinkSettings.Get<string>("key"));
|
||||
}
|
||||
|
||||
private sealed class FailingStorageProvider : IStorageProvider
|
||||
{
|
||||
public UniTask WriteAsync(string path, byte[] data, CancellationToken ct = default) =>
|
||||
throw new IOException("write failed");
|
||||
|
||||
public UniTask<byte[]> ReadAsync(string path, CancellationToken ct = default) =>
|
||||
throw new FileNotFoundException(path);
|
||||
|
||||
public UniTask<bool> ExistsAsync(string path, CancellationToken ct = default) =>
|
||||
UniTask.FromResult(false);
|
||||
|
||||
public UniTask DeleteAsync(string path, CancellationToken ct = default) =>
|
||||
UniTask.CompletedTask;
|
||||
|
||||
public UniTask<string[]> ListAsync(string prefix = "", CancellationToken ct = default) =>
|
||||
UniTask.FromResult(System.Array.Empty<string>());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user