123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- // Alias Console to MockConsole so we don't accidentally use Console
- namespace Terminal.Gui.InputTests;
- public class ResponderTests
- {
- // Generic lifetime (IDisposable) tests
- [Fact]
- [TestRespondersDisposed]
- public void Dispose_Works ()
- {
- var r = new Responder ();
- #if DEBUG_IDISPOSABLE
- Assert.Single (Responder.Instances);
- #endif
- r.Dispose ();
- #if DEBUG_IDISPOSABLE
- Assert.Empty (Responder.Instances);
- #endif
- }
- [Fact]
- public void Disposing_Event_Notify_All_Subscribers_On_The_First_Container ()
- {
- #if DEBUG_IDISPOSABLE
- // Only clear before because need to test after assert
- Responder.Instances.Clear ();
- #endif
- var container1 = new View { Id = "Container1" };
- var count = 0;
- var view = new View { Id = "View" };
- view.Disposing += View_Disposing;
- container1.Add (view);
- Assert.Equal (container1, view.SuperView);
- void View_Disposing (object sender, EventArgs e)
- {
- count++;
- Assert.Equal (view, sender);
- container1.Remove ((View)sender);
- }
- Assert.Single (container1.Subviews);
- var container2 = new View { Id = "Container2" };
- container2.Add (view);
- Assert.Equal (container2, view.SuperView);
- Assert.Equal (container1.Subviews.Count, container2.Subviews.Count);
- container2.Dispose ();
- Assert.Empty (container1.Subviews);
- Assert.Empty (container2.Subviews);
- Assert.Equal (1, count);
- Assert.Null (view.SuperView);
- container1.Dispose ();
- #if DEBUG_IDISPOSABLE
- Assert.Empty (Responder.Instances);
- #endif
- }
- [Fact]
- public void Disposing_Event_Notify_All_Subscribers_On_The_Second_Container ()
- {
- #if DEBUG_IDISPOSABLE
- // Only clear before because need to test after assert
- Responder.Instances.Clear ();
- #endif
- var container1 = new View { Id = "Container1" };
- var view = new View { Id = "View" };
- container1.Add (view);
- Assert.Equal (container1, view.SuperView);
- Assert.Single (container1.Subviews);
- var container2 = new View { Id = "Container2" };
- var count = 0;
- view.Disposing += View_Disposing;
- container2.Add (view);
- Assert.Equal (container2, view.SuperView);
- void View_Disposing (object sender, EventArgs e)
- {
- count++;
- Assert.Equal (view, sender);
- container2.Remove ((View)sender);
- }
- Assert.Equal (container1.Subviews.Count, container2.Subviews.Count);
- container1.Dispose ();
- Assert.Empty (container1.Subviews);
- Assert.Empty (container2.Subviews);
- Assert.Equal (1, count);
- Assert.Null (view.SuperView);
- container2.Dispose ();
- #if DEBUG_IDISPOSABLE
- Assert.Empty (Responder.Instances);
- #endif
- }
- [Fact]
- [TestRespondersDisposed]
- public void IsOverridden_False_IfNotOverridden ()
- {
- // MouseEvent IS defined on Responder but NOT overridden
- Assert.False (Responder.IsOverridden (new Responder (), "OnMouseEvent"));
- // MouseEvent is defined on Responder and NOT overrident on View
- Assert.False (
- Responder.IsOverridden (
- new View { Text = "View does not override OnMouseEvent" },
- "OnMouseEvent"
- )
- );
- Assert.False (
- Responder.IsOverridden (
- new DerivedView { Text = "DerivedView does not override OnMouseEvent" },
- "OnMouseEvent"
- )
- );
- // MouseEvent is NOT defined on DerivedView
- Assert.False (
- Responder.IsOverridden (
- new DerivedView { Text = "DerivedView does not override OnMouseEvent" },
- "OnMouseEvent"
- )
- );
- // OnKeyDown is defined on View and NOT overrident on Button
- Assert.False (
- Responder.IsOverridden (
- new Button { Text = "Button does not override OnKeyDown" },
- "OnKeyDown"
- )
- );
- #if DEBUG_IDISPOSABLE
- // HACK: Force clean up of Responders to avoid having to Dispose all the Views created above.
- Responder.Instances.Clear ();
- Assert.Empty (Responder.Instances);
- #endif
- }
- [Fact]
- [TestRespondersDisposed]
- public void IsOverridden_True_IfOverridden ()
- {
- // MouseEvent is defined on Responder IS overriden on ScrollBarView (but not View)
- Assert.True (
- Responder.IsOverridden (
- new ScrollBarView { Text = "ScrollBarView overrides OnMouseEvent" },
- "OnMouseEvent"
- )
- );
- // OnKeyDown is defined on View
- Assert.False (Responder.IsOverridden (new View { Text = "View overrides OnKeyDown" }, "OnKeyDown"));
- // OnKeyDown is defined on DerivedView
- Assert.True (
- Responder.IsOverridden (
- new DerivedView { Text = "DerivedView overrides OnKeyDown" },
- "OnKeyDown"
- )
- );
- // ScrollBarView overrides both MouseEvent (from Responder) and Redraw (from View)
- Assert.True (
- Responder.IsOverridden (
- new ScrollBarView { Text = "ScrollBarView overrides OnMouseEvent" },
- "OnMouseEvent"
- )
- );
- Assert.True (
- Responder.IsOverridden (
- new ScrollBarView { Text = "ScrollBarView overrides OnDrawContent" },
- "OnDrawContent"
- )
- );
- #if DEBUG_IDISPOSABLE
- // HACK: Force clean up of Responders to avoid having to Dispose all the Views created above.
- Responder.Instances.Clear ();
- Assert.Empty (Responder.Instances);
- #endif
- }
- [Fact]
- public void KeyPressed_Handled_True_Cancels_KeyPress ()
- {
- var r = new View ();
- var args = new Key { KeyCode = KeyCode.Null };
- Assert.False (r.OnKeyDown (args));
- Assert.False (args.Handled);
- r.KeyDown += (s, a) => a.Handled = true;
- Assert.True (r.OnKeyDown (args));
- Assert.True (args.Handled);
- r.Dispose ();
- }
- [Fact]
- [TestRespondersDisposed]
- public void New_Initializes ()
- {
- var r = new Responder ();
- Assert.NotNull (r);
- Assert.Equal ("Terminal.Gui.Responder", r.ToString ());
- r.Dispose ();
- }
- [Fact]
- [TestRespondersDisposed]
- public void New_Methods_Return_False ()
- {
- var r = new View ();
- //Assert.False (r.OnKeyDown (new KeyEventArgs () { Key = Key.Unknown }));
- Assert.False (r.OnKeyDown (new Key { KeyCode = KeyCode.Null }));
- Assert.False (r.OnKeyUp (new Key { KeyCode = KeyCode.Null }));
- Assert.False (r.NewMouseEvent (new MouseEvent { Flags = MouseFlags.AllEvents }));
- Assert.False (r.NewMouseEnterEvent (new MouseEvent { Flags = MouseFlags.AllEvents }));
- Assert.False (r.NewMouseLeaveEvent (new MouseEvent { Flags = MouseFlags.AllEvents }));
- var v = new View ();
- //Assert.False (r.OnEnter (v));
- v.Dispose ();
- v = new View ();
- //Assert.False (r.OnLeave (v));
- v.Dispose ();
- r.Dispose ();
- }
- [Fact]
- public void Responder_Not_Notifying_Dispose ()
- {
- // Only clear before because need to test after assert
- #if DEBUG_IDISPOSABLE
- Responder.Instances.Clear ();
- #endif
- var container1 = new View { Id = "Container1" };
- var view = new View { Id = "View" };
- container1.Add (view);
- Assert.Equal (container1, view.SuperView);
- Assert.Single (container1.Subviews);
- var container2 = new View { Id = "Container2" };
- container2.Add (view);
- Assert.Equal (container2, view.SuperView);
- Assert.Equal (container1.Subviews.Count, container2.Subviews.Count);
- container1.Dispose ();
- Assert.Empty (container1.Subviews);
- Assert.NotEmpty (container2.Subviews);
- Assert.Single (container2.Subviews);
- Assert.Null (view.SuperView);
- // Trying access disposed properties
- #if DEBUG_IDISPOSABLE
- Assert.True (container2.Subviews [0].WasDisposed);
- #endif
- Assert.False (container2.Subviews [0].CanFocus);
- Assert.Null (container2.Subviews [0].Margin);
- Assert.Null (container2.Subviews [0].Border);
- Assert.Null (container2.Subviews [0].Padding);
- Assert.Null (view.SuperView);
- container2.Dispose ();
- #if DEBUG_IDISPOSABLE
- Assert.Empty (Responder.Instances);
- #endif
- }
- public class DerivedView : View
- {
- public override bool OnKeyDown (Key keyEvent) { return true; }
- }
- }
|