diff --git a/src/Avalonia.Layout/Properties/AssemblyInfo.cs b/src/Avalonia.Layout/Properties/AssemblyInfo.cs index 70fc1e9330..392ad323e5 100644 --- a/src/Avalonia.Layout/Properties/AssemblyInfo.cs +++ b/src/Avalonia.Layout/Properties/AssemblyInfo.cs @@ -1,6 +1,10 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Runtime.CompilerServices; using Avalonia.Metadata; +[assembly: InternalsVisibleTo("Avalonia.Layout.UnitTests")] + [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Layout")] + diff --git a/tests/Avalonia.Layout.UnitTests/LayoutQueueTests.cs b/tests/Avalonia.Layout.UnitTests/LayoutQueueTests.cs new file mode 100644 index 0000000000..f047677a8a --- /dev/null +++ b/tests/Avalonia.Layout.UnitTests/LayoutQueueTests.cs @@ -0,0 +1,196 @@ +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Avalonia.Layout.UnitTests +{ + public class LayoutQueueTests + { + [Fact] + public void Should_Enqueue() + { + var target = new LayoutQueue(_ => true); + var refQueue = new Queue(); + var items = new[] { "1", "2", "3" }; + + foreach (var item in items) + { + target.Enqueue(item); + refQueue.Enqueue(item); + } + + Assert.Equal(refQueue, target); + } + + [Fact] + public void Should_Dequeue() + { + var target = new LayoutQueue(_ => true); + var refQueue = new Queue(); + var items = new[] { "1", "2", "3" }; + + foreach (var item in items) + { + target.Enqueue(item); + refQueue.Enqueue(item); + } + + while (refQueue.Count > 0) + { + Assert.Equal(refQueue.Dequeue(), target.Dequeue()); + } + } + + [Fact] + public void Should_Enqueue_UniqueElements() + { + var target = new LayoutQueue(_ => true); + + var items = new[] { "1", "2", "3", "1" }; + + foreach (var item in items) + { + target.Enqueue(item); + } + + Assert.Equal(3, target.Count); + Assert.Equal(items.Take(3), target); + } + + [Fact] + public void Shouldnt_Enqueue_More_Than_Limit_In_Loop() + { + var target = new LayoutQueue(_ => true); + + //1 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.BeginLoop(3); + + target.Dequeue(); + + //2 + target.Enqueue("Foo"); + target.Dequeue(); + + //3 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.Dequeue(); + + //4 more than limit shouldn't be added + target.Enqueue("Foo"); + + Assert.Equal(0, target.Count); + } + + [Fact] + public void Shouldnt_Count_Unique_Enqueue_For_Limit_In_Loop() + { + var target = new LayoutQueue(_ => true); + + //1 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.BeginLoop(3); + + target.Dequeue(); + + //2 + target.Enqueue("Foo"); + target.Enqueue("Foo"); + target.Dequeue(); + + //3 + target.Enqueue("Foo"); + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.Dequeue(); + + //4 more than limit shouldn't be added + target.Enqueue("Foo"); + + Assert.Equal(0, target.Count); + } + + [Fact] + public void Should_Enqueue_When_Condition_True_After_Loop_When_Limit_Met() + { + var target = new LayoutQueue(_ => true); + + //1 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.BeginLoop(3); + + target.Dequeue(); + + //2 + target.Enqueue("Foo"); + target.Dequeue(); + + //3 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.Dequeue(); + + //4 more than limit shouldn't be added to queue + target.Enqueue("Foo"); + + Assert.Equal(0, target.Count); + + target.EndLoop(); + + //after loop should be added once + Assert.Equal(1, target.Count); + Assert.Equal("Foo", target.First()); + } + + [Fact] + public void Shouldnt_Enqueue_When_Condition_False_After_Loop_When_Limit_Met() + { + var target = new LayoutQueue(_ => false); + + //1 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.BeginLoop(3); + + target.Dequeue(); + + //2 + target.Enqueue("Foo"); + target.Dequeue(); + + //3 + target.Enqueue("Foo"); + + Assert.Equal(1, target.Count); + + target.Dequeue(); + + //4 more than limit shouldn't be added + target.Enqueue("Foo"); + + Assert.Equal(0, target.Count); + + target.EndLoop(); + + Assert.Equal(0, target.Count); + } + } +}