3 changed files with 107 additions and 311 deletions
@ -1,272 +0,0 @@ |
|||
// Copyright (c) The Perspex Project. All rights reserved.
|
|||
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|||
|
|||
using System.Linq; |
|||
using Moq; |
|||
using Perspex.Controls; |
|||
using Perspex.Controls.Presenters; |
|||
using Perspex.Controls.Primitives; |
|||
using Perspex.Controls.Templates; |
|||
using Perspex.Styling; |
|||
using Perspex.VisualTree; |
|||
using Xunit; |
|||
|
|||
namespace Perspex.Controls.UnitTests |
|||
{ |
|||
public class TemplatedControlTests |
|||
{ |
|||
[Fact] |
|||
public void Template_Doesnt_Get_Executed_On_Set() |
|||
{ |
|||
bool executed = false; |
|||
|
|||
var template = new FuncControlTemplate(_ => |
|||
{ |
|||
executed = true; |
|||
return new Control(); |
|||
}); |
|||
|
|||
var target = new TemplatedControl |
|||
{ |
|||
Template = template, |
|||
}; |
|||
|
|||
Assert.False(executed); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Template_Gets_Executed_On_Measure() |
|||
{ |
|||
bool executed = false; |
|||
|
|||
var template = new FuncControlTemplate(_ => |
|||
{ |
|||
executed = true; |
|||
return new Control(); |
|||
}); |
|||
|
|||
var target = new TemplatedControl |
|||
{ |
|||
Template = template, |
|||
}; |
|||
|
|||
target.Measure(new Size(100, 100)); |
|||
|
|||
Assert.True(executed); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Template_Result_Becomes_Visual_Child() |
|||
{ |
|||
Control templateResult = new Control(); |
|||
|
|||
var template = new FuncControlTemplate(_ => |
|||
{ |
|||
return templateResult; |
|||
}); |
|||
|
|||
var target = new TemplatedControl |
|||
{ |
|||
Template = template, |
|||
}; |
|||
|
|||
target.Measure(new Size(100, 100)); |
|||
var children = target.GetVisualChildren().ToList(); |
|||
|
|||
Assert.Equal(new[] { templateResult }, children); |
|||
} |
|||
|
|||
[Fact] |
|||
public void TemplatedParent_Is_Set_On_Generated_Template() |
|||
{ |
|||
Control templateResult = new Control(); |
|||
|
|||
var template = new FuncControlTemplate(_ => |
|||
{ |
|||
return templateResult; |
|||
}); |
|||
|
|||
var target = new TemplatedControl |
|||
{ |
|||
Template = template, |
|||
}; |
|||
|
|||
target.Measure(new Size(100, 100)); |
|||
|
|||
Assert.Equal(target, templateResult.TemplatedParent); |
|||
} |
|||
|
|||
[Fact] |
|||
public void OnTemplateApplied_Is_Called() |
|||
{ |
|||
var target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new Control(); |
|||
}) |
|||
}; |
|||
|
|||
target.Measure(new Size(100, 100)); |
|||
|
|||
Assert.True(target.OnTemplateAppliedCalled); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Template_Should_Be_Instantated() |
|||
{ |
|||
var target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new StackPanel |
|||
{ |
|||
Children = new Controls |
|||
{ |
|||
new TextBlock |
|||
{ |
|||
} |
|||
} |
|||
}; |
|||
}), |
|||
}; |
|||
|
|||
target.ApplyTemplate(); |
|||
|
|||
var child = target.GetVisualChildren().Single(); |
|||
Assert.IsType<StackPanel>(child); |
|||
child = child.VisualChildren.Single(); |
|||
Assert.IsType<TextBlock>(child); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Templated_Children_Should_Be_Styled() |
|||
{ |
|||
using (PerspexLocator.EnterScope()) |
|||
{ |
|||
var styler = new Mock<IStyler>(); |
|||
|
|||
PerspexLocator.CurrentMutable.Bind<IStyler>().ToConstant(styler.Object); |
|||
|
|||
TestTemplatedControl target; |
|||
|
|||
var root = new TestRoot |
|||
{ |
|||
Child = target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new StackPanel |
|||
{ |
|||
Children = new Controls |
|||
{ |
|||
new TextBlock |
|||
{ |
|||
} |
|||
} |
|||
}; |
|||
}), |
|||
} |
|||
}; |
|||
|
|||
target.ApplyTemplate(); |
|||
|
|||
styler.Verify(x => x.ApplyStyles(It.IsAny<TestTemplatedControl>()), Times.Once()); |
|||
styler.Verify(x => x.ApplyStyles(It.IsAny<StackPanel>()), Times.Once()); |
|||
styler.Verify(x => x.ApplyStyles(It.IsAny<TextBlock>()), Times.Once()); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Templated_Children_Should_Have_TemplatedParent_Set() |
|||
{ |
|||
var target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new StackPanel |
|||
{ |
|||
Children = new Controls |
|||
{ |
|||
new TextBlock |
|||
{ |
|||
} |
|||
} |
|||
}; |
|||
}), |
|||
}; |
|||
|
|||
target.ApplyTemplate(); |
|||
|
|||
var panel = target.GetTemplateChildren().OfType<StackPanel>().Single(); |
|||
var textBlock = target.GetTemplateChildren().OfType<TextBlock>().Single(); |
|||
|
|||
Assert.Equal(target, panel.TemplatedParent); |
|||
Assert.Equal(target, textBlock.TemplatedParent); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Presenter_Children_Should_Not_Have_TemplatedParent_Set() |
|||
{ |
|||
var target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new ContentPresenter |
|||
{ |
|||
Content = new TextBlock |
|||
{ |
|||
} |
|||
}; |
|||
}), |
|||
}; |
|||
|
|||
target.ApplyTemplate(); |
|||
|
|||
var presenter = target.GetTemplateChildren().OfType<ContentPresenter>().Single(); |
|||
var textBlock = (TextBlock)presenter.Child; |
|||
|
|||
Assert.Equal(target, presenter.TemplatedParent); |
|||
Assert.Null(textBlock.TemplatedParent); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Nested_Templated_Controls_Have_Correct_TemplatedParent() |
|||
{ |
|||
var target = new TestTemplatedControl |
|||
{ |
|||
Template = new FuncControlTemplate(_ => |
|||
{ |
|||
return new ContentControl |
|||
{ |
|||
Template = new FuncControlTemplate(parent => |
|||
{ |
|||
return new Border |
|||
{ |
|||
Child = new ContentPresenter |
|||
{ |
|||
[~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty), |
|||
} |
|||
}; |
|||
}), |
|||
Content = new TextBlock |
|||
{ |
|||
} |
|||
}; |
|||
}), |
|||
}; |
|||
|
|||
target.ApplyTemplate(); |
|||
|
|||
var contentControl = target.GetTemplateChildren().OfType<ContentControl>().Single(); |
|||
var border = contentControl.GetTemplateChildren().OfType<Border>().Single(); |
|||
var presenter = contentControl.GetTemplateChildren().OfType<ContentPresenter>().Single(); |
|||
var textBlock = (TextBlock)presenter.Content; |
|||
|
|||
Assert.Equal(target, contentControl.TemplatedParent); |
|||
Assert.Equal(contentControl, border.TemplatedParent); |
|||
Assert.Equal(contentControl, presenter.TemplatedParent); |
|||
Assert.Equal(target, textBlock.TemplatedParent); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue