using Annulus; using Azimuth; using System.Drawing; using System.Linq; using UnitTestSharp; using TestRenderer = Glass.UnitTests.RendererTests.TestRenderer; namespace Glass.UnitTests { public class FocusRenderingTests : TestFixture { public class OwnFocusPanel : Panel { public override bool DrawsOwnFocus => true; } public static Material Dash => DashedFrameMaterialTests.Dash; public static DashedFrameMaterial Standard => DashedFrameMaterialTests.Standard; public static Rect RectAt(Scalar x, Scalar y, Scalar width, Scalar height) { return DashedFrameMaterialTests.RectAt(x, y, width, height); } public static readonly SolidColorMaterial Own = new SolidColorMaterial { Color = Color.Green }; public static readonly SolidColorMaterial ChildArt = new SolidColorMaterial { Color = Color.Red }; /// /// A 20x10 control with a 5x5 child, in a container, drawn by a renderer set to focus the control with a /// standard dashed frame. /// public class Scene { public readonly TestRenderer Renderer = new TestRenderer(); public readonly Panel Focused = new Panel { Material = Own, Bounds = RectAt(0, 0, 20, 10) }; public readonly Panel Child = new Panel { Material = ChildArt, Bounds = RectAt(2, 2, 5, 5) }; public readonly ControlContainer Container = new ControlContainer(); public Scene() { Focused.CanvasChildren.Add(Child); Container.Add(Focused); Renderer.FocusedControl = Focused; Renderer.FocusMaterial = Standard; } public void Draw() { Renderer.Render(7, Container, new DrawState()); } public int IndexOf(Material material) { return Renderer.renderCalls.FindIndex(call => call.material == material); } public TestRenderer.RenderArguments[] DashCalls => Renderer.renderCalls.Where(call => call.material == Dash).ToArray(); } public class FocusedControlTests : TestFixture { public void DrawsTheFocusMaterialOverIt() { var scene = new Scene(); scene.Draw(); CheckEqual(12, scene.DashCalls.Length); } public void FirstDashSitsOnTheControlsTopLeftCorner() { var scene = new Scene(); scene.Draw(); CheckEqual(RectAt(0, 0, 3, 1), scene.DashCalls[0].rect); } public void DrawsAfterTheControlsOwnMaterialAndItsChildren() { var scene = new Scene(); scene.Draw(); int own = scene.IndexOf(Own); int child = scene.IndexOf(ChildArt); int firstDash = scene.IndexOf(Dash); Check(own < child); Check(child < firstDash); } public void DrawsInTheControlsOwnSpace() { var scene = new Scene(); scene.Focused.Bounds = RectAt(30, 40, 20, 10); scene.Draw(); CheckEqual(scene.Renderer.renderCalls[scene.IndexOf(Own)].transform, scene.DashCalls[0].transform); } public void ChildFocused_DrawsAroundTheChildOnly() { var scene = new Scene(); scene.Renderer.FocusedControl = scene.Child; scene.Draw(); CheckEqual(4, scene.DashCalls.Length); } public void MaterialTint_ReachesTheDashes() { var scene = new Scene(); scene.Renderer.FocusMaterial = Standard with { TintColor = Color.Orange }; scene.Draw(); CheckTrue(scene.DashCalls.All(call => call.tintColor == Color.Orange)); } } public class NothingToDrawTests : TestFixture { public void NoFocusedControl_DrawsNothing() { var scene = new Scene(); scene.Renderer.FocusedControl = null; scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } public void AControlNotInTheTree_DrawsNothing() { var scene = new Scene(); scene.Renderer.FocusedControl = new Panel { Bounds = RectAt(0, 0, 20, 10) }; scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } public void NoFocusMaterial_DrawsNothing() { var scene = new Scene(); scene.Renderer.FocusMaterial = null; scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } public void ControlThatDrawsItsOwnFocus_IsLeftAlone() { var scene = new Scene(); var own = new OwnFocusPanel { Material = Own, Bounds = RectAt(0, 0, 20, 10) }; scene.Container.Add(own); scene.Renderer.FocusedControl = own; scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } public void InvisibleControl_DrawsNothing() { var scene = new Scene(); scene.Focused.Visible = false; scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } public void ControlTooSmallForAFrame_DrawsNothing() { var scene = new Scene(); scene.Focused.Bounds = RectAt(0, 0, 1, 1); scene.Draw(); CheckEqual(0, scene.DashCalls.Length); } } } }