Preserve damaged backup evidence across later saves
This commit is contained in:
@@ -75,6 +75,18 @@ namespace MagnetismHeroes.Tests
|
||||
Assert.That(Directory.GetFiles(_directory, "*.damaged-*").Select(File.ReadAllText), Does.Contain("broken-primary"));
|
||||
Assert.That(File.ReadAllText(_path + ".bak"), Is.EqualTo("broken-backup"));
|
||||
}
|
||||
[Test] public void BothDamagedOriginalsSurviveTwoSubsequentSuccessfulWrites()
|
||||
{
|
||||
File.WriteAllText(_path, "distinct-broken-primary"); File.WriteAllText(_path + ".bak", "distinct-broken-backup");
|
||||
var store = Store(); Assert.That(store.TryLoad(out _, out _), Is.False);
|
||||
Assert.That(store.TrySave(new ProgressSave(), out var error), Is.True, error);
|
||||
Assert.That(store.TrySave(Puzzle(), out error), Is.True, error);
|
||||
var forensic = Directory.GetFiles(_directory, "*.damaged-*").Select(File.ReadAllText).ToArray();
|
||||
Assert.That(forensic, Does.Contain("distinct-broken-primary"));
|
||||
Assert.That(forensic, Does.Contain("distinct-broken-backup"));
|
||||
Assert.That(store.TryLoad(out var restored, out error), Is.True, error);
|
||||
Assert.That(restored.puzzleStates.Single().stageId, Is.EqualTo(1));
|
||||
}
|
||||
[Test] public void InvalidGroupMembershipDoesNotReplaceAValidSave()
|
||||
{
|
||||
var store = Store(); var progress = Puzzle(); Assert.That(store.TrySave(progress, out _), Is.True);
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
|
||||
private readonly string _path;
|
||||
private readonly IReadOnlyList<StageDefinition> _definitions;
|
||||
private bool _preserveDamagedOriginal;
|
||||
private bool _preserveDamagedBackup;
|
||||
private sealed class SaveFieldsResolver : DefaultContractResolver
|
||||
{
|
||||
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization serialization)
|
||||
@@ -32,6 +33,7 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
|
||||
if (Read(_path + ".bak", out save, out var backupError))
|
||||
{ error = "Recovered valid backup: " + originalError; _preserveDamagedOriginal = true; return true; }
|
||||
_preserveDamagedOriginal = true;
|
||||
_preserveDamagedBackup = File.Exists(_path + ".bak");
|
||||
error = "Invalid primary and backup: " + originalError + "; " + backupError;
|
||||
return false;
|
||||
}
|
||||
@@ -105,6 +107,11 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
|
||||
File.Copy(_path, _path + ".damaged-" + Guid.NewGuid().ToString("N"));
|
||||
_preserveDamagedOriginal = false;
|
||||
}
|
||||
if (_preserveDamagedBackup && File.Exists(_path + ".bak"))
|
||||
{
|
||||
File.Copy(_path + ".bak", _path + ".bak.damaged-" + Guid.NewGuid().ToString("N"));
|
||||
_preserveDamagedBackup = false;
|
||||
}
|
||||
using (var stream = new FileStream(temporary, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
using (var writer = new StreamWriter(stream))
|
||||
{ createdTemporary = true; writer.Write(JsonConvert.SerializeObject(save, Formatting.Indented, SerializerSettings)); writer.Flush(); stream.Flush(true); }
|
||||
|
||||
Reference in New Issue
Block a user