using UnitTestSharp; using Azimuth; using Annulus; namespace Glass.UnitTests { public class SpotlightMaterialTests : TestFixture { public static readonly Rect Screen = Rect.FromTwoPoints(Vector.Zero, new Vector(800, 600)); public static readonly Rect Hole = Rect.FromTwoPoints(new Vector(100, 100), new Vector(300, 250)); public static SpotlightMaterial Spotlight => new SpotlightMaterial { DimMaterial = new SolidColorMaterial { DebugName = "dim" }, }; public class CtorTests : TestFixture { public void StartsWithARoomForTheDimAndNothingInIt() { CheckEqual(1, new SpotlightMaterial().ChildMaterials.Count); CheckNull(new SpotlightMaterial().DimMaterial); } } public class DimMaterialTests : TestFixture { public void Set_IsReadBack() { var dim = new SolidColorMaterial(); CheckEqual(dim, new SpotlightMaterial { DimMaterial = dim }.DimMaterial); } public void Set_IsWhatChildMaterialsReports() { var dim = new SolidColorMaterial(); CheckEqual(dim, new SpotlightMaterial { DimMaterial = dim }.ChildMaterials[0]); } } public class ArrangeTests : TestFixture { public void SplitsTheScreenIntoFourBandsAroundTheHole() { SpotlightMaterial.Rects rects = Spotlight.Arrange(Hole, Screen); CheckEqual(Rect.FromTwoPoints(new Vector(0, 0), new Vector(800, 100)), rects.Top); CheckEqual(Rect.FromTwoPoints(new Vector(0, 250), new Vector(800, 600)), rects.Bottom); CheckEqual(Rect.FromTwoPoints(new Vector(0, 100), new Vector(100, 250)), rects.Left); CheckEqual(Rect.FromTwoPoints(new Vector(300, 100), new Vector(800, 250)), rects.Right); } public void HoleAgainstAScreenCorner_FlattensTheBandsBesideItRatherThanInvertingThem() { Rect corner = Rect.FromTwoPoints(Vector.Zero, new Vector(300, 250)); SpotlightMaterial.Rects rects = Spotlight.Arrange(corner, Screen); CheckEqual(0, rects.Top.Height); CheckEqual(0, rects.Left.Width); CheckEqual(Rect.FromTwoPoints(new Vector(0, 250), new Vector(800, 600)), rects.Bottom); CheckEqual(Rect.FromTwoPoints(new Vector(300, 0), new Vector(800, 250)), rects.Right); } public void HoleOffScreen_LeavesOneBandCoveringTheWholeScreen() { Rect away = Rect.FromTwoPoints(new Vector(900, 700), new Vector(1000, 800)); SpotlightMaterial.Rects rects = Spotlight.Arrange(away, Screen); CheckEqual(Screen, rects.Bottom); CheckEqual(0, rects.Top.Height); CheckEqual(0, rects.Left.Width); CheckEqual(0, rects.Right.Height); } public void HoleStraddlingAnEdge_BandsStopAtTheScreenRatherThanFollowingItOut() { Rect straddling = Rect.FromTwoPoints(new Vector(-50, 100), new Vector(300, 250)); SpotlightMaterial.Rects rects = Spotlight.Arrange(straddling, Screen); CheckEqual(0, rects.Left.Width); CheckEqual(new Scalar(0), rects.Top.Left); CheckEqual(Rect.FromTwoPoints(new Vector(300, 100), new Vector(800, 250)), rects.Right); } public void ScreenAwayFromTheOrigin_BandsFollowIt() { Rect offsetScreen = Rect.FromTwoPoints(new Vector(1000, 500), new Vector(1800, 1100)); Rect hole = Rect.FromTwoPoints(new Vector(1100, 600), new Vector(1300, 750)); SpotlightMaterial.Rects rects = Spotlight.Arrange(hole, offsetScreen); CheckEqual(Rect.FromTwoPoints(new Vector(1000, 500), new Vector(1800, 600)), rects.Top); CheckEqual(Rect.FromTwoPoints(new Vector(1000, 750), new Vector(1800, 1100)), rects.Bottom); CheckEqual(Rect.FromTwoPoints(new Vector(1000, 600), new Vector(1100, 750)), rects.Left); CheckEqual(Rect.FromTwoPoints(new Vector(1300, 600), new Vector(1800, 750)), rects.Right); } } } }