| name | xamltest-ui-tests |
| description | Write and update WPF UI tests in MaterialDesignThemes.UITests using XAMLTest. Use when template, layout, focus, interaction, or visual behavior needs coverage, or when a reviewer asks to move runtime UI checks out of MaterialDesignThemes.Wpf.Tests. |
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_TextBox or PART_IncreaseButton.
- A reviewer asks to use XAMLTest instead of regular unit tests.
- You need to assert WPF-only properties like
Padding, Visibility, ActualWidth, or DataContext state 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
RemoteExecute with 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.
RemoteExecute for Padding, Visibility, ActualWidth, Margin, or DataContext inspection.
- Keyboard and mouse helpers such as
MoveKeyboardFocus, SendKeyboardInput, and LeftClick for interaction.
What to avoid
- Inspecting the visual tree from
MaterialDesignThemes.Wpf.Tests for 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.cs
tests/MaterialDesignThemes.UITests/XamlTestExtensions.cs
- Existing feature tests under
tests/MaterialDesignThemes.UITests/WPF/