using Annulus; using Azimuth; using System; using UnitTestSharp; namespace Glass.UnitTests { public class MenuButtonTests : TestFixture { public static readonly Material NarrowLabel = DropdownTests.NarrowLabel; public static readonly Material WideLabel = DropdownTests.WideLabel; public static readonly Rect HeaderBounds = DropdownTests.DropdownBounds; public static readonly Vector OnTheHeader = new Vector(120, 210); public static readonly Vector OffTheHeader = new Vector(700, 500); public static MenuButton NewMenuButton() { var menuButton = new MenuButton { Bounds = HeaderBounds }; menuButton.Popup.ScrollViewMaterial = ScrollViewTests.WithBars(DropdownPopupTests.Thickness); menuButton.Rebuild(new[] { NarrowLabel, WideLabel }); return menuButton; } /// /// Two menus in one group, the first already open. /// public static (MenuButton open, MenuButton closed) TwoInAGroupWithTheFirstOpen() { var group = new RadioGroup(); MenuButton open = NewMenuButton(); MenuButton closed = NewMenuButton(); open.Group = group; closed.Group = group; open.Checked = true; return (open, closed); } [IgnoreTest] public static Control[] Rows(MenuButton menuButton) { return DropdownPopupTests.Rows(menuButton.Popup); } public class CtorTests : TestFixture { public void Always_StartsUncheckedWithItsPopupClosed() { var menuButton = new MenuButton(); CheckFalse(menuButton.Checked); CheckFalse(menuButton.Popup.IsOpen); } public void Always_HasANonModalPopup() { CheckFalse(new MenuButton().Popup.Modal); } public void Always_HoldsThePopupBeneathItself() { var menuButton = new MenuButton(); bool foundPopup = false; foreach (Control child in menuButton.DirectChildren.BackToFront()) { foundPopup = foundPopup || child == menuButton.Popup; } CheckTrue(foundPopup); } } public class CheckedTests : TestFixture { public void Setting_OpensThePopup() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; CheckTrue(menuButton.Popup.IsOpen); } public void Clearing_ClosesThePopup() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Checked = false; CheckFalse(menuButton.Popup.IsOpen); } public void SettingAnotherInTheGroup_ClosesThisOnesPopup() { (MenuButton open, MenuButton closed) = TwoInAGroupWithTheFirstOpen(); closed.Checked = true; CheckFalse(open.Popup.IsOpen); CheckTrue(closed.Popup.IsOpen); } public void Setting_ShowsThePopupBelowOnTheNextUpdate() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; DropdownTests.Walk(menuButton); CheckTrue(menuButton.Popup.Visible); CheckEqual(HeaderBounds.Left, menuButton.Popup.Bounds.Left); CheckEqual(HeaderBounds.Bottom, menuButton.Popup.Bounds.Top); } } public class ToggleTests : TestFixture { public void Unchecked_Checks() { MenuButton menuButton = NewMenuButton(); menuButton.Toggle(); CheckTrue(menuButton.Checked); } public void Checked_Unchecks() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Toggle(); CheckFalse(menuButton.Checked); } } public class ClickTests : TestFixture { public void Closed_OpensItAndClaimsTheEvent() { MenuButton menuButton = NewMenuButton(); CheckTrue(menuButton.Click(DropdownPopupTests.At(OnTheHeader), MouseButtonFlags.Left)); CheckTrue(menuButton.Checked); } public void Open_ClosesIt() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Click(DropdownPopupTests.At(OnTheHeader), MouseButtonFlags.Left); CheckFalse(menuButton.Checked); } public void Disabled_LeavesItClosedAndLetsTheEventThrough() { MenuButton menuButton = NewMenuButton(); menuButton.Enabled = false; CheckFalse(menuButton.Click(DropdownPopupTests.At(OnTheHeader), MouseButtonFlags.Left)); CheckFalse(menuButton.Checked); } } public class MouseMoveStartTests : TestFixture { public void OntoItWhileAGroupMateIsOpen_OpensThisOneInstead() { (MenuButton open, MenuButton closed) = TwoInAGroupWithTheFirstOpen(); closed.MouseMoveStart(DropdownPopupTests.At(OnTheHeader)); CheckTrue(closed.Checked); CheckFalse(open.Checked); } public void OntoItWhileNothingInTheGroupIsOpen_OpensNothing() { MenuButton menuButton = NewMenuButton(); menuButton.Group = new RadioGroup(); menuButton.MouseMoveStart(DropdownPopupTests.At(OnTheHeader)); CheckFalse(menuButton.Checked); } public void OntoItWithNoGroup_OpensNothing() { MenuButton menuButton = NewMenuButton(); menuButton.MouseMoveStart(DropdownPopupTests.At(OnTheHeader)); CheckFalse(menuButton.Checked); } public void OffIt_OpensNothing() { (MenuButton open, MenuButton closed) = TwoInAGroupWithTheFirstOpen(); closed.MouseMoveStart(DropdownPopupTests.At(OffTheHeader)); CheckFalse(closed.Checked); CheckTrue(open.Checked); } public void Disabled_OpensNothing() { (MenuButton open, MenuButton closed) = TwoInAGroupWithTheFirstOpen(); closed.Enabled = false; closed.MouseMoveStart(DropdownPopupTests.At(OnTheHeader)); CheckFalse(closed.Checked); CheckTrue(open.Checked); } } public class OnItemClickedTests : TestFixture { public void ClickingARow_RaisesItsIndex() { MenuButton menuButton = NewMenuButton(); int raisedWith = -1; menuButton.OnItemClicked += index => raisedWith = index; Rows(menuButton)[1].Click(default, MouseButtonFlags.Left); CheckEqual(1, raisedWith); } public void ClickingARow_UnchecksItBeforeRaising() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; bool checkedWhenRaised = true; menuButton.OnItemClicked += _ => checkedWhenRaised = menuButton.Checked; Rows(menuButton)[0].Click(default, MouseButtonFlags.Left); CheckFalse(checkedWhenRaised); CheckFalse(menuButton.Popup.IsOpen); } public void ClickingARow_ClearsItsGroup() { (MenuButton open, MenuButton _) = TwoInAGroupWithTheFirstOpen(); Rows(open)[0].Click(default, MouseButtonFlags.Left); CheckNull(open.Group.Selected); } } public class RebuildTests : TestFixture { public void Always_BuildsOneRowPerLabelInOrder() { var menuButton = new MenuButton { Bounds = HeaderBounds }; menuButton.Rebuild(new[] { NarrowLabel, WideLabel }); Control[] rows = Rows(menuButton); CheckEqual(2, rows.Length); CheckEqual(NarrowLabel, DropdownTests.LabelMaterialOf(rows[0])); CheckEqual(WideLabel, DropdownTests.LabelMaterialOf(rows[1])); } public void EmptyList_ClearsTheRows() { MenuButton menuButton = NewMenuButton(); menuButton.Rebuild(Array.Empty()); CheckEqual(0, menuButton.Popup.CanvasChildren.Count); } public void Null_Throws() { MenuButton menuButton = NewMenuButton(); CheckThrow(typeof(ArgumentNullException)); menuButton.Rebuild(null); } public void GenericOverload_MapsEachItemThroughLabelForInOrder() { var menuButton = new MenuButton { Bounds = HeaderBounds }; menuButton.Rebuild(new[] { "first", "second" }, item => item == "first" ? NarrowLabel : WideLabel); Control[] rows = Rows(menuButton); CheckEqual(NarrowLabel, DropdownTests.LabelMaterialOf(rows[0])); CheckEqual(WideLabel, DropdownTests.LabelMaterialOf(rows[1])); } public void GenericOverload_NullItems_Throws() { MenuButton menuButton = NewMenuButton(); CheckThrow(typeof(ArgumentNullException)); menuButton.Rebuild(null, item => NarrowLabel); } public void GenericOverload_NullLabelFor_Throws() { MenuButton menuButton = NewMenuButton(); CheckThrow(typeof(ArgumentNullException)); menuButton.Rebuild(new[] { "first" }, null); } } public class SelectedIndexTests : TestFixture { public void Setting_SelectsThatRowInThePopup() { MenuButton menuButton = NewMenuButton(); menuButton.SelectedIndex = 1; CheckEqual(1, menuButton.Popup.SelectedIndex); } public void Getting_ReadsThePopups() { MenuButton menuButton = NewMenuButton(); menuButton.Popup.SelectedIndex = 1; CheckEqual(1, menuButton.SelectedIndex); } } public class BoundsTests : TestFixture { public void Setting_RelaysOutTheItemsToTheNewWidth() { MenuButton menuButton = NewMenuButton(); menuButton.Bounds = DropdownPopupTests.Box(0, 0, 300, 40); CheckEqual(300, Rows(menuButton)[0].Bounds.Width); } } public class EnabledTests : TestFixture { public void Disabling_UnchecksIt() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Enabled = false; CheckFalse(menuButton.Checked); CheckFalse(menuButton.Popup.IsOpen); } public void Enabling_DoesNotRecheckIt() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Enabled = false; menuButton.Enabled = true; CheckFalse(menuButton.Checked); } public void Disabling_DisablesEachItem() { MenuButton menuButton = NewMenuButton(); menuButton.Enabled = false; foreach (Control item in menuButton.Popup.CanvasChildren.BackToFront()) { CheckFalse(item.Enabled); } } public void Enabling_EnablesEachItemAgain() { MenuButton menuButton = NewMenuButton(); menuButton.Enabled = false; menuButton.Enabled = true; foreach (Control item in menuButton.Popup.CanvasChildren.BackToFront()) { CheckTrue(item.Enabled); } } } public class VisibleTests : TestFixture { public void Hiding_UnchecksIt() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Visible = false; CheckFalse(menuButton.Checked); CheckFalse(menuButton.Popup.IsOpen); } public void Showing_DoesNotRecheckIt() { MenuButton menuButton = NewMenuButton(); menuButton.Checked = true; menuButton.Visible = false; menuButton.Visible = true; CheckFalse(menuButton.Checked); } } } }