|
|
|
@ -1,6 +1,7 @@ |
|
|
|
using System; |
|
|
|
using System.Linq; |
|
|
|
using System.Reactive.Subjects; |
|
|
|
using Avalonia.Controls.Primitives; |
|
|
|
using Avalonia.Controls.Shapes; |
|
|
|
using Avalonia.Controls.Templates; |
|
|
|
using Avalonia.Data; |
|
|
|
@ -244,6 +245,40 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
Assert.True(handled); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData("PART_DaySelector")] |
|
|
|
[InlineData("PART_MonthSelector")] |
|
|
|
[InlineData("PART_YearSelector")] |
|
|
|
public void Selector_ScrollUp_Should_Work(string selectorName) |
|
|
|
=> TestSelectorScrolling(selectorName, panel => panel.ScrollUp()); |
|
|
|
|
|
|
|
[Theory] |
|
|
|
[InlineData("PART_DaySelector")] |
|
|
|
[InlineData("PART_MonthSelector")] |
|
|
|
[InlineData("PART_YearSelector")] |
|
|
|
public void Selector_ScrollDown_Should_Work(string selectorName) |
|
|
|
=> TestSelectorScrolling(selectorName, panel => panel.ScrollDown()); |
|
|
|
|
|
|
|
private static void TestSelectorScrolling(string selectorName, Action<DateTimePickerPanel> scroll) |
|
|
|
{ |
|
|
|
using var app = UnitTestApplication.Start(Services); |
|
|
|
|
|
|
|
var presenter = new DatePickerPresenter { Template = CreatePickerTemplate() }; |
|
|
|
presenter.ApplyTemplate(); |
|
|
|
presenter.Measure(new Size(1000, 1000)); |
|
|
|
|
|
|
|
var panel = presenter |
|
|
|
.GetVisualDescendants() |
|
|
|
.OfType<DateTimePickerPanel>() |
|
|
|
.FirstOrDefault(panel => panel.Name == selectorName); |
|
|
|
|
|
|
|
Assert.NotNull(panel); |
|
|
|
|
|
|
|
var previousOffset = panel.Offset; |
|
|
|
scroll(panel); |
|
|
|
Assert.NotEqual(previousOffset, panel.Offset); |
|
|
|
} |
|
|
|
|
|
|
|
private static TestServices Services => TestServices.MockThreadingInterface.With( |
|
|
|
fontManagerImpl: new HeadlessFontManagerStub(), |
|
|
|
standardCursorFactory: Mock.Of<ICursorFactory>(), |
|
|
|
@ -298,5 +333,74 @@ namespace Avalonia.Controls.UnitTests |
|
|
|
return layoutRoot; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private static IControlTemplate CreatePickerTemplate() |
|
|
|
{ |
|
|
|
return new FuncControlTemplate((_, scope) => |
|
|
|
{ |
|
|
|
var dayHost = new Panel |
|
|
|
{ |
|
|
|
Name = "PART_DayHost" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var daySelector = new DateTimePickerPanel |
|
|
|
{ |
|
|
|
Name = "PART_DaySelector", |
|
|
|
PanelType = DateTimePickerPanelType.Day, |
|
|
|
ShouldLoop = true |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var monthHost = new Panel |
|
|
|
{ |
|
|
|
Name = "PART_MonthHost" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var monthSelector = new DateTimePickerPanel |
|
|
|
{ |
|
|
|
Name = "PART_MonthSelector", |
|
|
|
PanelType = DateTimePickerPanelType.Month, |
|
|
|
ShouldLoop = true |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var yearHost = new Panel |
|
|
|
{ |
|
|
|
Name = "PART_YearHost" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var yearSelector = new DateTimePickerPanel |
|
|
|
{ |
|
|
|
Name = "PART_YearSelector", |
|
|
|
PanelType = DateTimePickerPanelType.Year, |
|
|
|
ShouldLoop = true |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var acceptButton = new Button |
|
|
|
{ |
|
|
|
Name = "PART_AcceptButton" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var pickerContainer = new Grid |
|
|
|
{ |
|
|
|
Name = "PART_PickerContainer" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var firstSpacer = new Rectangle |
|
|
|
{ |
|
|
|
Name = "PART_FirstSpacer" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var secondSpacer = new Rectangle |
|
|
|
{ |
|
|
|
Name = "PART_SecondSpacer" |
|
|
|
}.RegisterInNameScope(scope); |
|
|
|
|
|
|
|
var contentPanel = new Panel(); |
|
|
|
contentPanel.Children.AddRange([ |
|
|
|
dayHost, daySelector, monthHost, monthSelector, yearHost, yearSelector, |
|
|
|
acceptButton, pickerContainer, firstSpacer, secondSpacer |
|
|
|
]); |
|
|
|
return contentPanel; |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|