// -----------------------------------------------------------------------
//
// Copyright 2013 MIT Licence. See licence.md for more information.
//
// -----------------------------------------------------------------------
namespace Perspex.Controls.UnitTests
{
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 Splat;
using Xunit;
public class TemplatedControlTests
{
[Fact]
public void Template_Doesnt_Get_Executed_On_Set()
{
bool executed = false;
var template = new ControlTemplate(_ =>
{
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 ControlTemplate(_ =>
{
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 ControlTemplate(_ =>
{
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 ControlTemplate(_ =>
{
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 ControlTemplate(_ =>
{
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 ControlTemplate(_ =>
{
return new StackPanel
{
Children = new Controls
{
new TextBlock
{
}
}
};
}),
};
target.ApplyTemplate();
var child = target.GetVisualChildren().Single();
Assert.IsType(child);
child = child.VisualChildren.Single();
Assert.IsType(child);
}
[Fact]
public void Templated_Children_Should_Be_Styled()
{
using (Locator.Current.WithResolver())
{
var styler = new Mock();
Locator.CurrentMutable.Register(() => styler.Object, typeof(IStyler));
TestTemplatedControl target;
var root = new TestRoot
{
Child = target = new TestTemplatedControl
{
Template = new ControlTemplate(_ =>
{
return new StackPanel
{
Children = new Controls
{
new TextBlock
{
}
}
};
}),
}
};
target.ApplyTemplate();
styler.Verify(x => x.ApplyStyles(It.IsAny()), Times.Once());
styler.Verify(x => x.ApplyStyles(It.IsAny()), Times.Once());
styler.Verify(x => x.ApplyStyles(It.IsAny()), Times.Once());
}
}
[Fact]
public void Templated_Children_Should_Have_TemplatedParent_Set()
{
var target = new TestTemplatedControl
{
Template = new ControlTemplate(_ =>
{
return new StackPanel
{
Children = new Controls
{
new TextBlock
{
}
}
};
}),
};
target.ApplyTemplate();
var panel = target.GetTemplateChildren().OfType().Single();
var textBlock = target.GetTemplateChildren().OfType().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 ControlTemplate(_ =>
{
return new ContentPresenter
{
Content = new TextBlock
{
}
};
}),
};
target.ApplyTemplate();
var presenter = target.GetTemplateChildren().OfType().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 ControlTemplate(_ =>
{
return new ContentControl
{
Template = new ControlTemplate(parent =>
{
return new Border
{
Child = new ContentPresenter
{
[~ContentPresenter.ContentProperty] = parent.GetObservable(ContentControl.ContentProperty),
}
};
}),
Content = new TextBlock
{
}
};
}),
};
target.ApplyTemplate();
var contentControl = target.GetTemplateChildren().OfType().Single();
var border = contentControl.GetTemplateChildren().OfType().Single();
var presenter = contentControl.GetTemplateChildren().OfType().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);
}
}
}