feat(progression): Coins, LevelTime, SkillLevel core invariants (slice 1)

three bug-encoding invariants, one red/green cycle each:
- Coins.TrySubtract fails instead of clamping
- LevelTime rejects zero (continued-run zero best-times)
- SkillLevel has no zero (unowned is absence, not Level=1)

plan: drop signed NetCoins; add Attempt outcome as idempotency guard
This commit is contained in:
2026-07-28 18:22:46 +02:00
parent c3bbf3282a
commit 313a5315b1
7 changed files with 142 additions and 7 deletions

View File

@@ -0,0 +1,13 @@
namespace Mr.BrickAdventures.Progression.Tests;
public class LevelTimeTests
{
[Fact]
public void Zero_is_not_a_completion_time()
{
// GetCurrentLevelTime() returns 0 whenever the speedrun timer was never started, which
// today is every continued run — so zero-second "best times" get written to the ghost
// files. Rejecting zero makes that unrepresentable rather than merely unlikely.
Assert.Throws<ArgumentOutOfRangeException>(() => LevelTime.Of(0));
}
}