Browse Source

Added skipped failing leak test for transitions.

It's leaking on master too, so address this separately.
pull/2517/head
Steven Kirk 7 years ago
parent
commit
4a386d1b84
  1. 5
      src/Avalonia.Animation/Properties/AssemblyInfo.cs
  2. 60
      tests/Avalonia.LeakTests/TransitionTests.cs
  3. 10
      tests/Avalonia.UnitTests/MockGlobalClock.cs
  4. 6
      tests/Avalonia.UnitTests/TestServices.cs
  5. 2
      tests/Avalonia.UnitTests/UnitTestApplication.cs

5
src/Avalonia.Animation/Properties/AssemblyInfo.cs

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

60
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
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
tests/Avalonia.UnitTests/TestServices.cs

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

2
tests/Avalonia.UnitTests/UnitTestApplication.cs

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

Loading…
Cancel
Save