XAMLTest UI tests
Use this skill when working on runtime WPF behavior in this repository.
When to use it
- A change touches templates, visual states, focus behavior, layout, coordinates, or input handling.
- You need to inspect named template parts such as
PART_TextBoxorPART_IncreaseButton. - A reviewer asks to use XAMLTest instead of regular unit tests.
- You need to assert WPF-only properties like
Padding,Visibility,ActualWidth, orDataContextstate after layout.
Repository-specific rules
- Put runtime UI behavior tests in
tests/MaterialDesignThemes.UITests. - Do not add visual-tree or layout interaction tests to
tests/MaterialDesignThemes.Wpf.Tests. - Prefer extending the existing feature file under
tests/MaterialDesignThemes.UITests/WPF/<feature>/instead of creating a generic catch-all test file. - Match the existing file's result-recording pattern; many current UI tests use
TestRecorder, but it should not be treated as a blanket requirement. - Ask permission before running UI tests, and only run the affected ones.
Standard pattern
- Inherit from
TestBase. - Use
LoadXaml<T>()for focused control scenarios. - Use
LoadUserControl<T>()when you need a sample view model, bindings, or additional focus targets. - Get named parts with
GetElement<T>("PART_Name"). - Use
RemoteExecutewith static methods for properties that helpers do not expose directly. - Use
Wait.For(...)for layout-sensitive assertions.
What to prefer
GetCoordinates()for alignment and spacing assertions.RemoteExecuteforPadding,Visibility,ActualWidth,Margin, orDataContextinspection.- Keyboard and mouse helpers such as
MoveKeyboardFocus,SendKeyboardInput, andLeftClickfor interaction.
What to avoid
- Inspecting the visual tree from
MaterialDesignThemes.Wpf.Testsfor runtime template behavior. - Overly broad UI suites when a single targeted XAMLTest scenario will do.
- Repeating helper code inline when a small static local or private helper method is enough.
Example
[Test]
public async Task DecimalUpDown_WithMaximum_DisablesPlusButton()
{
await using var recorder = new TestRecorder(App);
var decimalUpDown = await LoadXaml<DecimalUpDown>("""
<materialDesign:DecimalUpDown Value="1" Maximum="2" />
""");
var plusButton = await decimalUpDown.GetElement<RepeatButton>("PART_IncreaseButton");
var textBox = await decimalUpDown.GetElement<TextBox>("PART_TextBox");
await plusButton.LeftClick();
await Wait.For(async () =>
{
await Assert.That(await textBox.GetText()).IsEqualTo("2");
await Assert.That(await decimalUpDown.GetValue()).IsEqualTo(2);
});
await Assert.That(await plusButton.GetIsEnabled()).IsFalse();
recorder.Success();
}
Useful local references
tests/MaterialDesignThemes.UITests/TestBase.cstests/MaterialDesignThemes.UITests/XamlTestExtensions.cs- Existing feature tests under
tests/MaterialDesignThemes.UITests/WPF/