mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 06:58:57 +08:00
244 lines
6.8 KiB
C#
244 lines
6.8 KiB
C#
using System.Reflection;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Threading;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AtomUIContextMenu = AtomUI.Desktop.Controls.ContextMenu;
|
|
using AtomUIMenuItem = AtomUI.Desktop.Controls.MenuItem;
|
|
using AtomUIPopup = AtomUI.Desktop.Controls.Popup;
|
|
using AtomUIWindow = AtomUI.Desktop.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.Menu;
|
|
|
|
public class ContextMenuPinnedOpenTests
|
|
{
|
|
static ContextMenuPinnedOpenTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Opens_ContextMenu_And_Physical_Popup()
|
|
{
|
|
var contextMenu = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
contextMenu.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var host = new Border
|
|
{
|
|
Width = 120,
|
|
Height = 40,
|
|
ContextMenu = contextMenu
|
|
};
|
|
var window = ShowInWindow(host);
|
|
|
|
try
|
|
{
|
|
contextMenu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
var popup = GetPopup(contextMenu);
|
|
contextMenu.IsOpen.ShouldBeTrue();
|
|
popup.IsPopupPinnedOpen.ShouldBeTrue();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Rejects_ContextMenu_Close_Before_Submenu_Cleanup()
|
|
{
|
|
var parentItem = new AtomUIMenuItem { Header = "Parent" };
|
|
parentItem.Items.Add(new AtomUIMenuItem { Header = "Child" });
|
|
var contextMenu = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
contextMenu.Items.Add(parentItem);
|
|
var host = new Border
|
|
{
|
|
Width = 120,
|
|
Height = 40,
|
|
ContextMenu = contextMenu
|
|
};
|
|
var window = ShowInWindow(host);
|
|
|
|
try
|
|
{
|
|
contextMenu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
parentItem.IsSubMenuOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
|
|
contextMenu.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
contextMenu.IsOpen.ShouldBeTrue();
|
|
parentItem.IsSubMenuOpen.ShouldBeTrue();
|
|
GetPopup(contextMenu).IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Pin_Rejects_Window_Deactivation_Close()
|
|
{
|
|
var contextMenu = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
contextMenu.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var host = new Border
|
|
{
|
|
Width = 120,
|
|
Height = 40,
|
|
ContextMenu = contextMenu
|
|
};
|
|
var window = ShowInWindow(host);
|
|
|
|
try
|
|
{
|
|
contextMenu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
contextMenu.IsOpen.ShouldBeTrue();
|
|
|
|
RaiseWindowDeactivated(window);
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
contextMenu.IsOpen.ShouldBeTrue();
|
|
GetPopup(contextMenu).IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Popup_Unpin_Leaves_ContextMenu_Open_And_Restores_Normal_Close()
|
|
{
|
|
var contextMenu = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
contextMenu.Items.Add(new AtomUIMenuItem { Header = "Open" });
|
|
var host = new Border
|
|
{
|
|
Width = 120,
|
|
Height = 40,
|
|
ContextMenu = contextMenu
|
|
};
|
|
var window = ShowInWindow(host);
|
|
|
|
try
|
|
{
|
|
contextMenu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var popup = GetPopup(contextMenu);
|
|
|
|
contextMenu.IsPopupPinnedOpen = false;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
contextMenu.IsOpen.ShouldBeTrue();
|
|
popup.IsPopupPinnedOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeTrue();
|
|
|
|
contextMenu.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
contextMenu.IsOpen.ShouldBeFalse();
|
|
popup.IsOpen.ShouldBeFalse();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Replacing_A_Pinned_ContextMenu_Closes_The_Old_Owner_Session()
|
|
{
|
|
var oldContextMenu = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
oldContextMenu.Items.Add(new AtomUIMenuItem { Header = "Old" });
|
|
var replacement = new AtomUIContextMenu
|
|
{
|
|
IsMotionEnabled = false
|
|
};
|
|
replacement.Items.Add(new AtomUIMenuItem { Header = "New" });
|
|
var host = new Border
|
|
{
|
|
Width = 120,
|
|
Height = 40,
|
|
ContextMenu = oldContextMenu
|
|
};
|
|
var window = ShowInWindow(host);
|
|
|
|
try
|
|
{
|
|
oldContextMenu.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
var oldPopup = GetPopup(oldContextMenu);
|
|
oldPopup.IsOpen.ShouldBeTrue();
|
|
|
|
host.ContextMenu = replacement;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
oldContextMenu.IsOpen.ShouldBeFalse();
|
|
oldPopup.IsOpen.ShouldBeFalse();
|
|
|
|
replacement.IsPopupPinnedOpen = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
replacement.IsOpen.ShouldBeTrue();
|
|
GetPopup(replacement).IsOpen.ShouldBeTrue();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
Dispatcher.UIThread.RunJobs();
|
|
}
|
|
}
|
|
|
|
private static AtomUIPopup GetPopup(AtomUIContextMenu contextMenu)
|
|
{
|
|
var field = typeof(AtomUIContextMenu).GetField("_popup", BindingFlags.Instance | BindingFlags.NonPublic);
|
|
field.ShouldNotBeNull();
|
|
return field.GetValue(contextMenu).ShouldBeOfType<AtomUIPopup>();
|
|
}
|
|
|
|
private static AtomUIWindow ShowInWindow(Control content)
|
|
{
|
|
var window = new AtomUIWindow
|
|
{
|
|
Width = 320,
|
|
Height = 200,
|
|
Content = content
|
|
};
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
return window;
|
|
}
|
|
|
|
private static void RaiseWindowDeactivated(AtomUIWindow window)
|
|
{
|
|
var method = typeof(WindowBase).GetMethod(
|
|
"HandleDeactivated",
|
|
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
|
method.ShouldNotBeNull();
|
|
method.Invoke(window, null);
|
|
}
|
|
}
|