12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364 |
- using System.Globalization;
- using Xunit.Abstractions;
- //using GraphViewTests = Terminal.Gui.Views.GraphViewTests;
- namespace Terminal.Gui.ViewsTests;
- public class ContextMenuTests
- {
- private readonly ITestOutputHelper _output;
- public ContextMenuTests (ITestOutputHelper output) { _output = output; }
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_Constructors ()
- {
- var cm = new ContextMenu ();
- Assert.Equal (Point.Empty, cm.Position);
- Assert.Empty (cm.MenuItems.Children);
- Assert.Null (cm.Host);
- cm.Position = new Point (20, 10);
- cm.MenuItems = new MenuBarItem (
- [
- new MenuItem ("First", "", null)
- ]
- );
- Assert.Equal (new Point (20, 10), cm.Position);
- Assert.Single (cm.MenuItems.Children);
- cm = new ContextMenu
- {
- Position = new Point (5, 10),
- MenuItems = new MenuBarItem (
- new [] { new MenuItem ("One", "", null), new MenuItem ("Two", "", null) }
- )
- };
- Assert.Equal (new Point (5, 10), cm.Position);
- Assert.Equal (2, cm.MenuItems.Children.Length);
- Assert.Null (cm.Host);
- cm = new ContextMenu
- {
- Host = new View { X = 5, Y = 10 },
- Position = new Point (5, 10),
- MenuItems = new MenuBarItem (
- new [] { new MenuItem ("One", "", null), new MenuItem ("Two", "", null) }
- )
- };
- Assert.Equal (new Point (5, 10), cm.Position);
- Assert.Equal (2, cm.MenuItems.Children.Length);
- Assert.NotNull (cm.Host);
- }
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_Is_Closed_If_Another_MenuBar_Is_Open_Or_Vice_Versa ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- var menu = new MenuBar
- {
- Menus =
- [
- new MenuBarItem ("File", "", null),
- new MenuBarItem ("Edit", "", null)
- ]
- };
- Application.Top.Add (menu);
- Application.Begin (Application.Top);
- Assert.Null (Application.MouseGrabView);
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (cm.MenuBar, Application.MouseGrabView);
- Assert.False (menu.IsMenuOpen);
- Assert.True (menu.NewKeyDownEvent (menu.Key));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.True (menu.IsMenuOpen);
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (cm.MenuBar, Application.MouseGrabView);
- Assert.False (menu.IsMenuOpen);
- #if SUPPORT_ALT_TO_ACTIVATE_MENU
- Assert.True (Application.Top.ProcessKeyUp (new (Key.AltMask)));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.True (menu.IsMenuOpen);
- #endif
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (cm.MenuBar, Application.MouseGrabView);
- Assert.False (menu.IsMenuOpen);
- Assert.False (menu.OnMouseEvent (new MouseEvent { X = 1, Flags = MouseFlags.ReportMousePosition, View = menu }));
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (cm.MenuBar, Application.MouseGrabView);
- Assert.False (menu.IsMenuOpen);
- Assert.True (menu.OnMouseEvent (new MouseEvent { X = 1, Flags = MouseFlags.Button1Clicked, View = menu }));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.True (menu.IsMenuOpen);
- }
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_On_Toplevel_With_A_MenuBar_TextField_StatusBar ()
- {
- Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-US");
- var menu = new MenuBar
- {
- Menus =
- [
- new MenuBarItem ("File", "", null),
- new MenuBarItem ("Edit", "", null)
- ]
- };
- var label = new Label { X = 2, Y = 3, Text = "Label:" };
- var tf = new TextField { X = Pos.Right (label) + 1, Y = Pos.Top (label), Width = 20, Text = "TextField" };
- var statusBar = new StatusBar (
- [
- new StatusItem (KeyCode.F1, "~F1~ Help", null),
- new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^Q~ Quit", null)
- ]
- );
- Application.Top.Add (menu, label, tf, statusBar);
- ((FakeDriver)Application.Driver).SetBufferSize (45, 17);
- Application.Begin (Application.Top);
- Assert.Equal (new Rectangle (9, 3, 20, 1), tf.Frame);
- Assert.True (tf.HasFocus);
- tf.ContextMenu.Show ();
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (new Point (9, 3), tf.ContextMenu.Position);
- Application.Top.Draw ();
- var expected = @"
- File Edit
-
-
- Label: TextField
- ┌─────────────────────┐
- │ Select All Ctrl+T │
- │ Delete All Ctrl+R │
- │ Copy Ctrl+C │
- │ Cut Ctrl+X │
- │ Paste Ctrl+V │
- │ Undo Ctrl+Z │
- │ Redo Ctrl+Y │
- └─────────────────────┘
-
-
-
- F1 Help │ ^Q Quit
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (1, 0, 32, 17), pos);
- }
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_On_Toplevel_With_A_MenuBar_Window_TextField_StatusBar ()
- {
- Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-US");
- var menu = new MenuBar
- {
- Menus =
- [
- new MenuBarItem ("File", "", null),
- new MenuBarItem ("Edit", "", null)
- ]
- };
- var label = new Label { X = 2, Y = 3, Text = "Label:" };
- var tf = new TextField { X = Pos.Right (label) + 1, Y = Pos.Top (label), Width = 20, Text = "TextField" };
- var win = new Window ();
- win.Add (label, tf);
- var statusBar = new StatusBar (
- new []
- {
- new StatusItem (KeyCode.F1, "~F1~ Help", null),
- new StatusItem (KeyCode.CtrlMask | KeyCode.Q, "~^Q~ Quit", null)
- }
- );
- Application.Top.Add (menu, win, statusBar);
- Application.Begin (Application.Top);
- ((FakeDriver)Application.Driver).SetBufferSize (44, 17);
- Assert.Equal (new Rectangle (9, 3, 20, 1), tf.Frame);
- Assert.True (tf.HasFocus);
- tf.ContextMenu.Show ();
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (new Point (10, 5), tf.ContextMenu.Position);
- Application.Top.Draw ();
- var expected = @"
- File Edit
- ┌──────────────────────────────────────────┐
- │ │
- │ │
- │ │
- │ Label: TextField │
- │ ┌─────────────────────┐ │
- │ │ Select All Ctrl+T │ │
- │ │ Delete All Ctrl+R │ │
- │ │ Copy Ctrl+C │ │
- │ │ Cut Ctrl+X │ │
- │ │ Paste Ctrl+V │ │
- │ │ Undo Ctrl+Z │ │
- │ │ Redo Ctrl+Y │ │
- │ └─────────────────────┘ │
- └──────────────────────────────────────────┘
- F1 Help │ ^Q Quit
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (1, 0, 44, 17), pos);
- }
- [Fact]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Borderless_Top ()
- {
- ((FakeDriver)Application.Driver).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), Application.Driver.Clip);
- TestHelpers.AssertDriverContentsWithFrameAre ("", _output);
- var top = new Toplevel { X = 2, Y = 2, Width = 15, Height = 4 };
- top.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rs = Application.Begin (top);
- Assert.Equal (new Rectangle (2, 2, 15, 4), top.Frame);
- Assert.Equal (top, Application.Top);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- Test",
- _output
- );
- Application.OnMouseEvent (
- new MouseEventEventArgs (
- new MouseEvent { X = 8, Y = 2, Flags = MouseFlags.Button3Clicked }
- )
- );
- var firstIteration = false;
- Application.RunIteration (ref rs, ref firstIteration);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- Test
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────",
- _output
- );
- Application.End (rs);
- }
- [Fact]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Dialog ()
- {
- Toplevel top = Application.Top;
- var win = new Window ();
- top.Add (win);
- Application.Begin (top);
- ((FakeDriver)Application.Driver).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), win.Frame);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- └──────────────────┘",
- _output
- );
- // Don't use Dialog here as it has more layout logic. Use Window instead.
- var dialog = new Window { X = 2, Y = 2, Width = 15, Height = 4 };
- dialog.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rs = Application.Begin (dialog);
- Assert.Equal (new Rectangle (2, 2, 15, 4), dialog.Frame);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ ┌─────────────┐ │
- │ │ Test │ │
- │ │ │ │
- │ └─────────────┘ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- └──────────────────┘",
- _output
- );
- Application.OnMouseEvent (
- new MouseEventEventArgs (
- new MouseEvent { X = 9, Y = 3, Flags = MouseFlags.Button3Clicked }
- )
- );
- var firstIteration = false;
- Application.RunIteration (ref rs, ref firstIteration);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ ┌─────────────┐ │
- │ │ Test │ │
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────
- │ │
- └──────────────────┘",
- _output
- );
- Application.End (rs);
- }
- [Fact]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Top_Dialog ()
- {
- ((FakeDriver)Application.Driver).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), Application.Driver.Clip);
- TestHelpers.AssertDriverContentsWithFrameAre ("", _output);
- // Don't use Dialog here as it has more layout logic. Use Window instead.
- var dialog = new Window { X = 2, Y = 2, Width = 15, Height = 4 };
- dialog.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rs = Application.Begin (dialog);
- Assert.Equal (new Rectangle (2, 2, 15, 4), dialog.Frame);
- Assert.Equal (dialog, Application.Top);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │ Test │
- │ │
- └─────────────┘",
- _output
- );
- Application.OnMouseEvent (
- new MouseEventEventArgs (
- new MouseEvent { X = 9, Y = 3, Flags = MouseFlags.Button3Clicked }
- )
- );
- var firstIteration = false;
- Application.RunIteration (ref rs, ref firstIteration);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │ Test │
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────",
- _output
- );
- Application.End (rs);
- }
- [Fact]
- [AutoInitShutdown]
- public void ForceMinimumPosToZero_True_False ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (-1, -2),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Assert.Equal (new Point (-1, -2), cm.Position);
- cm.Show ();
- Assert.Equal (new Point (-1, -2), cm.Position);
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (0, 1, 8, 4), pos);
- cm.ForceMinimumPosToZero = false;
- cm.Show ();
- Assert.Equal (new Point (-1, -2), cm.Position);
- Application.Refresh ();
- expected = @"
- One │
- Two │
- ──────┘
- ";
- pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (1, 0, 7, 3), pos);
- }
- [Fact]
- [AutoInitShutdown]
- public void Hide_Is_Invoke_At_Container_Closing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (80, 25),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Toplevel top = Application.Top;
- Application.Begin (top);
- top.Running = true;
- Assert.False (ContextMenu.IsShow);
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- top.RequestStop ();
- Assert.False (ContextMenu.IsShow);
- }
-
- [Fact]
- [AutoInitShutdown]
- public void Key_Open_And_Close_The_ContextMenu ()
- {
- var tf = new TextField ();
- Application.Top.Add (tf);
- Application.Begin (Application.Top);
- Assert.True (Application.OnKeyDown (ContextMenu.DefaultKey));
- Assert.True (tf.ContextMenu.MenuBar.IsMenuOpen);
- Assert.True (Application.OnKeyDown (ContextMenu.DefaultKey));
- Assert.Null (tf.ContextMenu.MenuBar);
- }
- [Fact]
- [AutoInitShutdown]
- public void KeyChanged_Event ()
- {
- var oldKey = Key.Empty;
- var cm = new ContextMenu ();
- cm.KeyChanged += (s, e) => oldKey = e.OldKey;
- cm.Key = Key.Space.WithCtrl;
- Assert.Equal (Key.Space.WithCtrl, cm.Key);
- Assert.Equal (ContextMenu.DefaultKey, oldKey);
- }
- [Fact]
- [AutoInitShutdown]
- public void MenuItens_Changing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- cm.Show ();
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- cm.MenuItems = new MenuBarItem (
- [
- new MenuItem ("First", "", null),
- new MenuItem ("Second", "", null),
- new MenuItem ("Third", "", null)
- ]
- );
- cm.Show ();
- Application.Refresh ();
- expected = @"
- ┌─────────┐
- │ First │
- │ Second │
- │ Third │
- └─────────┘
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact]
- [AutoInitShutdown]
- public void Menus_And_SubMenus_Always_Try_To_Be_On_Screen ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (-1, -2),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null),
- new MenuItem ("Three", "", null),
- new MenuBarItem (
- "Four",
- [
- new MenuItem ("SubMenu1", "", null),
- new MenuItem ("SubMenu2", "", null),
- new MenuItem ("SubMenu3", "", null),
- new MenuItem ("SubMenu4", "", null),
- new MenuItem ("SubMenu5", "", null),
- new MenuItem ("SubMenu6", "", null),
- new MenuItem ("SubMenu7", "", null)
- ]
- ),
- new MenuItem ("Five", "", null),
- new MenuItem ("Six", "", null)
- ]
- )
- };
- Assert.Equal (new Point (-1, -2), cm.Position);
- cm.Show ();
- Assert.Equal (new Point (-1, -2), cm.Position);
- Toplevel top = Application.Top;
- Application.Begin (top);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- _output
- );
- Assert.True (
- top.Subviews [0]
- .OnMouseEvent (
- new MouseEvent { X = 0, Y = 4, Flags = MouseFlags.ReportMousePosition, View = top.Subviews [0] }
- )
- );
- Application.Refresh ();
- Assert.Equal (new Point (-1, -2), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│┌───────────┐
- │ Five ││ SubMenu1 │
- │ Six ││ SubMenu2 │
- └────────┘│ SubMenu3 │
- │ SubMenu4 │
- │ SubMenu5 │
- │ SubMenu6 │
- │ SubMenu7 │
- └───────────┘
- ",
- _output
- );
- ((FakeDriver)Application.Driver).SetBufferSize (40, 20);
- cm.Position = new Point (41, -2);
- cm.Show ();
- Application.Refresh ();
- Assert.Equal (new Point (41, -2), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- _output
- );
- Assert.True (
- top.Subviews [0]
- .OnMouseEvent (
- new MouseEvent { X = 30, Y = 4, Flags = MouseFlags.ReportMousePosition, View = top.Subviews [0] }
- )
- );
- Application.Refresh ();
- Assert.Equal (new Point (41, -2), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- ┌───────────┐│ Four ►│
- │ SubMenu1 ││ Five │
- │ SubMenu2 ││ Six │
- │ SubMenu3 │└────────┘
- │ SubMenu4 │
- │ SubMenu5 │
- │ SubMenu6 │
- │ SubMenu7 │
- └───────────┘
- ",
- _output
- );
- cm.Position = new Point (41, 9);
- cm.Show ();
- Application.Refresh ();
- Assert.Equal (new Point (41, 9), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- _output
- );
- Assert.True (
- top.Subviews [0]
- .OnMouseEvent (
- new MouseEvent { X = 30, Y = 4, Flags = MouseFlags.ReportMousePosition, View = top.Subviews [0] }
- )
- );
- Application.Refresh ();
- Assert.Equal (new Point (41, 9), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- ┌───────────┐│ One │
- │ SubMenu1 ││ Two │
- │ SubMenu2 ││ Three │
- │ SubMenu3 ││ Four ►│
- │ SubMenu4 ││ Five │
- │ SubMenu5 ││ Six │
- │ SubMenu6 │└────────┘
- │ SubMenu7 │
- └───────────┘
- ",
- _output
- );
- cm.Position = new Point (41, 22);
- cm.Show ();
- Application.Refresh ();
- Assert.Equal (new Point (41, 22), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- _output
- );
- Assert.True (
- top.Subviews [0]
- .OnMouseEvent (
- new MouseEvent { X = 30, Y = 4, Flags = MouseFlags.ReportMousePosition, View = top.Subviews [0] }
- )
- );
- Application.Refresh ();
- Assert.Equal (new Point (41, 22), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌───────────┐
- │ SubMenu1 │┌────────┐
- │ SubMenu2 ││ One │
- │ SubMenu3 ││ Two │
- │ SubMenu4 ││ Three │
- │ SubMenu5 ││ Four ►│
- │ SubMenu6 ││ Five │
- │ SubMenu7 ││ Six │
- └───────────┘└────────┘
- ",
- _output
- );
- ((FakeDriver)Application.Driver).SetBufferSize (18, 8);
- cm.Position = new Point (19, 10);
- cm.Show ();
- Application.Refresh ();
- Assert.Equal (new Point (19, 10), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- _output
- );
- Assert.True (
- top.Subviews [0]
- .OnMouseEvent (
- new MouseEvent { X = 30, Y = 4, Flags = MouseFlags.ReportMousePosition, View = top.Subviews [0] }
- )
- );
- Application.Refresh ();
- Assert.Equal (new Point (19, 10), cm.Position);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌───────────┐────┐
- │ SubMenu1 │ │
- │ SubMenu2 │ │
- │ SubMenu3 │ee │
- │ SubMenu4 │r ►│
- │ SubMenu5 │e │
- │ SubMenu6 │ │
- │ SubMenu7 │────┘
- ",
- _output
- );
- }
- [Fact]
- [AutoInitShutdown]
- public void MouseFlags_Changing ()
- {
- var lbl = new Label { Text = "Original" };
- var cm = new ContextMenu ();
- lbl.MouseClick += (s, e) =>
- {
- if (e.MouseEvent.Flags == cm.MouseFlags)
- {
- lbl.Text = "Replaced";
- e.Handled = true;
- }
- };
- Toplevel top = Application.Top;
- top.Add (lbl);
- Application.Begin (top);
- Assert.True (lbl.OnMouseEvent (new MouseEvent { Flags = cm.MouseFlags }));
- Assert.Equal ("Replaced", lbl.Text);
- lbl.Text = "Original";
- cm.MouseFlags = MouseFlags.Button2Clicked;
- Assert.True (lbl.OnMouseEvent (new MouseEvent { Flags = cm.MouseFlags }));
- Assert.Equal ("Replaced", lbl.Text);
- }
- [Fact]
- [AutoInitShutdown]
- public void MouseFlagsChanged_Event ()
- {
- var oldMouseFlags = new MouseFlags ();
- var cm = new ContextMenu ();
- cm.MouseFlagsChanged += (s, e) => oldMouseFlags = e.OldValue;
- cm.MouseFlags = MouseFlags.Button2Clicked;
- Assert.Equal (MouseFlags.Button2Clicked, cm.MouseFlags);
- Assert.Equal (MouseFlags.Button3Clicked, oldMouseFlags);
- }
- [Fact]
- [AutoInitShutdown]
- public void Position_Changing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- cm.Show ();
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- cm.Position = new Point (5, 10);
- cm.Show ();
- Application.Refresh ();
- expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact]
- [AutoInitShutdown]
- public void RequestStop_While_ContextMenu_Is_Open_Does_Not_Throws ()
- {
- ContextMenu cm = Create_ContextMenu_With_Two_MenuItem (10, 5);
- Toplevel top = Application.Top;
- var isMenuAllClosed = false;
- MenuBarItem mi = null;
- int iterations = -1;
- Application.Iteration += (s, a) =>
- {
- iterations++;
- if (iterations == 0)
- {
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- mi = cm.MenuBar.Menus [0];
- mi.Action = () =>
- {
- var dialog1 = new Dialog ();
- Application.Run (dialog1);
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- };
- cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true;
- }
- else if (iterations == 1)
- {
- mi.Action ();
- }
- else if (iterations == 2)
- {
- Application.RequestStop ();
- }
- else if (iterations == 3)
- {
- isMenuAllClosed = false;
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true;
- }
- else if (iterations == 4)
- {
- Exception exception = Record.Exception (() => Application.RequestStop ());
- Assert.Null (exception);
- }
- else
- {
- Application.RequestStop ();
- }
- };
- var isTopClosed = false;
- top.Closing += (_, _) =>
- {
- var dialog2 = new Dialog ();
- Application.Run (dialog2);
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- isTopClosed = true;
- };
- Application.Run ();
- Assert.True (isTopClosed);
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_At_Zero_If_The_Toplevel_Height_Is_Less_Than_The_Menu_Height ()
- {
- ((FakeDriver)Application.Driver).SetBufferSize (80, 3);
- var cm = new ContextMenu
- {
- Position = Point.Empty,
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Assert.Equal (Point.Empty, cm.Position);
- cm.Show ();
- Assert.Equal (Point.Empty, cm.Position);
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (0, 0, 8, 3), pos);
- cm.Hide ();
- Assert.Equal (Point.Empty, cm.Position);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_At_Zero_If_The_Toplevel_Width_Is_Less_Than_The_Menu_Width ()
- {
- ((FakeDriver)Application.Driver).SetBufferSize (5, 25);
- var cm = new ContextMenu
- {
- Position = Point.Empty,
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Assert.Equal (Point.Empty, cm.Position);
- cm.Show ();
- Assert.Equal (Point.Empty, cm.Position);
- Application.Begin (Application.Top);
- var expected = @"
- ┌────
- │ One
- │ Two
- └────";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (0, 1, 5, 4), pos);
- cm.Hide ();
- Assert.Equal (Point.Empty, cm.Position);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_Below_The_Bottom_Host_If_Has_Enough_Space ()
- {
- var view = new View
- {
- X = 10,
- Y = 5,
- Width = 10,
- Height = 1,
- Text = "View"
- };
- var cm = new ContextMenu
- {
- Host = view,
- Position = new Point (10, 5),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Application.Top.Add (view);
- Application.Begin (Application.Top);
- Assert.Equal (new Point (10, 5), cm.Position);
- cm.Show ();
- Application.Top.Draw ();
- Assert.Equal (new Point (10, 5), cm.Position);
- var expected = @"
- View
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (10, 5, 18, 5), pos);
- cm.Hide ();
- Assert.Equal (new Point (10, 5), cm.Position);
- cm.Host.X = 5;
- cm.Host.Y = 10;
- cm.Host.Height = 3;
- cm.Show ();
- Application.Top.Draw ();
- Assert.Equal (new Point (5, 12), cm.Position);
- expected = @"
- View
-
-
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (5, 10, 13, 7), pos);
- cm.Hide ();
- Assert.Equal (new Point (5, 12), cm.Position);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Ensures_Display_Inside_The_Container_But_Preserves_Position ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (80, 25),
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Assert.Equal (new Point (80, 25), cm.Position);
- cm.Show ();
- Assert.Equal (new Point (80, 25), cm.Position);
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (72, 21, 80, 4), pos);
- cm.Hide ();
- Assert.Equal (new Point (80, 25), cm.Position);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Ensures_Display_Inside_The_Container_Without_Overlap_The_Host ()
- {
- var view = new View
- {
- X = Pos.AnchorEnd (10),
- Y = Pos.AnchorEnd (1),
- Width = 10,
- Height = 1,
- Text = "View"
- };
- var cm = new ContextMenu
- {
- Host = view,
- MenuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- )
- };
- Application.Top.Add (view);
- Application.Begin (Application.Top);
- Assert.Equal (new Rectangle (70, 24, 10, 1), view.Frame);
- Assert.Equal (Point.Empty, cm.Position);
- cm.Show ();
- Assert.Equal (new Point (70, 24), cm.Position);
- Application.Top.Draw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- View
- ";
- Rectangle pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
- Assert.Equal (new Rectangle (70, 20, 78, 5), pos);
- cm.Hide ();
- Assert.Equal (new Point (70, 24), cm.Position);
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Hide_IsShow ()
- {
- ContextMenu cm = Create_ContextMenu_With_Two_MenuItem (10, 5);
- cm.Show ();
- Assert.True (ContextMenu.IsShow);
- Application.Begin (Application.Top);
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- cm.Hide ();
- Assert.False (ContextMenu.IsShow);
- Application.Refresh ();
- expected = "";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact]
- [AutoInitShutdown]
- public void UseSubMenusSingleFrame_True_By_Mouse ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (5, 10),
- MenuItems = new MenuBarItem (
- "Numbers",
- [
- new MenuItem ("One", "", null),
- new MenuBarItem (
- "Two",
- [
- new MenuItem (
- "Sub-Menu 1",
- "",
- null
- ),
- new MenuItem ("Sub-Menu 2", "", null)
- ]
- ),
- new MenuItem ("Three", "", null)
- ]
- ),
- UseSubMenusSingleFrame = true
- };
- cm.Show ();
- RunState rs = Application.Begin (Application.Top);
- Assert.Equal (new Rectangle (5, 11, 10, 5), Application.Top.Subviews [0].Frame);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three │
- └────────┘",
- _output
- );
- Application.OnMouseEvent (
- new MouseEventEventArgs (
- new MouseEvent { X = 5, Y = 13, Flags = MouseFlags.Button1Clicked }
- )
- );
- var firstIteration = false;
- Application.RunIteration (ref rs, ref firstIteration);
- Assert.Equal (new Rectangle (5, 11, 10, 5), Application.Top.Subviews [0].Frame);
- Assert.Equal (new Rectangle (5, 11, 15, 6), Application.Top.Subviews [1].Frame);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │◄ Two │
- ├─────────────┤
- │ Sub-Menu 1 │
- │ Sub-Menu 2 │
- └─────────────┘",
- _output
- );
- Application.OnMouseEvent (
- new MouseEventEventArgs (
- new MouseEvent { X = 5, Y = 12, Flags = MouseFlags.Button1Clicked }
- )
- );
- firstIteration = false;
- Application.RunIteration (ref rs, ref firstIteration);
- Assert.Equal (new Rectangle (5, 11, 10, 5), Application.Top.Subviews [0].Frame);
- TestHelpers.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three │
- └────────┘",
- _output
- );
- Application.End (rs);
- }
- private ContextMenu Create_ContextMenu_With_Two_MenuItem (int x, int y)
- {
- return new ContextMenu
- {
- Position = new Point (x, y),
- MenuItems = new MenuBarItem (
- new MenuItem [] { new ("One", "", null), new ("Two", "", null) }
- )
- };
- }
- }
|