# Xamltest UI Tests

> 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.

- Skill: `materialdesigninxaml/xamltest-ui-tests` (Agent Skill)
- Install (CLI): `npx skillmds@latest add materialdesigninxaml/xamltest-ui-tests`
- Raw SKILL.md: https://api.skillmd.com/api/skills/materialdesigninxaml/xamltest-ui-tests/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: materialdesigninxaml (https://skillmd.com/u/materialdesigninxaml)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/materialdesigninxaml/xamltest-ui-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

1. Put runtime UI behavior tests in `tests/MaterialDesignThemes.UITests`.
2. Do **not** add visual-tree or layout interaction tests to `tests/MaterialDesignThemes.Wpf.Tests`.
3. Prefer extending the existing feature file under `tests/MaterialDesignThemes.UITests/WPF/<feature>/` instead of creating a generic catch-all test file.
4. Match the existing file's result-recording pattern; many current UI tests use `TestRecorder`, but it should not be treated as a blanket requirement.
5. Ask permission before running UI tests, and only run the affected ones.

## Standard pattern

1. Inherit from `TestBase`.
2. Use `LoadXaml<T>()` for focused control scenarios.
3. Use `LoadUserControl<T>()` when you need a sample view model, bindings, or additional focus targets.
4. Get named parts with `GetElement<T>("PART_Name")`.
5. Use `RemoteExecute` with static methods for properties that helpers do not expose directly.
6. 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

```csharp
[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/`

