committed by
GitHub
8 changed files with 168 additions and 24 deletions
@ -0,0 +1,86 @@ |
|||||
|
#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 xmlns='https://github.com/avaloniaui'
|
||||
|
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
|
||||
|
xmlns:local='clr-namespace:Avalonia.Markup.Xaml.UnitTests.Xaml;assembly=Avalonia.Markup.Xaml.UnitTests'> |
||||
|
|
||||
|
<Window.Resources> |
||||
|
<SolidColorBrush x:Key='Brush' Color='{local:CapturingParentsMarkupExtension}' /> |
||||
|
</Window.Resources> |
||||
|
|
||||
|
<TextBlock Foreground='{StaticResource Brush}' /> |
||||
|
|
||||
|
</Window>");
|
||||
|
|
||||
|
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<SolidColorBrush>(o), |
||||
|
o => Assert.IsType<Window>(o), |
||||
|
o => Assert.IsType<UnitTestApplication>(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<IAvaloniaXamlIlParentStackProvider>(); |
||||
|
var eagerParentsProvider = Assert.IsAssignableFrom<IAvaloniaXamlIlEagerParentStackProvider>(parentsProvider); |
||||
|
|
||||
|
var capturedParents = AvaloniaLocator.Current.GetRequiredService<CapturedParents>(); |
||||
|
capturedParents.LazyParents = parentsProvider.Parents.ToArray(); |
||||
|
capturedParents.EagerParents = EnumerateEagerParents(eagerParentsProvider); |
||||
|
|
||||
|
return Colors.Blue; |
||||
|
} |
||||
|
|
||||
|
private static object[] EnumerateEagerParents(IAvaloniaXamlIlEagerParentStackProvider provider) |
||||
|
{ |
||||
|
var parents = new List<object>(); |
||||
|
|
||||
|
var enumerator = new EagerParentStackEnumerator(provider); |
||||
|
while (enumerator.TryGetNext() is { } parent) |
||||
|
parents.Add(parent); |
||||
|
|
||||
|
return parents.ToArray(); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue