A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

118 lines
3.4 KiB

using System;
using System.Collections.Generic;
using Avalonia.Collections;
using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.LeakTests
{
public class BindingExpressionTests : ScopedTestBase
{
[Fact]
public void Should_Not_Keep_Source_Alive_ObservableCollection()
{
static WeakReference CreateExpression()
{
var list = new AvaloniaList<string> { "foo", "bar" };
var source = new { Foo = list };
var target = BindingExpression.Create(source, o => o.Foo);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(list);
}
var weakSource = CreateExpression();
Assert.True(weakSource.IsAlive);
GC.Collect();
Assert.False(weakSource.IsAlive);
}
[Fact]
public void Should_Not_Keep_Source_Alive_ObservableCollection_With_DataValidation()
{
static WeakReference CreateExpression()
{
var list = new AvaloniaList<string> { "foo", "bar" };
var source = new { Foo = list };
var target = BindingExpression.Create(source, o => o.Foo, enableDataValidation: true);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(list);
}
var weakSource = CreateExpression();
Assert.True(weakSource.IsAlive);
GC.Collect();
Assert.False(weakSource.IsAlive);
}
[Fact]
public void Should_Not_Keep_Source_Alive_NonIntegerIndexer()
{
static WeakReference CreateExpression()
{
var indexer = new NonIntegerIndexer();
var source = new { Foo = indexer };
var target = BindingExpression.Create(source, o => o.Foo);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(indexer);
}
var weakSource = CreateExpression();
Assert.True(weakSource.IsAlive);
GC.Collect();
Assert.False(weakSource.IsAlive);
}
[Fact]
public void Should_Not_Keep_Source_Alive_MethodBinding()
{
static WeakReference CreateExpression()
{
var methodBound = new MethodBound();
var source = new { Foo = methodBound };
var target = BindingExpression.Create(source, o => (Action)o.Foo.A);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(methodBound);
}
var weakSource = CreateExpression();
Assert.True(weakSource.IsAlive);
GC.Collect();
Assert.False(weakSource.IsAlive);
}
private class MethodBound
{
public void A() { }
}
private class NonIntegerIndexer : NotifyingBase
{
private readonly Dictionary<string, string> _storage = new Dictionary<string, string>();
public string this[string key]
{
get
{
return _storage[key];
}
set
{
_storage[key] = value;
RaisePropertyChanged(CommonPropertyNames.IndexerName);
}
}
}
}
}