using UnitTestSharp;
using Azimuth;
using Annulus;
using System.Collections.Generic;
namespace Glass.UnitTests
{
public class WindowTests : TestFixture
{
///
/// With no materials and the default 24-tall title bar: a 200x24 title bar (close button taking its last 24,
/// caption the other 176) over a 200x126 content area. The resize band is hit-test only, so it never
/// shrinks this.
///
public static readonly Rect StandardBounds = Rect.FromPositionAndSize(Vector.Zero, new Vector(200, 150));
public static readonly Vector OnTheTitleBar = new Vector(50, 15);
public static readonly Vector OnTheContent = new Vector(50, 80);
public static readonly Vector OnTheCloseButton = new Vector(180, 15);
[IgnoreTest]
private static Window StandardWindow()
{
return new Window { Bounds = StandardBounds };
}
[IgnoreTest]
private static List OrderOf(ControlContainer controls)
{
return ControlContainerTests.BackToFrontOrderOf(controls);
}
public class CtorTests : TestFixture
{
public void Always_MovesToFrontOnClick()
{
CheckTrue(new Window().MoveToFrontOnClick);
}
public void Always_HasJustTheTitleBarAndContentAsDirectChildren()
{
CheckEqual(2, OrderOf(new Window().DirectChildren).Count);
}
}
public class CanvasChildrenTests : TestFixture
{
public void AddedChildren_StayOutOfDirectChildren()
{
var window = new Window();
var child = window.CanvasChildren.Add(new Control("child"));
CheckFalse(OrderOf(window.DirectChildren).Contains(child));
CheckEqual(2, OrderOf(window.DirectChildren).Count);
}
}
public class ContentSizeTests : TestFixture
{
public void Standard_IsTheCanvasBelowTheTitleBar()
{
CheckEqual(new Vector(200, 126), StandardWindow().ContentSize);
}
}
public class CaptionTests : TestFixture
{
public void Standard_FillsTheTitleBarLeftOfTheCloseButton()
{
CheckEqual(Rect.FromPositionAndSize(Vector.Zero, new Vector(176, 24)), StandardWindow().Caption.Bounds);
}
}
public class CloseButtonTests : TestFixture
{
public void Standard_IsASquareAtTheRightEndOfTheTitleBar()
{
CheckEqual(
Rect.FromPositionAndSize(new Vector(176, 0), new Vector(24, 24)),
StandardWindow().CloseButton.Bounds);
}
public void Clicked_ClosesTheWindow()
{
var manager = new MouseManager();
Window window = manager.Controls.Add(StandardWindow());
manager.MouseDown(new MouseState { Position = OnTheCloseButton }, MouseButtonFlags.Left);
manager.MouseUp(new MouseState { Position = OnTheCloseButton }, MouseButtonFlags.Left);
CheckFalse(window.Visible);
}
}
public class TitleBarHeightTests : TestFixture
{
public void ByDefault_Is24()
{
CheckEqual(24, new Window().TitleBarHeight);
}
public void Changed_LaysTheTitleBarAndContentOutAgain()
{
Window window = StandardWindow();
window.TitleBarHeight = 30;
CheckEqual(Rect.FromPositionAndSize(Vector.Zero, new Vector(170, 30)), window.Caption.Bounds);
CheckEqual(new Vector(200, 120), window.ContentSize);
}
}
public class ShowTitleBarTests : TestFixture
{
public void ByDefault_IsTrue()
{
CheckTrue(new Window().ShowTitleBar);
}
public void Off_GivesTheContentTheWholeCanvas()
{
Window window = StandardWindow();
window.ShowTitleBar = false;
CheckEqual(new Vector(200, 150), window.ContentSize);
}
public void BackOn_TakesTheTitleBarsSpaceBack()
{
Window window = StandardWindow();
window.ShowTitleBar = false;
window.ShowTitleBar = true;
CheckEqual(new Vector(200, 126), window.ContentSize);
}
}
public class ShowCloseButtonTests : TestFixture
{
public void ByDefault_IsTrue()
{
CheckTrue(new Window().ShowCloseButton);
}
public void Off_HidesTheButtonAndGivesItsSpaceToTheCaption()
{
Window window = StandardWindow();
window.ShowCloseButton = false;
CheckFalse(window.CloseButton.Visible);
CheckEqual(Rect.FromPositionAndSize(Vector.Zero, new Vector(200, 24)), window.Caption.Bounds);
}
}
public class MaterialTests : TestFixture
{
public void Changed_LaysTheContentOutAgain()
{
Window window = StandardWindow();
window.Material = new Material { BorderSize = new Rect.BorderSize(10) };
CheckEqual(new Vector(180, 106), window.ContentSize);
}
}
public class WindowMaterialTests : TestFixture
{
public void Set_ComesBackFromTheParts()
{
var set = new WindowMaterial
{
Background = new Material { BorderSize = new Rect.BorderSize(1) },
TitleBar = new Material { BorderSize = new Rect.BorderSize(2) },
Content = new Material { BorderSize = new Rect.BorderSize(3) },
CloseButton = new ButtonMaterial
{
NominalMaterial = new Material { BorderSize = new Rect.BorderSize(4) },
},
};
var window = new Window { WindowMaterial = set };
WindowMaterial gotten = window.WindowMaterial;
CheckEqual(set.Background, gotten.Background);
CheckEqual(set.TitleBar, gotten.TitleBar);
CheckEqual(set.Content, gotten.Content);
CheckEqual(set.CloseButton, gotten.CloseButton);
}
public void Set_LaysTheContentOutAgain()
{
Window window = StandardWindow();
window.WindowMaterial = new WindowMaterial
{
Content = new Material { BorderSize = new Rect.BorderSize(2) },
};
CheckEqual(new Vector(196, 122), window.ContentSize);
}
}
public class OnContentResizedTests : TestFixture
{
public void Resized_RaisesWithTheNewContentSize()
{
Window window = StandardWindow();
Vector? raised = null;
window.OnContentResized += contentSizeNow => raised = contentSizeNow;
window.Bounds = Rect.FromPositionAndSize(Vector.Zero, new Vector(220, 150));
CheckEqual(new Vector(220, 126), raised);
}
public void TitleBarHidden_Raises()
{
Window window = StandardWindow();
Vector? raised = null;
window.OnContentResized += contentSizeNow => raised = contentSizeNow;
window.ShowTitleBar = false;
CheckEqual(new Vector(200, 150), raised);
}
public void Moved_DoesNotRaise()
{
Window window = StandardWindow();
bool raised = false;
window.OnContentResized += _ => raised = true;
window.Bounds = Rect.FromPositionAndSize(new Vector(30, 40), StandardBounds.Size);
CheckFalse(raised);
}
}
public class OnResizedTests : TestFixture
{
public void CallersHandler_SeesTheContentAlreadyLaidOut()
{
Window window = StandardWindow();
Vector? seen = null;
window.OnResized += _ => seen = window.ContentSize;
window.Bounds = Rect.FromPositionAndSize(Vector.Zero, new Vector(220, 150));
CheckEqual(new Vector(220, 126), seen);
}
}
public class CloseTests : TestFixture
{
public void Visible_HidesTheWindow()
{
Window window = StandardWindow();
window.Close();
CheckFalse(window.Visible);
}
public void Visible_RaisesOnClosedWithTheWindow()
{
Window window = StandardWindow();
Window closed = null;
window.OnClosed += which => closed = which;
window.Close();
CheckEqual(window, closed);
}
public void AlreadyHidden_DoesNotRaiseOnClosed()
{
Window window = StandardWindow();
window.Visible = false;
bool raised = false;
window.OnClosed += _ => raised = true;
window.Close();
CheckFalse(raised);
}
}
public class MinContentSizeTests : TestFixture
{
public void ByDefault_IsZero()
{
CheckEqual(Vector.Zero, new Window().MinContentSize);
}
}
public class MinSizeTests : TestFixture
{
public void ByDefault_IsZero()
{
CheckEqual(Vector.Zero, new Window().MinSize);
}
public void SetSmallerThanTheChrome_StillReadsBackExactly()
{
var window = new Window { MinSize = new Vector(1, 1) };
CheckEqual(new Vector(1, 1), window.MinSize);
}
}
public class EffectiveMinSizeTests : TestFixture
{
public void ByDefault_FitsTheCloseButtonAcrossTheTitleBar()
{
CheckEqual(new Vector(24, 24), new Window().EffectiveMinSize);
}
public void TitleBarHidden_IsZero()
{
CheckEqual(Vector.Zero, new Window { ShowTitleBar = false }.EffectiveMinSize);
}
public void CloseButtonHidden_NeedsNoWidthForIt()
{
CheckEqual(new Vector(0, 24), new Window { ShowCloseButton = false }.EffectiveMinSize);
}
public void MinContentSize_AddsBelowTheTitleBar()
{
CheckEqual(new Vector(50, 64), new Window { MinContentSize = new Vector(50, 40) }.EffectiveMinSize);
}
public void SetLargerThanTheChrome_Wins()
{
CheckEqual(new Vector(100, 90), new Window { MinSize = new Vector(100, 90) }.EffectiveMinSize);
}
public void SetSmallerThanTheChrome_TheChromeStillWins()
{
CheckEqual(new Vector(24, 24), new Window { MinSize = new Vector(1, 1) }.EffectiveMinSize);
}
public void ResizeDrag_StopsWhereTheTitleBarWouldBeCut()
{
Window window = StandardWindow();
window.MouseDown(new MouseState { Position = new Vector(100, 148) }, MouseButtonFlags.Left);
window.MouseMove(new MouseState { Position = new Vector(100, -1000) });
CheckEqual(new Vector(200, 24), window.Bounds.Size);
}
}
public class IsDragHandleTests : TestFixture
{
public void OnTheTitleBar_IsTrue()
{
CheckTrue(StandardWindow().IsDragHandle(OnTheTitleBar));
}
public void OnTheContent_IsFalse()
{
CheckFalse(StandardWindow().IsDragHandle(OnTheContent));
}
public void TitleBarHidden_IsFalseWhereItWouldBe()
{
Window window = StandardWindow();
window.ShowTitleBar = false;
CheckFalse(window.IsDragHandle(OnTheTitleBar));
}
}
public class MouseDownTests : TestFixture
{
public void DraggedByTheTitleBar_Moves()
{
var manager = new MouseManager();
Window window = manager.Controls.Add(StandardWindow());
manager.MouseDown(new MouseState { Position = OnTheTitleBar }, MouseButtonFlags.Left);
manager.MouseMove(new MouseState { Position = OnTheTitleBar + new Vector(30, 40) });
CheckEqual(Rect.FromPositionAndSize(new Vector(30, 40), StandardBounds.Size), window.Bounds);
}
public void OnTheContent_ClaimsThePressAndMovesToTheFront()
{
var manager = new MouseManager();
Window window = manager.Controls.Add(StandardWindow());
var other = manager.Controls.Add(
new Control("other") { Bounds = Rect.FromPositionAndSize(new Vector(500, 500), new Vector(1, 1)) });
Control claimed = manager.MouseDown(new MouseState { Position = OnTheContent }, MouseButtonFlags.Left);
CheckEqual(window, claimed);
CheckEqual(new Control[] { other, window }, OrderOf(manager.Controls));
}
}
}
}