Files
GhostEngine/src/Test/Ghost.UnitTest/DockingModelTest.cs

178 lines
4.6 KiB
C#

using Ghost.Editor.Core.Controls.Internal.Docking;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Ghost.UnitTest;
[TestClass]
public class DockingModelTest
{
[TestMethod]
public void TestAddChild_SetsParent()
{
var group = new DockGroupNode();
var child = new DockPanelNode();
group.AddChild(child);
Assert.AreEqual(group, child.Parent);
CollectionAssert.Contains(group.Children, child);
}
[TestMethod]
public void TestAddChild_RemovesFromOldParent()
{
var group1 = new DockGroupNode();
var group2 = new DockGroupNode();
var child = new DockPanelNode();
group1.AddChild(child);
group2.AddChild(child);
Assert.AreEqual(group2, child.Parent);
CollectionAssert.DoesNotContain(group1.Children, child);
CollectionAssert.Contains(group2.Children, child);
}
[TestMethod]
public void TestAddChild_PreventsCycle()
{
var group1 = new DockGroupNode();
var group2 = new DockGroupNode();
group1.AddChild(group2);
bool thrown = false;
try
{
group2.AddChild(group1);
}
catch (InvalidOperationException)
{
thrown = true;
}
Assert.IsTrue(thrown, "Should have thrown InvalidOperationException due to cycle.");
}
[TestMethod]
public void TestRemoveChild_ClearsParent()
{
var group = new DockGroupNode();
var child = new DockPanelNode();
group.AddChild(child);
group.RemoveChild(child);
Assert.IsNull(child.Parent);
CollectionAssert.DoesNotContain(group.Children, child);
}
[TestMethod]
public void TestPanel_SelectionSync_IndexToItem()
{
var panel = new DockPanelNode();
var item1 = new object();
var item2 = new object();
panel.Items.Add(item1);
panel.Items.Add(item2);
panel.SelectedIndex = 1;
Assert.AreEqual(item2, panel.SelectedItem);
panel.SelectedIndex = 0;
Assert.AreEqual(item1, panel.SelectedItem);
panel.SelectedIndex = -1;
Assert.IsNull(panel.SelectedItem);
}
[TestMethod]
public void TestPanel_SelectionSync_ItemToIndex()
{
var panel = new DockPanelNode();
var item1 = new object();
var item2 = new object();
panel.Items.Add(item1);
panel.Items.Add(item2);
panel.SelectedItem = item2;
Assert.AreEqual(1, panel.SelectedIndex);
panel.SelectedItem = item1;
Assert.AreEqual(0, panel.SelectedIndex);
panel.SelectedItem = null;
Assert.AreEqual(-1, panel.SelectedIndex);
}
[TestMethod]
public void TestPanel_CollectionChanged_UpdatesSelection()
{
var panel = new DockPanelNode();
var item1 = new object();
panel.Items.Add(item1);
Assert.AreEqual(0, panel.SelectedIndex);
Assert.AreEqual(item1, panel.SelectedItem);
panel.Items.Remove(item1);
Assert.AreEqual(-1, panel.SelectedIndex);
Assert.IsNull(panel.SelectedItem);
}
[TestMethod]
public void TestPanel_RemoveMiddleItem_MaintainsSelection()
{
var panel = new DockPanelNode();
var item1 = new object();
var item2 = new object();
var item3 = new object();
panel.Items.Add(item1);
panel.Items.Add(item2);
panel.Items.Add(item3);
panel.SelectedItem = item2;
Assert.AreEqual(1, panel.SelectedIndex);
// Remove item1 (before selection)
panel.Items.Remove(item1);
Assert.AreEqual(item2, panel.SelectedItem);
Assert.AreEqual(0, panel.SelectedIndex);
}
[TestMethod]
public void TestPanel_RemoveSelectedItem_UpdatesSelection()
{
var panel = new DockPanelNode();
var item1 = new object();
var item2 = new object();
panel.Items.Add(item1);
panel.Items.Add(item2);
panel.SelectedItem = item1;
panel.Items.Remove(item1);
// Should fallback to next available item at same index
Assert.AreEqual(item2, panel.SelectedItem);
Assert.AreEqual(0, panel.SelectedIndex);
}
[TestMethod]
public void TestPanel_SetInvalidSelectedItem_ResetsSelection()
{
var panel = new DockPanelNode();
var item1 = new object();
var item2 = new object();
panel.Items.Add(item1);
panel.SelectedItem = item1;
panel.SelectedItem = item2; // Not in collection
Assert.IsNull(panel.SelectedItem);
Assert.AreEqual(-1, panel.SelectedIndex);
}
}