#nullable enable using System; using System.Collections.Generic; using System.Linq; using Avalonia.Controls; using Avalonia.Markup.Xaml.XamlIl.Runtime; using Avalonia.Media; using Avalonia.UnitTests; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.Xaml; public class ParentStackProviderTests : XamlTestBase { [Fact] public void Parents_Are_Correct_For_Deferred_Content() { using var _ = UnitTestApplication.Start(TestServices.StyledWindow); var capturedParents = new CapturedParents(); AvaloniaLocator.CurrentMutable.BindToSelf(capturedParents); var window = (Window)AvaloniaRuntimeXamlLoader.Load(@" "); window.Show(); VerifyParents(capturedParents.LazyParents); VerifyParents(capturedParents.EagerParents); static void VerifyParents(object[]? parents) { Assert.NotNull(parents); Assert.NotEmpty(parents); Assert.Collection( parents, o => Assert.IsType(o), o => Assert.IsType(o), o => Assert.IsType(o)); } } } public class CapturedParents { public object[]? LazyParents { get; set; } public object[]? EagerParents { get; set; } } public class CapturingParentsMarkupExtension { public object ProvideValue(IServiceProvider serviceProvider) { var parentsProvider = serviceProvider.GetRequiredService(); var eagerParentsProvider = Assert.IsAssignableFrom(parentsProvider); var capturedParents = AvaloniaLocator.Current.GetRequiredService(); capturedParents.LazyParents = parentsProvider.Parents.ToArray(); capturedParents.EagerParents = EnumerateEagerParents(eagerParentsProvider); return Colors.Blue; } private static object[] EnumerateEagerParents(IAvaloniaXamlIlEagerParentStackProvider provider) { var parents = new List(); var enumerator = new EagerParentStackEnumerator(provider); while (enumerator.TryGetNext() is { } parent) parents.Add(parent); return parents.ToArray(); } }