using CursorLang.Models; using CursorLang.Services; using CursorLang.Tests.Infrastructure; namespace CursorLang.Tests.Services; /// /// The link between watching the layout and showing the tooltip. /// public sealed class LayoutNotificationCoordinatorTests { private static readonly KeyboardLayout Russian = KeyboardLayout.FromLocaleId(0x0419); [Fact] public void Starting_turns_on_the_layout_watch() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); Assert.Equal(1, layouts.StartCalls); } [Fact] public void A_layout_switched_by_the_user_shows_the_tooltip() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.UserSwitched); Assert.Equal([Russian], popup.Shown); } // Moving to another application changes the layout with no user involved, // and the tooltip would be intrusive [Fact] public void Switching_applications_shows_no_tooltip() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.ApplicationSwitched); Assert.Empty(popup.Shown); } [Fact] public void Every_switch_shows_its_own_layout() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); KeyboardLayout english = KeyboardLayout.FromLocaleId(0x0409); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.UserSwitched); layouts.RaiseLayoutChanged(english, LayoutChangeReason.UserSwitched); Assert.Equal([Russian, english], popup.Shown); } [Fact] public void Before_the_start_no_tooltip_is_shown() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.UserSwitched); Assert.Empty(popup.Shown); } [Fact] public void Closing_stops_the_watch_and_unsubscribes_from_the_event() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); coordinator.Dispose(); Assert.Equal(1, layouts.StopCalls); Assert.False(layouts.HasSubscribers); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.UserSwitched); Assert.Empty(popup.Shown); } [Fact] public void The_show_until_hidden_is_not_called_from_here() { var layouts = new FakeKeyboardLayoutService(); var popup = new FakeLayoutPopupService(); using var coordinator = new LayoutNotificationCoordinator(layouts, popup); coordinator.Start(); layouts.RaiseLayoutChanged(Russian, LayoutChangeReason.UserSwitched); Assert.Empty(popup.ShownUntilHidden); Assert.Equal(0, popup.HideCalls); } }