1
0
Эх сурвалжийг харах

Added skipped failing leak test for transitions.

It's leaking on master too, so address this separately.
Steven Kirk 6 жил өмнө
parent
commit
4a386d1b84

+ 4 - 1
src/Avalonia.Animation/Properties/AssemblyInfo.cs

@@ -3,7 +3,10 @@
 
 using Avalonia.Metadata;
 using System.Reflection;
+using System.Runtime.CompilerServices;
 
 [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")]
 [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Easings")]
-[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")]
+[assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation.Animators")]
+
+[assembly: InternalsVisibleTo("Avalonia.LeakTests")]

+ 60 - 0
tests/Avalonia.LeakTests/TransitionTests.cs

@@ -0,0 +1,60 @@
+using System;
+using Avalonia.Animation;
+using Avalonia.Controls;
+using Avalonia.UnitTests;
+using JetBrains.dotMemoryUnit;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace Avalonia.LeakTests
+{
+    [DotMemoryUnit(FailIfRunWithoutSupport = false)]
+    public class TransitionTests
+    {
+        public TransitionTests(ITestOutputHelper atr)
+        {
+            DotMemoryUnitTestOutput.SetOutputMethod(atr.WriteLine);
+        }
+
+        [Fact(Skip = "TODO: Fix this leak")]
+        public void Transition_On_StyledProperty_Is_Freed()
+        {
+            var clock = new MockGlobalClock();
+
+            using (UnitTestApplication.Start(new TestServices(globalClock: clock)))
+            {
+                Func<Border> run = () =>
+                {
+                    var border = new Border
+                    {
+                        Transitions =
+                        {
+                            new DoubleTransition
+                            {
+                                Duration = TimeSpan.FromSeconds(1),
+                                Property = Border.OpacityProperty,
+                            }
+                        }
+                    };
+
+                    border.Opacity = 0;
+
+                    clock.Pulse(TimeSpan.FromSeconds(0));
+                    clock.Pulse(TimeSpan.FromSeconds(0.5));
+
+                    Assert.Equal(0.5, border.Opacity);
+
+                    clock.Pulse(TimeSpan.FromSeconds(1));
+
+                    Assert.Equal(0, border.Opacity);
+                    return border;
+                };
+
+                var result = run();
+
+                dotMemory.Check(memory =>
+                    Assert.Equal(0, memory.GetObjects(where => where.Type.Is<TransitionInstance>()).ObjectsCount));
+            }
+        }
+    }
+}

+ 10 - 0
tests/Avalonia.UnitTests/MockGlobalClock.cs

@@ -0,0 +1,10 @@
+using System;
+using Avalonia.Animation;
+
+namespace Avalonia.UnitTests
+{
+    public class MockGlobalClock : ClockBase, IGlobalClock
+    {
+        public new void Pulse(TimeSpan systemTime) => base.Pulse(systemTime);
+    }
+}

+ 6 - 0
tests/Avalonia.UnitTests/TestServices.cs

@@ -16,6 +16,7 @@ using System.Reactive.Concurrency;
 using System.Collections.Generic;
 using Avalonia.Controls;
 using System.Reflection;
+using Avalonia.Animation;
 
 namespace Avalonia.UnitTests
 {
@@ -58,6 +59,7 @@ namespace Avalonia.UnitTests
         public TestServices(
             IAssetLoader assetLoader = null,
             IFocusManager focusManager = null,
+            IGlobalClock globalClock = null,
             IInputManager inputManager = null,
             Func<IKeyboardDevice> keyboardDevice = null,
             IKeyboardNavigationHandler keyboardNavigation = null,
@@ -75,6 +77,7 @@ namespace Avalonia.UnitTests
         {
             AssetLoader = assetLoader;
             FocusManager = focusManager;
+            GlobalClock = globalClock;
             InputManager = inputManager;
             KeyboardDevice = keyboardDevice;
             KeyboardNavigation = keyboardNavigation;
@@ -93,6 +96,7 @@ namespace Avalonia.UnitTests
         public IAssetLoader AssetLoader { get; }
         public IInputManager InputManager { get; }
         public IFocusManager FocusManager { get; }
+        public IGlobalClock GlobalClock { get; }
         public Func<IKeyboardDevice> KeyboardDevice { get; }
         public IKeyboardNavigationHandler KeyboardNavigation { get; }
         public Func<IMouseDevice> MouseDevice { get; }
@@ -109,6 +113,7 @@ namespace Avalonia.UnitTests
         public TestServices With(
             IAssetLoader assetLoader = null,
             IFocusManager focusManager = null,
+            IGlobalClock globalClock = null,
             IInputManager inputManager = null,
             Func<IKeyboardDevice> keyboardDevice = null,
             IKeyboardNavigationHandler keyboardNavigation = null,
@@ -127,6 +132,7 @@ namespace Avalonia.UnitTests
             return new TestServices(
                 assetLoader: assetLoader ?? AssetLoader,
                 focusManager: focusManager ?? FocusManager,
+                globalClock: globalClock ?? GlobalClock,
                 inputManager: inputManager ?? InputManager,
                 keyboardDevice: keyboardDevice ?? KeyboardDevice,
                 keyboardNavigation: keyboardNavigation ?? KeyboardNavigation,

+ 2 - 0
tests/Avalonia.UnitTests/UnitTestApplication.cs

@@ -12,6 +12,7 @@ using Avalonia.Threading;
 using System.Reactive.Disposables;
 using System.Reactive.Concurrency;
 using Avalonia.Input.Platform;
+using Avalonia.Animation;
 
 namespace Avalonia.UnitTests
 {
@@ -52,6 +53,7 @@ namespace Avalonia.UnitTests
             AvaloniaLocator.CurrentMutable
                 .Bind<IAssetLoader>().ToConstant(Services.AssetLoader)
                 .Bind<IFocusManager>().ToConstant(Services.FocusManager)
+                .Bind<IGlobalClock>().ToConstant(Services.GlobalClock)
                 .BindToSelf<IGlobalStyles>(this)
                 .Bind<IInputManager>().ToConstant(Services.InputManager)
                 .Bind<IKeyboardDevice>().ToConstant(Services.KeyboardDevice?.Invoke())