namespace Terminal.Gui.ApplicationTests; public class StackExtensionsTests { [Fact] public void Stack_Toplevels_Contains () { Stack Toplevels = CreateToplevels (); var comparer = new ToplevelEqualityComparer (); Assert.True (Toplevels.Contains (new Window { Id = "w2" }, comparer)); Assert.False (Toplevels.Contains (new Toplevel { Id = "top2" }, comparer)); } [Fact] public void Stack_Toplevels_CreateToplevels () { Stack Toplevels = CreateToplevels (); int index = Toplevels.Count - 1; foreach (Toplevel top in Toplevels) { if (top.GetType () == typeof (Toplevel)) { Assert.Equal ("Top", top.Id); } else { Assert.Equal ($"w{index}", top.Id); } index--; } Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("w4", tops [0].Id); Assert.Equal ("w3", tops [1].Id); Assert.Equal ("w2", tops [2].Id); Assert.Equal ("w1", tops [3].Id); Assert.Equal ("Top", tops [^1].Id); } [Fact] public void Stack_Toplevels_FindDuplicates () { Stack Toplevels = CreateToplevels (); var comparer = new ToplevelEqualityComparer (); Toplevels.Push (new Toplevel { Id = "w4" }); Toplevels.Push (new Toplevel { Id = "w1" }); Toplevel [] dup = Toplevels.FindDuplicates (comparer).ToArray (); Assert.Equal ("w4", dup [0].Id); Assert.Equal ("w1", dup [^1].Id); } [Fact] public void Stack_Toplevels_MoveNext () { Stack Toplevels = CreateToplevels (); Toplevels.MoveNext (); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("w3", tops [0].Id); Assert.Equal ("w2", tops [1].Id); Assert.Equal ("w1", tops [2].Id); Assert.Equal ("Top", tops [3].Id); Assert.Equal ("w4", tops [^1].Id); } [Fact] public void Stack_Toplevels_MovePrevious () { Stack Toplevels = CreateToplevels (); Toplevels.MovePrevious (); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("Top", tops [0].Id); Assert.Equal ("w4", tops [1].Id); Assert.Equal ("w3", tops [2].Id); Assert.Equal ("w2", tops [3].Id); Assert.Equal ("w1", tops [^1].Id); } [Fact] public void Stack_Toplevels_MoveTo () { Stack Toplevels = CreateToplevels (); var valueToMove = new Window { Id = "w1" }; var comparer = new ToplevelEqualityComparer (); Toplevels.MoveTo (valueToMove, 1, comparer); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("w4", tops [0].Id); Assert.Equal ("w1", tops [1].Id); Assert.Equal ("w3", tops [2].Id); Assert.Equal ("w2", tops [3].Id); Assert.Equal ("Top", tops [^1].Id); } [Fact] public void Stack_Toplevels_MoveTo_From_Last_To_Top () { Stack Toplevels = CreateToplevels (); var valueToMove = new Window { Id = "Top" }; var comparer = new ToplevelEqualityComparer (); Toplevels.MoveTo (valueToMove, 0, comparer); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("Top", tops [0].Id); Assert.Equal ("w4", tops [1].Id); Assert.Equal ("w3", tops [2].Id); Assert.Equal ("w2", tops [3].Id); Assert.Equal ("w1", tops [^1].Id); } [Fact] public void Stack_Toplevels_Replace () { Stack Toplevels = CreateToplevels (); var valueToReplace = new Window { Id = "w1" }; var valueToReplaceWith = new Window { Id = "new" }; var comparer = new ToplevelEqualityComparer (); Toplevels.Replace (valueToReplace, valueToReplaceWith, comparer); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("w4", tops [0].Id); Assert.Equal ("w3", tops [1].Id); Assert.Equal ("w2", tops [2].Id); Assert.Equal ("new", tops [3].Id); Assert.Equal ("Top", tops [^1].Id); } [Fact] public void Stack_Toplevels_Swap () { Stack Toplevels = CreateToplevels (); var valueToSwapFrom = new Window { Id = "w3" }; var valueToSwapTo = new Window { Id = "w1" }; var comparer = new ToplevelEqualityComparer (); Toplevels.Swap (valueToSwapFrom, valueToSwapTo, comparer); Toplevel [] tops = Toplevels.ToArray (); Assert.Equal ("w4", tops [0].Id); Assert.Equal ("w1", tops [1].Id); Assert.Equal ("w2", tops [2].Id); Assert.Equal ("w3", tops [3].Id); Assert.Equal ("Top", tops [^1].Id); } [Fact] public void ToplevelEqualityComparer_GetHashCode () { Stack Toplevels = CreateToplevels (); // Only allows unique keys HashSet hCodes = new (); foreach (Toplevel top in Toplevels) { Assert.True (hCodes.Add (top.GetHashCode ())); } } private Stack CreateToplevels () { Stack Toplevels = new (); Toplevels.Push (new Toplevel { Id = "Top" }); Toplevels.Push (new Window { Id = "w1" }); Toplevels.Push (new Window { Id = "w2" }); Toplevels.Push (new Window { Id = "w3" }); Toplevels.Push (new Window { Id = "w4" }); return Toplevels; } }