Extends Verify to allow verification of Xaml UIs.
See Milestones for release notes.
[ModuleInitializer]
public static void Init() =>
VerifyXaml.Initialize();
A visual element (Window/Page/Control etc) can then be verified as follows:
[Test]
public async Task WindowUsage()
{
var window = new MyWindow();
await Verify(window);
}
With the state of the element being rendered as a verified files:
TheTests.WindowUsage.verified.xml:
<MyWindow
Title="MyWindow"
Width="525"
Height="350"
xmlns="clr-namespace:Tests;assembly=Tests"
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<av:DockPanel
Name="MyPanel">
<av:Menu
Height="26"
av:DockPanel.Dock="Top">
<av:MenuItem
Header="File">
<av:MenuItem
Header="Exit" />
</av:MenuItem>
<av:MenuItem
Header="View">
<av:MenuItem
IsCheckable="True"
IsChecked="True"
Header="Standard"
Name="StandardMenu" />
</av:MenuItem>
<av:MenuItem
Header="Help">
<av:MenuItem
Header="About" />
</av:MenuItem>
</av:Menu>
<av:Grid
ShowGridLines="False"
Name="MyGrid">
<av:Grid.ColumnDefinitions>
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
</av:Grid.ColumnDefinitions>
<av:Grid.RowDefinitions>
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
</av:Grid.RowDefinitions>
<av:Button
Name="B7"
av:Grid.Column="4"
av:Grid.Row="2">7</av:Button>
<av:Button
Name="B8"
av:Grid.Column="5"
av:Grid.Row="2">8</av:Button>
<av:Button
Name="B9"
av:Grid.Column="6"
av:Grid.Row="2">9</av:Button>
<av:Button
Name="B4"
av:Grid.Column="4"
av:Grid.Row="3">4</av:Button>
<av:Button
Name="B5"
av:Grid.Column="5"
av:Grid.Row="3">5</av:Button>
<av:Button
Name="B6"
av:Grid.Column="6"
av:Grid.Row="3">6</av:Button>
<av:Button
Name="B1"
av:Grid.Column="4"
av:Grid.Row="4">1</av:Button>
<av:Button
Name="B2"
av:Grid.Column="5"
av:Grid.Row="4">2</av:Button>
<av:Button
Name="B3"
av:Grid.Column="6"
av:Grid.Row="4">3</av:Button>
<av:Button
Name="B0"
av:Grid.Column="4"
av:Grid.Row="5">0</av:Button>
<av:Button
Name="BPeriod"
av:Grid.Column="5"
av:Grid.Row="5">.</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPM"
av:Grid.Column="6"
av:Grid.Row="5">+/-</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BDevide"
av:Grid.Column="7"
av:Grid.Row="2">/</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMultiply"
av:Grid.Column="7"
av:Grid.Row="3">*</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMinus"
av:Grid.Column="7"
av:Grid.Row="4">-</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPlus"
av:Grid.Column="7"
av:Grid.Row="5">+</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BSqrt"
ToolTip="Usage: 'A Sqrt'"
av:Grid.Column="8"
av:Grid.Row="2">Sqrt</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPercent"
ToolTip="Usage: 'A % B ='"
av:Grid.Column="8"
av:Grid.Row="3">%</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BOneOver"
ToolTip="Usage: 'A 1/X'"
av:Grid.Column="8"
av:Grid.Row="4">1/X</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BEqual"
av:Grid.Column="8"
av:Grid.Row="5">=</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BC"
ToolTip="Clear All"
av:Grid.Column="8"
av:Grid.Row="1">C</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BCE"
ToolTip="Clear Current Entry"
av:Grid.Column="7"
av:Grid.Row="1">CE</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemClear"
ToolTip="Clear Memory"
av:Grid.Column="3"
av:Grid.Row="2">MC</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemRecall"
ToolTip="Recall Memory"
av:Grid.Column="3"
av:Grid.Row="3">MR</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemSave"
ToolTip="Store in Memory"
av:Grid.Column="3"
av:Grid.Row="4">MS</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemPlus"
ToolTip="Add To Memory"
av:Grid.Column="3"
av:Grid.Row="5">M+</av:Button>
<av:TextBlock
Text="Memory: [empty]"
Name="BMemBox"
Margin="10,17,10,17"
av:Grid.Column="3"
av:Grid.Row="1"
av:Grid.ColumnSpan="2" />
<av:TextBox
Name="DisplayBox"
Height="30"
Margin="5,5,5,5"
av:Grid.ColumnSpan="9"
xml:space="preserve"></av:TextBox>
<av:TextBox
Name="PaperBox"
Margin="5,5,5,5"
av:Grid.Row="1"
av:Grid.ColumnSpan="3"
av:Grid.RowSpan="5"
xml:space="preserve"></av:TextBox>
</av:Grid>
</av:DockPanel>
</MyWindow>
TheTests.WindowUsage.verified.png:
The rendering of XAML elements can very slightly between different OS versions. This can make verification on different machines (eg CI) problematic. There are several approaches to mitigate this:
Gem designed by Adnen Kadri from The Noun Project.