|
|
|
@ -1,11 +1,13 @@ |
|
|
|
// 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.
|
|
|
|
|
|
|
|
using System.Collections.ObjectModel; |
|
|
|
using System.Linq; |
|
|
|
using Avalonia.Controls.Presenters; |
|
|
|
using Avalonia.Controls.Primitives; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
using Avalonia.LogicalTree; |
|
|
|
using Avalonia.VisualTree; |
|
|
|
using Xunit; |
|
|
|
|
|
|
|
namespace Avalonia.Controls.UnitTests |
|
|
|
@ -50,7 +52,7 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
Assert.Single(target.GetLogicalChildren()); |
|
|
|
|
|
|
|
var child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Foo", ((TextBlock)child).Text); |
|
|
|
} |
|
|
|
@ -93,6 +95,173 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
Assert.Equal(2, target.ItemContainerGenerator.Containers.Count()); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes() |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string> |
|
|
|
{ |
|
|
|
"Foo", |
|
|
|
"Bar", |
|
|
|
"FooBar" |
|
|
|
}; |
|
|
|
|
|
|
|
var target = new Carousel |
|
|
|
{ |
|
|
|
Template = new FuncControlTemplate<Carousel>(CreateTemplate), |
|
|
|
Items = items, |
|
|
|
IsVirtualized = false |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Presenter.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Single(target.GetLogicalChildren()); |
|
|
|
|
|
|
|
var child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Foo", ((TextBlock)child).Text); |
|
|
|
|
|
|
|
var newItems = items.ToList(); |
|
|
|
newItems.RemoveAt(0); |
|
|
|
|
|
|
|
target.Items = newItems; |
|
|
|
|
|
|
|
child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Bar", ((TextBlock)child).Text); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes_And_Virtualized() |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string> |
|
|
|
{ |
|
|
|
"Foo", |
|
|
|
"Bar", |
|
|
|
"FooBar" |
|
|
|
}; |
|
|
|
|
|
|
|
var target = new Carousel |
|
|
|
{ |
|
|
|
Template = new FuncControlTemplate<Carousel>(CreateTemplate), |
|
|
|
Items = items |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Presenter.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Single(target.GetLogicalChildren()); |
|
|
|
|
|
|
|
var child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Foo", ((TextBlock)child).Text); |
|
|
|
|
|
|
|
var newItems = items.ToList(); |
|
|
|
newItems.RemoveAt(0); |
|
|
|
|
|
|
|
target.Items = newItems; |
|
|
|
|
|
|
|
child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Bar", ((TextBlock)child).Text); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Selected_Index_Is_Maintained_Carousel_Created_With_Non_Zero_SelectedIndex() |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string> |
|
|
|
{ |
|
|
|
"Foo", |
|
|
|
"Bar", |
|
|
|
"FooBar" |
|
|
|
}; |
|
|
|
|
|
|
|
var target = new Carousel |
|
|
|
{ |
|
|
|
Template = new FuncControlTemplate<Carousel>(CreateTemplate), |
|
|
|
Items = items, |
|
|
|
IsVirtualized = false, |
|
|
|
SelectedIndex = 2 |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Presenter.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Equal("FooBar", target.SelectedItem); |
|
|
|
|
|
|
|
var child = target.GetVisualDescendants().LastOrDefault(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("FooBar", ((TextBlock)child).Text); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Selected_Item_Changes_To_Next_First_Item_When_Item_Removed_From_Beggining_Of_List() |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string> |
|
|
|
{ |
|
|
|
"Foo", |
|
|
|
"Bar", |
|
|
|
"FooBar" |
|
|
|
}; |
|
|
|
|
|
|
|
var target = new Carousel |
|
|
|
{ |
|
|
|
Template = new FuncControlTemplate<Carousel>(CreateTemplate), |
|
|
|
Items = items, |
|
|
|
IsVirtualized = false |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Presenter.ApplyTemplate(); |
|
|
|
|
|
|
|
Assert.Single(target.GetLogicalChildren()); |
|
|
|
|
|
|
|
var child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Foo", ((TextBlock)child).Text); |
|
|
|
|
|
|
|
items.RemoveAt(0); |
|
|
|
|
|
|
|
child = target.GetLogicalChildren().Single(); |
|
|
|
|
|
|
|
Assert.IsType<TextBlock>(child); |
|
|
|
Assert.Equal("Bar", ((TextBlock)child).Text); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Selected_Item_Changes_To_NextAvailable_Item_If_SelectedItem_Is_Removed_From_Middle() |
|
|
|
{ |
|
|
|
var items = new ObservableCollection<string> |
|
|
|
{ |
|
|
|
"Foo", |
|
|
|
"Bar", |
|
|
|
"FooBar" |
|
|
|
}; |
|
|
|
|
|
|
|
var target = new Carousel |
|
|
|
{ |
|
|
|
Template = new FuncControlTemplate<Carousel>(CreateTemplate), |
|
|
|
Items = items, |
|
|
|
IsVirtualized = false |
|
|
|
}; |
|
|
|
|
|
|
|
target.ApplyTemplate(); |
|
|
|
target.Presenter.ApplyTemplate(); |
|
|
|
|
|
|
|
target.SelectedIndex = 1; |
|
|
|
|
|
|
|
items.RemoveAt(1); |
|
|
|
|
|
|
|
Assert.Equal(1, target.SelectedIndex); |
|
|
|
Assert.Equal("FooBar", target.SelectedItem); |
|
|
|
} |
|
|
|
|
|
|
|
private Control CreateTemplate(Carousel control) |
|
|
|
{ |
|
|
|
return new CarouselPresenter |
|
|
|
|