feat: update Godot integration and coordinated package dependencies
Publish UPM package / publish (push) Successful in 2s
Publish NuGet packages / publish (push) Successful in 4m2s

This commit is contained in:
cneicy committed 2026-11-06 19:13:16 +08:00
1 parent cdb682f484
commit 67d6814c4b
11 files changed
+525 -49

No files matched your search

+62
View File
@@ -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>());
}
}
}