From a222bf9239f5c4333c480797bc5b6d982a923b4c Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Wed, 12 Aug 2020 11:10:10 +0200 Subject: [PATCH] Add test to check ViewModel is Collected --- src/Avalonia.Base/Properties/AssemblyInfo.cs | 1 + .../Data/BindingTests_Method.cs | 46 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Properties/AssemblyInfo.cs b/src/Avalonia.Base/Properties/AssemblyInfo.cs index 692982cdc6..13b247de51 100644 --- a/src/Avalonia.Base/Properties/AssemblyInfo.cs +++ b/src/Avalonia.Base/Properties/AssemblyInfo.cs @@ -9,3 +9,4 @@ using Avalonia.Metadata; [assembly: InternalsVisibleTo("Avalonia.UnitTests")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly: InternalsVisibleTo("Avalonia.Controls.DataGrid")] +[assembly: InternalsVisibleTo("Avalonia.Markup.Xaml.UnitTests")] diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs index e1a7803821..7931912649 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using Avalonia.Controls; using Avalonia.Input; using Avalonia.UnitTests; @@ -140,6 +141,49 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data } } + [Fact] + public void Binding_Method_To_Command_Collected() + { + WeakReference MakeRef() + { + var weakVm = new WeakReference(null); + { + var vm = new ViewModel() + { + Parameter = null, + }; + weakVm.SetTarget(vm); + var canExecuteCount = 0; + var action = new Action(vm.Do); + var command = new Avalonia.Data.Converters.MethodToCommandConverter(action); + command.CanExecuteChanged += (s, e) => canExecuteCount++; + vm.Parameter = 0; + Threading.Dispatcher.UIThread.RunJobs(); + vm.Parameter = null; + Threading.Dispatcher.UIThread.RunJobs(); + Assert.Equal(2, canExecuteCount); + } + return weakVm; + } + bool IsAlive(WeakReference @ref) + { + return @ref.TryGetTarget(out var instance) + && instance is null == false; + } + + var vmref = MakeRef(); + + var beforeCollect = IsAlive(vmref); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + + var afterCollect = IsAlive(vmref); + + Assert.True(beforeCollect, "Invalid ViewModel instance, it is already collected."); + Assert.False(afterCollect, "ViewModel instance was not collected"); + } + static void PerformClick(Button button) { button.RaiseEvent(new KeyEventArgs