55 lines
1.3 KiB
C#
55 lines
1.3 KiB
C#
|
|
using Theriapolis.Core.Time;
|
||
|
|
using Xunit;
|
||
|
|
|
||
|
|
namespace Theriapolis.Tests.Entities;
|
||
|
|
|
||
|
|
public sealed class WorldClockTests
|
||
|
|
{
|
||
|
|
[Fact]
|
||
|
|
public void Advance_AccumulatesSeconds()
|
||
|
|
{
|
||
|
|
var c = new WorldClock();
|
||
|
|
c.Advance(120);
|
||
|
|
c.Advance(30);
|
||
|
|
Assert.Equal(150, c.InGameSeconds);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void DayHourMinute_DerivedFromSeconds()
|
||
|
|
{
|
||
|
|
var c = new WorldClock();
|
||
|
|
c.Advance(WorldClock.SecondsPerDay * 3 + WorldClock.SecondsPerHour * 14 + WorldClock.SecondsPerMinute * 27);
|
||
|
|
Assert.Equal(3, c.Day);
|
||
|
|
Assert.Equal(14, c.Hour);
|
||
|
|
Assert.Equal(27, c.Minute);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void Season_RotatesWithDays()
|
||
|
|
{
|
||
|
|
var c = new WorldClock();
|
||
|
|
// Advance past one full season (24 days).
|
||
|
|
c.Advance(WorldClock.SecondsPerDay * WorldClock.DaysPerSeason + 1);
|
||
|
|
Assert.Equal(Season.Summer, c.Season);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void RoundTrip_RestoresState()
|
||
|
|
{
|
||
|
|
var c = new WorldClock();
|
||
|
|
c.Advance(98765);
|
||
|
|
var s = c.CaptureState();
|
||
|
|
|
||
|
|
var c2 = new WorldClock();
|
||
|
|
c2.RestoreState(s);
|
||
|
|
Assert.Equal(98765, c2.InGameSeconds);
|
||
|
|
}
|
||
|
|
|
||
|
|
[Fact]
|
||
|
|
public void Advance_RejectsNegative()
|
||
|
|
{
|
||
|
|
var c = new WorldClock();
|
||
|
|
Assert.Throws<ArgumentOutOfRangeException>(() => c.Advance(-5));
|
||
|
|
}
|
||
|
|
}
|