b451f83174
Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
72 lines
2.6 KiB
C#
72 lines
2.6 KiB
C#
using Theriapolis.Core;
|
|
using Theriapolis.Core.Persistence;
|
|
using Theriapolis.Core.Persistence.SaveMigrations;
|
|
using Xunit;
|
|
|
|
namespace Theriapolis.Tests.Persistence;
|
|
|
|
/// <summary>
|
|
/// Phase 6.5 M0 — additive V6→V7 migration. Every v6 field carries over
|
|
/// unchanged; the new <see cref="PlayerCharacterState.SubclassId"/>,
|
|
/// <see cref="PlayerCharacterState.LearnedFeatureIds"/>, and
|
|
/// <see cref="PlayerCharacterState.LevelUpHistory"/> default-initialise
|
|
/// to empty values.
|
|
/// </summary>
|
|
public sealed class V6ToV7MigrationTests
|
|
{
|
|
[Fact]
|
|
public void V6Header_IsAcceptedByMigration()
|
|
{
|
|
var header = new SaveHeader { Version = 6 };
|
|
Assert.True(SaveCodec.IsCompatible(header),
|
|
"v6 must remain readable post-Phase-6.5 (MIN_VERSION = 5).");
|
|
|
|
var body = new SaveBody();
|
|
bool ok = Migrations.MigrateUp(header, body);
|
|
Assert.True(ok);
|
|
Assert.Equal(C.SAVE_SCHEMA_VERSION, header.Version);
|
|
}
|
|
|
|
[Fact]
|
|
public void V6SaveBody_AfterMigration_HasFreshLevelUpFields()
|
|
{
|
|
var header = new SaveHeader { Version = 6 };
|
|
var body = new SaveBody
|
|
{
|
|
Player = new() { Name = "Wanderer", PositionX = 10, PositionY = 10 },
|
|
PlayerCharacter = new()
|
|
{
|
|
CladeId = "canidae", SpeciesId = "wolf",
|
|
ClassId = "fangsworn", BackgroundId = "pack_raised",
|
|
STR = 15, DEX = 12, CON = 13, INT = 10, WIS = 13, CHA = 8,
|
|
Level = 1, Xp = 0, MaxHp = 11, CurrentHp = 11,
|
|
},
|
|
};
|
|
|
|
bool ok = Migrations.MigrateUp(header, body);
|
|
Assert.True(ok);
|
|
Assert.Equal(C.SAVE_SCHEMA_VERSION, header.Version);
|
|
|
|
// Existing fields untouched.
|
|
Assert.Equal("Wanderer", body.Player.Name);
|
|
Assert.Equal(1, body.PlayerCharacter!.Level);
|
|
|
|
// New v7 fields default-initialised to empty.
|
|
Assert.Equal("", body.PlayerCharacter.SubclassId);
|
|
Assert.Empty(body.PlayerCharacter.LearnedFeatureIds);
|
|
Assert.Empty(body.PlayerCharacter.LevelUpHistory);
|
|
}
|
|
|
|
[Fact]
|
|
public void NewSaveHeader_DefaultsToCurrentSchemaVersion()
|
|
{
|
|
// Phase 7 M0 bumped SAVE_SCHEMA_VERSION to 8; the old test
|
|
// hardcoded 7. This version-of-record test is an early-warning
|
|
// that future bumps remember to add a chained migration entry.
|
|
var header = new SaveHeader();
|
|
Assert.Equal(C.SAVE_SCHEMA_VERSION, header.Version);
|
|
Assert.True(header.Version >= 7,
|
|
"Schema version must not regress below the v7 floor introduced in Phase 6.5.");
|
|
}
|
|
}
|