using Microsoft.Xna.Framework; using MrGameEng.Core; using MrGameEng.Lighting; using Xunit; namespace MrGameEng.Lighting.Tests; public class DayNightTests { private static (GameClock Clock, DayNight DayNight) Make() { var clock = new GameClock(); var calendar = new Calendar(clock, secondsPerDay: 24f); // 1 second = 1 in-game hour return (clock, new DayNight(calendar, DayNightSettings.Default)); } [Fact] public void Daylight_ZeroAtMidnight_OneAtNoon() { var (clock, dayNight) = Make(); Assert.Equal(0f, dayNight.Daylight, 3); // 00:00 clock.Advance(12f); // 12:00 Assert.Equal(1f, dayNight.Daylight, 3); } [Fact] public void Daylight_RisesFromDawnToNoon() { var (clock, dayNight) = Make(); clock.Advance(6f); // 06:00 var dawn = dayNight.Daylight; clock.Advance(3f); // 09:00 var mid = dayNight.Daylight; clock.Advance(3f); // 12:00 var noon = dayNight.Daylight; Assert.True(dawn < mid && mid < noon, "daylight should rise from dawn to noon"); } [Fact] public void SunShadow_ZeroAtNight_PointsWestInMorning_EastInAfternoon_ShortAtNoon() { var (clock, dayNight) = Make(); // 1s = 1 in-game hour Assert.Equal(Vector2.Zero, dayNight.SunShadow(8f)); // 00:00 — night, no sun clock.Advance(7f); // 07:00 — low morning sun in the east var morning = dayNight.SunShadow(8f); Assert.True(morning.X < 0f, "morning shadow points west"); Assert.True(morning.Length() > 2f, "low sun casts a long shadow"); clock.Advance(5f); // 12:00 — sun overhead Assert.True(dayNight.SunShadow(8f).Length() < 1f, "noon sun casts almost no shadow"); clock.Advance(5f); // 17:00 — afternoon sun in the west Assert.True(dayNight.SunShadow(8f).X > 0f, "afternoon shadow points east"); } [Fact] public void Ambient_DarkerAtNightThanAtNoon() { var (clock, dayNight) = Make(); var night = dayNight.Ambient; // 00:00 clock.Advance(12f); // 12:00 var noon = dayNight.Ambient; Assert.True(night.R < noon.R && night.G < noon.G && night.B < noon.B); Assert.Equal(255, noon.R); // day color is white at noon } }