@ -611,6 +611,125 @@ namespace Avalonia.Controls.UnitTests
Assert . Equal ( 1 0 , raised ) ;
}
[Fact]
public void ContainerIndexChanged_Is_Raised_On_Insert ( )
{
using var app = App ( ) ;
var ( target , scroll , itemsControl ) = CreateTarget ( ) ;
var items = ( IList ) itemsControl . ItemsSource ! ;
var raised = 0 ;
var index = 1 ;
itemsControl . ContainerIndexChanged + = ( s , e ) = >
{
+ + raised ;
Assert . Equal ( index , e . OldIndex ) ;
Assert . Equal ( + + index , e . NewIndex ) ;
} ;
items . Insert ( index , "new" ) ;
Assert . Equal ( 9 , raised ) ;
}
[Fact]
public void ContainerIndexChanged_Is_Raised_When_Item_Inserted_Before_Realized_Elements ( )
{
using var app = App ( ) ;
var ( target , scroll , itemsControl ) = CreateTarget ( ) ;
var items = ( IList ) itemsControl . ItemsSource ! ;
var raised = 0 ;
var index = 2 0 ;
itemsControl . ContainerIndexChanged + = ( s , e ) = >
{
+ + raised ;
Assert . Equal ( index , e . OldIndex ) ;
Assert . Equal ( + + index , e . NewIndex ) ;
} ;
scroll . Offset = new Vector ( 0 , 2 0 0 ) ;
Layout ( target ) ;
items . Insert ( 1 0 , "new" ) ;
Assert . Equal ( 1 0 , raised ) ;
}
[Fact]
public void ContainerIndexChanged_Is_Raised_On_Remove ( )
{
using var app = App ( ) ;
var ( target , scroll , itemsControl ) = CreateTarget ( ) ;
var items = ( IList ) itemsControl . ItemsSource ! ;
var raised = 0 ;
var index = 1 ;
itemsControl . ContainerIndexChanged + = ( s , e ) = >
{
+ + raised ;
Assert . Equal ( index + 1 , e . OldIndex ) ;
Assert . Equal ( index + + , e . NewIndex ) ;
} ;
items . RemoveAt ( index ) ;
Assert . Equal ( 8 , raised ) ;
}
[Fact]
public void ContainerIndexChanged_Is_Raised_When_Item_Removed_Before_Realized_Elements ( )
{
using var app = App ( ) ;
var ( target , scroll , itemsControl ) = CreateTarget ( ) ;
var items = ( IList ) itemsControl . ItemsSource ! ;
var raised = 0 ;
var index = 2 0 ;
itemsControl . ContainerIndexChanged + = ( s , e ) = >
{
Assert . Equal ( index , e . OldIndex ) ;
Assert . Equal ( index - 1 , e . NewIndex ) ;
+ + index ;
+ + raised ;
} ;
scroll . Offset = new Vector ( 0 , 2 0 0 ) ;
Layout ( target ) ;
items . RemoveAt ( 1 0 ) ;
Assert . Equal ( 1 0 , raised ) ;
}
[Fact]
public void Fires_Correct_Container_Lifecycle_Events_On_Replace ( )
{
using var app = App ( ) ;
var ( target , scroll , itemsControl ) = CreateTarget ( ) ;
var items = ( IList ) itemsControl . ItemsSource ! ;
var events = new List < string > ( ) ;
itemsControl . ContainerPrepared + = ( s , e ) = > events . Add ( $"Prepared #{e.Container.GetHashCode()} = {e.Index}" ) ;
itemsControl . ContainerClearing + = ( s , e ) = > events . Add ( $"Clearing #{e.Container.GetHashCode()}" ) ;
itemsControl . ContainerIndexChanged + = ( s , e ) = > events . Add ( $"IndexChanged #{e.Container.GetHashCode()} {e.OldIndex} -> {e.NewIndex}" ) ;
var toReplace = target . GetRealizedElements ( ) . ElementAt ( 2 ) ! ;
items [ 2 ] = "New Item" ;
Assert . Equal (
new [ ] { $"Clearing #{toReplace.GetHashCode()}" } ,
events ) ;
events . Clear ( ) ;
itemsControl . UpdateLayout ( ) ;
Assert . Equal (
new [ ] { $"Prepared #{toReplace.GetHashCode()} = 2" } ,
events ) ;
events . Clear ( ) ;
}
[Fact]
public void Scrolling_Down_With_Larger_Element_Does_Not_Cause_Jump_And_Arrives_At_End ( )
{