@ -1,6 +1,8 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Collections.Generic ;
using System.Linq ;
using Avalonia.Controls.Presenters ;
using Avalonia.Controls.Presenters ;
using Avalonia.Controls.Primitives ;
using Avalonia.Controls.Primitives ;
using Avalonia.Controls.Templates ;
using Avalonia.Controls.Templates ;
@ -14,9 +16,8 @@ namespace Avalonia.Controls.UnitTests.Presenters
[Fact]
[Fact]
public void Should_Return_IsLogicalScrollEnabled_False_When_Has_No_Virtualizing_Panel ( )
public void Should_Return_IsLogicalScrollEnabled_False_When_Has_No_Virtualizing_Panel ( )
{
{
var target = new ItemsPresenter
var target = CreateTarget ( ) ;
{
target . ClearValue ( ItemsPresenter . ItemsPanelProperty ) ;
} ;
target . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
@ -26,11 +27,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
[Fact]
[Fact]
public void Should_Return_IsLogicalScrollEnabled_False_When_VirtualizationMode_None ( )
public void Should_Return_IsLogicalScrollEnabled_False_When_VirtualizationMode_None ( )
{
{
var target = new ItemsPresenter
var target = CreateTarget ( ItemVirtualizationMode . None ) ;
{
ItemsPanel = VirtualizingPanelTemplate ( ) ,
VirtualizationMode = ItemVirtualizationMode . None ,
} ;
target . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
@ -38,45 +35,108 @@ namespace Avalonia.Controls.UnitTests.Presenters
}
}
[Fact]
[Fact]
public void Should_Return_IsLogicalScrollEnabled_True_When_Has_Virtualizing_Panel ( )
public void Should_Return_IsLogicalScrollEnabled_False_When_Doesnt_Have_ScrollPresenter_Parent ( )
{
{
var target = new ItemsPresenter
var target = new ItemsPresenter
{
{
ItemsPanel = VirtualizingPanelTemplate ( ) ,
ItemsPanel = VirtualizingPanelTemplate ( ) ,
ItemTemplate = ItemTemplate ( ) ,
VirtualizationMode = ItemVirtualizationMode . Simple ,
} ;
} ;
target . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
Assert . False ( ( ( IScrollable ) target ) . IsLogicalScrollEnabled ) ;
}
[Fact]
public void Should_Return_IsLogicalScrollEnabled_True ( )
{
var target = CreateTarget ( ) ;
target . ApplyTemplate ( ) ;
Assert . True ( ( ( IScrollable ) target ) . IsLogicalScrollEnabled ) ;
Assert . True ( ( ( IScrollable ) target ) . IsLogicalScrollEnabled ) ;
}
}
[Fact]
public void Should_Fill_Panel_With_Containers ( )
{
var target = CreateTarget ( ) ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 0 0 ) ) ;
Assert . Equal ( 1 0 , target . Panel . Children . Count ) ;
}
[Fact]
public void Should_Only_Create_Enough_Containers_To_Display_All_Items ( )
{
var target = CreateTarget ( itemCount : 2 ) ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 0 0 ) ) ;
Assert . Equal ( 2 , target . Panel . Children . Count ) ;
}
[Fact]
public void Initial_Item_DataContexts_Should_Be_Correct ( )
{
var target = CreateTarget ( ) ;
var items = ( IList < string > ) target . Items ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 0 0 ) ) ;
for ( var i = 0 ; i < target . Panel . Children . Count ; + + i )
{
Assert . Equal ( items [ i ] , target . Panel . Children [ i ] . DataContext ) ;
}
}
[Fact]
public void Should_Add_New_Items_When_Control_Is_Enlarged ( )
{
var target = CreateTarget ( ) ;
var items = ( IList < string > ) target . Items ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 0 0 ) ) ;
Assert . Equal ( 1 0 , target . Panel . Children . Count ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 2 0 ) ) ;
Assert . Equal ( 1 2 , target . Panel . Children . Count ) ;
for ( var i = 0 ; i < target . Panel . Children . Count ; + + i )
{
Assert . Equal ( items [ i ] , target . Panel . Children [ i ] . DataContext ) ;
}
}
public class Simple
public class Simple
{
{
[Fact]
[Fact]
public void Should_Return_Items_Count_For_Extent ( )
public void Should_Return_Items_Count_For_Extent ( )
{
{
var target = new ItemsPresenter
var target = CreateTarget ( ) ;
{
Items = new string [ 1 0 ] ,
ItemsPanel = VirtualizingPanelTemplate ( ) ,
VirtualizationMode = ItemVirtualizationMode . Simple ,
} ;
target . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
Assert . Equal ( new Size ( 0 , 1 0 ) , ( ( IScrollable ) target ) . Extent ) ;
Assert . Equal ( new Size ( 0 , 2 0 ) , ( ( IScrollable ) target ) . Extent ) ;
}
}
[Fact]
[Fact]
public void Should_Have_Number_Of_Visible_Items_As_Viewport ( )
public void Should_Have_Number_Of_Visible_Items_As_Viewport ( )
{
{
var target = new ItemsPresenter
var target = CreateTarget ( ) ;
{
Items = new string [ 2 0 ] ,
ItemsPanel = VirtualizingPanelTemplate ( ) ,
ItemTemplate = ItemTemplate ( ) ,
VirtualizationMode = ItemVirtualizationMode . Simple ,
} ;
target . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
@ -84,13 +144,52 @@ namespace Avalonia.Controls.UnitTests.Presenters
Assert . Equal ( 1 0 , ( ( IScrollable ) target ) . Viewport . Height ) ;
Assert . Equal ( 1 0 , ( ( IScrollable ) target ) . Viewport . Height ) ;
}
}
[Fact]
public void Should_Remove_Items_When_Control_Is_Shrank ( )
{
var target = CreateTarget ( ) ;
var items = ( IList < string > ) target . Items ;
target . ApplyTemplate ( ) ;
target . Measure ( new Size ( 1 0 0 , 1 0 0 ) ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 1 0 0 ) ) ;
Assert . Equal ( 1 0 , target . Panel . Children . Count ) ;
target . Arrange ( new Rect ( 0 , 0 , 1 0 0 , 8 0 ) ) ;
Assert . Equal ( 8 , target . Panel . Children . Count ) ;
}
}
private static ItemsPresenter CreateTarget (
ItemVirtualizationMode mode = ItemVirtualizationMode . Simple ,
int itemCount = 2 0 )
{
ItemsPresenter result ;
var items = Enumerable . Range ( 0 , itemCount ) . Select ( x = > $"Item {x}" ) . ToList ( ) ;
var scroller = new ScrollContentPresenter
{
Content = result = new ItemsPresenter
{
Items = items ,
ItemsPanel = VirtualizingPanelTemplate ( ) ,
ItemTemplate = ItemTemplate ( ) ,
VirtualizationMode = mode ,
}
} ;
scroller . UpdateChild ( ) ;
return result ;
}
}
private static IDataTemplate ItemTemplate ( )
private static IDataTemplate ItemTemplate ( )
{
{
return new FuncDataTemplate < string > ( x = > new TextBlock
return new FuncDataTemplate < string > ( x = > new Canvas
{
{
Text = x ,
Height = 1 0 ,
Height = 1 0 ,
} ) ;
} ) ;
}
}