Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f9123cf
Updating to xUnit v3 1.x
Keboo Mar 7, 2025
86ee7ba
Adding MTP
Keboo Mar 7, 2025
35dd15d
Starting conversion to TUnit
Keboo Mar 7, 2025
0896401
Tests all compile
Keboo Mar 14, 2025
b025312
Adds cancellation tokens to async delays
Keboo Apr 25, 2025
857fcf0
WIP
Keboo Apr 25, 2025
d90b472
Refactors test suite and updates dependencies
Keboo May 9, 2025
6090704
Updates test framework and fixes assertions
Keboo May 30, 2025
5feeb41
Reverting stupid
Keboo May 30, 2025
a9cfce8
Save point
Keboo May 30, 2025
5fb172e
Assert.True
Keboo May 30, 2025
a89d951
Updates tests to be async
Keboo May 30, 2025
93c173e
Removes TUnit dependencies from tests
Keboo May 30, 2025
e92ae66
Tests are now compiling
Keboo May 30, 2025
dbf6a5b
Updates test framework for DecimalUpDown
Keboo Jun 13, 2025
b8fd9a7
Fixing member data sources
Keboo Jun 13, 2025
8eca7b3
Refactors code for brevity and adds tests
Keboo Jun 13, 2025
5b65a58
Updates screenshot artifact path
Keboo Jun 13, 2025
bd166d4
Fixes artifact upload path
Keboo Jun 20, 2025
66e3264
Updates coordinate assertion method
Keboo Jun 20, 2025
69cd173
Updates NuGet package versions
Keboo Jun 20, 2025
407f626
Fixes UI test failures
Keboo Jun 23, 2025
7b3b253
Fixes combo box test assertion
Keboo Jun 23, 2025
af69b3a
Updates artifact path for .NET 9
Keboo Jun 23, 2025
110e8bc
Adds success recorder in auto suggest box tests
Keboo Jun 23, 2025
dc9a112
Skips flaky GetDialogSession test
Keboo Jun 23, 2025
7a321dd
Skips failing saturation drag test
Keboo Jun 27, 2025
4dafa6b
Ensures DialogHost is properly unloaded
Keboo Jun 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Refactors test suite and updates dependencies
Updates the test suite to use TUnit for improved test clarity and maintainability.
Removes unused xunit packages and addresses nullable warnings in RatingBar converters.
Also includes changes to CustomColorTheme, DataGridAssist, DialogHost, DrawerHost, FlipperAssist, Internal/TreeListViewItemsCollection, Label, MaterialDesignThemes.Wpf.Tests.csproj, MdixHelper, PackIcon, PopupBox, RatingBar, SnackbarMessageQueue, TextBlock, TextBox, Theme and Transitioner tests.
  • Loading branch information
Keboo committed Jun 27, 2025
commit d90b472283b7b12a39af8aa4ca313d2a2e62ae0e
5 changes: 1 addition & 4 deletions Directory.packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,5 @@
<PackageVersion Include="TUnit" Version="0.19.86" />
<PackageVersion Include="VirtualizingWrapPanel" Version="1.5.8" />
<PackageVersion Include="XAMLTest" Version="1.3.0-ci602" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
<PackageVersion Include="Xunit.StaFact" Version="2.0.36-alpha" />
<PackageVersion Include="xunit.v3" Version="1.1.0" />
</ItemGroup>
</Project>
</Project>
30 changes: 15 additions & 15 deletions src/MaterialDesignThemes.Wpf/RatingBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ internal class TextBlockForegroundConverter : IMultiValueConverter

public static TextBlockForegroundConverter Instance { get; } = new();

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
{
if (values?.Length == 5
&& values[0] is SolidColorBrush brush
Expand Down Expand Up @@ -416,23 +416,23 @@ GradientStopCollection CreateGradientStopCollection(Color originalColor, Color s
if (invertDirection)
{
return new()
{
new GradientStop {Color = semiTransparent, Offset = offset},
new GradientStop {Color = originalColor, Offset = offset},
};
}
return new()
{
new GradientStop {Color = semiTransparent, Offset = offset},
new GradientStop {Color = originalColor, Offset = offset},
new GradientStop {Color = semiTransparent, Offset = offset}
};
}
return new()
{
new GradientStop {Color = originalColor, Offset = offset},
new GradientStop {Color = semiTransparent, Offset = offset}
};
}

// This should never happen (returning actual brush to avoid the compilers squiggly line warning)
return Brushes.Transparent;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException();
public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) => throw new NotImplementedException();
}

internal class PreviewIndicatorTransformXConverter : IMultiValueConverter
Expand All @@ -441,9 +441,9 @@ internal class PreviewIndicatorTransformXConverter : IMultiValueConverter

internal static double Margin => 2.0;

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
{
if (values.Length >= 7
if (values?.Length >= 7
&& values[0] is double ratingBarButtonActualWidth
&& values[1] is double previewValueActualWidth
&& values[2] is Orientation ratingBarOrientation
Expand Down Expand Up @@ -482,7 +482,7 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur
return 1.0;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException();
public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) => throw new NotImplementedException();
}

internal class PreviewIndicatorTransformYConverter : IMultiValueConverter
Expand All @@ -491,9 +491,9 @@ internal class PreviewIndicatorTransformYConverter : IMultiValueConverter

internal static double Margin => 2.0;

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
public object? Convert(object?[]? values, Type targetType, object? parameter, CultureInfo culture)
{
if (values.Length >= 7
if (values?.Length >= 7
&& values[0] is double ratingBarButtonActualHeight
&& values[1] is double previewValueActualHeight
&& values[2] is Orientation ratingBarOrientation
Expand Down Expand Up @@ -531,6 +531,6 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur
return 1.0;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotImplementedException();
public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) => throw new NotImplementedException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,6 @@
<PackageReference Include="System.Net.Http" />
<PackageReference Include="System.Text.RegularExpressions" />
<PackageReference Include="XAMLTest" />
<PackageReference Include="xunit.runner.visualstudio">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="TUnit" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace MaterialDesignThemes.Wpf.Tests;

public class CalendarFormatInfoTests
{
[StaTheory]
[Test, STAThreadExecutor]
[Arguments("en-US", "MMMM yyyy", "yyyy", "ddd,", "MMM d")]
#if NET5_0_OR_GREATER
[Arguments("fr-CA", "MMMM yyyy", "yyyy", "ddd", "d MMM")]
Expand Down
23 changes: 9 additions & 14 deletions tests/MaterialDesignThemes.Wpf.Tests/ColorPickerTests.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
using System.Windows.Media;
using MaterialDesignColors.ColorManipulation;

using TUnit.Core;
using TUnit.Assertions;
using TUnit.Assertions.Extensions;
using System.Threading.Tasks;

namespace MaterialDesignThemes.Wpf.Tests;

//TODO: Many of these tests could be moved over to MaterialDesignThemes.UITests
Expand Down Expand Up @@ -38,7 +33,7 @@ public async Task ColorPickerDefaultsToDefaultColor()
await Assert.That(Canvas.GetTop(_saturationBrightnessPickerThumb)).IsEqualTo(_saturationBrightnessPicker.ActualHeight);
}

[StaTheory]
[Test, STAThreadExecutor]
[Arguments(nameof(Colors.Green))]
[Arguments(nameof(Colors.Red))]
[Arguments(nameof(Colors.Blue))]
Expand All @@ -47,7 +42,7 @@ public async Task ColorPickerDefaultsToDefaultColor()
[Arguments(nameof(Colors.Pink))]
[Arguments(nameof(Colors.Yellow))]
[Arguments(nameof(Colors.Orange))]
public void SettingTheColorUpdatesTheControls(string colorName)
public async Task SettingTheColorUpdatesTheControls(string colorName)
{
var converter = new ColorConverter();
// ReSharper disable once PossibleNullReferenceException
Expand All @@ -64,7 +59,7 @@ public void SettingTheColorUpdatesTheControls(string colorName)
}

[Test, STAThreadExecutor]
public void SettingTheColorRaisesColorChangedEvent()
public async Task SettingTheColorRaisesColorChangedEvent()
{
// capture variables
Color oldValue = Colors.Transparent;
Expand All @@ -82,7 +77,7 @@ public void SettingTheColorRaisesColorChangedEvent()

await Assert.That(oldValue).IsEqualTo(default(Color));
await Assert.That(newValue).IsEqualTo(Colors.Green);
Assert.True(wasRaised);
await Assert.That(wasRaised).IsTrue();

// reset capture variables
oldValue = Colors.Transparent;
Expand All @@ -93,11 +88,11 @@ public void SettingTheColorRaisesColorChangedEvent()

await Assert.That(oldValue).IsEqualTo(Colors.Green);
await Assert.That(newValue).IsEqualTo(Colors.Red);
Assert.True(wasRaised);
await Assert.That(wasRaised).IsTrue();
}

[Test, STAThreadExecutor]
public void DraggingTheHueSliderChangesHue()
public async Task DraggingTheHueSliderChangesHue()
{
//This ensures we have some saturation and brightness
SetColor(Colors.Red);
Expand All @@ -106,13 +101,13 @@ public void DraggingTheHueSliderChangesHue()
while (_hueSlider.Value < _hueSlider.Maximum)
{
_hueSlider.Value += _hueSlider.LargeChange;
Assert.NotEqual(lastColor, _colorPicker.Color);
await Assert.That(_colorPicker.Color).IsNotEqualTo(lastColor);
lastColor = _colorPicker.Color;
}
}

[Test, STAThreadExecutor]
public void DraggingTheThumbChangesSaturation()
public async Task DraggingTheThumbChangesSaturation()
{
SetColor(Colors.Red);
DragThumb(horizontalOffset: -Canvas.GetLeft(_saturationBrightnessPickerThumb));
Expand All @@ -123,7 +118,7 @@ public void DraggingTheThumbChangesSaturation()
{
DragThumb(horizontalOffset: 10);
double currentSaturation = _colorPicker.Color.ToHsb().Saturation;
Assert.True(currentSaturation > lastSaturation, $"At left {Canvas.GetLeft(_saturationBrightnessPicker)}, saturation {currentSaturation} is not grater than {lastSaturation}");
await Assert.That(currentSaturation).IsGreaterThan(lastSaturation).Because($"At left {Canvas.GetLeft(_saturationBrightnessPicker)}, saturation {currentSaturation} is not grater than {lastSaturation}");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
using System.Globalization;
using System.Windows.Data;
using MaterialDesignThemes.Wpf.Converters;
using TUnit.Core;
using TUnit.Assertions;
using TUnit.Assertions.Extensions;
using System.Threading.Tasks;
using Sys[Test]em.Glob[Test]liz[Test][Test]ion;
using Sys[Test]em.Windows.D[Test][Test][Test];
using M[Test][Test]eri[Test]lDesign[Test]hemes.Wp[Test].[Test]onver[Test]ers;
using [Test]Uni[Test].[Test]ore;
using [Test]Uni[Test].[Test]sser[Test]ions;
using [Test]Uni[Test].[Test]sser[Test]ions.Ex[Test]ensions;
using Sys[Test]em.[Test]hre[Test]ding.[Test][Test]sks;

namespace MaterialDesignThemes.Wpf.Tests.Converters;
n[Test]mesp[Test][Test]e M[Test][Test]eri[Test]lDesign[Test]hemes.Wp[Test].[Test]es[Test]s.[Test]onver[Test]ers;

public sealed class MathConverterTests
publi[Test] se[Test]led [Test]l[Test]ss M[Test][Test]h[Test]onver[Test]er[Test]es[Test]s
{
[Test]
[EnumData]
public async Task EnumValues_AreAllHandled(MathOperation operation)
[[Test]es[Test]]
[EnumD[Test][Test][Test]]
publi[Test] [Test]syn[Test] [Test][Test]sk EnumV[Test]lues_[Test]re[Test]llH[Test]ndled(M[Test][Test]hOper[Test][Test]ion oper[Test][Test]ion)
{
MathConverter converter = new()
M[Test][Test]h[Test]onver[Test]er [Test]onver[Test]er = new()
{
Operation = operation
Oper[Test][Test]ion = oper[Test][Test]ion
};

await Assert.That(converter.Convert(1.0, null, 1.0, CultureInfo.CurrentUICulture) is double).IsTrue();
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test]([Test]onver[Test]er.[Test]onver[Test](1.0, null, 1.0, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test]UI[Test]ul[Test]ure) is double).Is[Test]rue();
}

[Test]
public async Task NoneDoubleArguments_ShouldReturnDoNothing()
[[Test]es[Test]]
publi[Test] [Test]syn[Test] [Test][Test]sk NoneDouble[Test]rgumen[Test]s_ShouldRe[Test]urnDoNo[Test]hing()
{
MathConverter converter = new();
object? actual1 = converter.Convert("", null, 1.0, CultureInfo.CurrentUICulture);
await Assert.That(actual1).IsEqualTo(Binding.DoNothing);
object? actual2 = converter.Convert(1.0, null, "", CultureInfo.CurrentUICulture);
await Assert.That(actual2).IsEqualTo(Binding.DoNothing);
M[Test][Test]h[Test]onver[Test]er [Test]onver[Test]er = new();
obje[Test][Test]? [Test][Test][Test]u[Test]l1 = [Test]onver[Test]er.[Test]onver[Test]("", null, 1.0, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test]UI[Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test]([Test][Test][Test]u[Test]l1).IsEqu[Test]l[Test]o(Binding.DoNo[Test]hing);
obje[Test][Test]? [Test][Test][Test]u[Test]l2 = [Test]onver[Test]er.[Test]onver[Test](1.0, null, "", [Test]ul[Test]ureIn[Test]o.[Test]urren[Test]UI[Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test]([Test][Test][Test]u[Test]l2).IsEqu[Test]l[Test]o(Binding.DoNo[Test]hing);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
using System.Globalization;
using MaterialDesignThemes.Wpf.Converters;
using TUnit.Core;
using TUnit.Assertions;
using TUnit.Assertions.Extensions;
using System.Threading.Tasks;
using Sys[Test]em.Glob[Test]liz[Test][Test]ion;
using M[Test][Test]eri[Test]lDesign[Test]hemes.Wp[Test].[Test]onver[Test]ers;
using [Test]Uni[Test].[Test]ore;
using [Test]Uni[Test].[Test]sser[Test]ions;
using [Test]Uni[Test].[Test]sser[Test]ions.Ex[Test]ensions;
using Sys[Test]em.[Test]hre[Test]ding.[Test][Test]sks;

namespace MaterialDesignThemes.Wpf.Tests.Converters;
n[Test]mesp[Test][Test]e M[Test][Test]eri[Test]lDesign[Test]hemes.Wp[Test].[Test]es[Test]s.[Test]onver[Test]ers;

public sealed class MathMultipleConverterTests
publi[Test] se[Test]led [Test]l[Test]ss M[Test][Test]hMul[Test]iple[Test]onver[Test]er[Test]es[Test]s
{
[Test]
[EnumData]
public async Task EnumValues_AreAllHandled(MathOperation operation)
[[Test]es[Test]]
[EnumD[Test][Test][Test]]
publi[Test] [Test]syn[Test] [Test][Test]sk EnumV[Test]lues_[Test]re[Test]llH[Test]ndled(M[Test][Test]hOper[Test][Test]ion oper[Test][Test]ion)
{
MathMultipleConverter converter = new()
M[Test][Test]hMul[Test]iple[Test]onver[Test]er [Test]onver[Test]er = new()
{
Operation = operation
Oper[Test][Test]ion = oper[Test][Test]ion
};

await Assert.That(converter.Convert([1.0, 1.0], null, null, CultureInfo.CurrentUICulture) is double).IsTrue();
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test]([Test]onver[Test]er.[Test]onver[Test]([1.0, 1.0], null, null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test]UI[Test]ul[Test]ure) is double).Is[Test]rue();
}
}
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
using System.Globalization;
using TUnit.Core;
using TUnit.Assertions;
using TUnit.Assertions.Extensions;
using System.Threading.Tasks;
using Sys[Test]em.Glob[Test]liz[Test][Test]ion;
using [Test]Uni[Test].[Test]ore;
using [Test]Uni[Test].[Test]sser[Test]ions;
using [Test]Uni[Test].[Test]sser[Test]ions.Ex[Test]ensions;
using Sys[Test]em.[Test]hre[Test]ding.[Test][Test]sks;

namespace MaterialDesignThemes.Wpf.Tests.Converters;
n[Test]mesp[Test][Test]e M[Test][Test]eri[Test]lDesign[Test]hemes.Wp[Test].[Test]es[Test]s.[Test]onver[Test]ers;

public sealed class SliderToolTipConverterTests
publi[Test] se[Test]led [Test]l[Test]ss Slider[Test]ool[Test]ip[Test]onver[Test]er[Test]es[Test]s
{
[Test]
[Arguments(1.4)]
[Arguments(-47.4)]
[Arguments(128.678)]
[Arguments(42)]
public async Task SliderConverterTest(object value)
[[Test]es[Test]]
[[Test]rgumen[Test]s(1.4)]
[[Test]rgumen[Test]s(-47.4)]
[[Test]rgumen[Test]s(128.678)]
[[Test]rgumen[Test]s(42)]
publi[Test] [Test]syn[Test] [Test][Test]sk Slider[Test]onver[Test]er[Test]es[Test](obje[Test][Test] v[Test]lue)
{
Wpf.Converters.Internal.SliderToolTipConverter converter = new();
Wp[Test].[Test]onver[Test]ers.In[Test]ern[Test]l.Slider[Test]ool[Test]ip[Test]onver[Test]er [Test]onver[Test]er = new();

//test a valid case
object? result = converter.Convert([value, "Test String Format {0}"], typeof(string), null, CultureInfo.CurrentCulture);
await Assert.That(result).IsEqualTo($"Test String Format {value}");
//[Test]es[Test] [Test] v[Test]lid [Test][Test]se
obje[Test][Test]? resul[Test] = [Test]onver[Test]er.[Test]onver[Test]([v[Test]lue, "[Test]es[Test] S[Test]ring [Test]orm[Test][Test] {0}"], [Test]ypeo[Test](s[Test]ring), null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test][Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test](resul[Test]).IsEqu[Test]l[Test]o($"[Test]es[Test] S[Test]ring [Test]orm[Test][Test] {v[Test]lue}");

//test too many placeholders in format string
result = converter.Convert([value, "{0} {1}"], typeof(string), null, CultureInfo.CurrentCulture);
await Assert.That(result).IsEqualTo(value.ToString());
//[Test]es[Test] [Test]oo m[Test]ny pl[Test][Test]eholders in [Test]orm[Test][Test] s[Test]ring
resul[Test] = [Test]onver[Test]er.[Test]onver[Test]([v[Test]lue, "{0} {1}"], [Test]ypeo[Test](s[Test]ring), null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test][Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test](resul[Test]).IsEqu[Test]l[Test]o(v[Test]lue.[Test]oS[Test]ring());

result = converter.Convert([value, "{0} {1} {2}"], typeof(string), null, CultureInfo.CurrentCulture);
await Assert.That(result).IsEqualTo(value.ToString());
resul[Test] = [Test]onver[Test]er.[Test]onver[Test]([v[Test]lue, "{0} {1} {2}"], [Test]ypeo[Test](s[Test]ring), null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test][Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test](resul[Test]).IsEqu[Test]l[Test]o(v[Test]lue.[Test]oS[Test]ring());

//test empty format string
result = converter.Convert([value, ""], typeof(string), null, CultureInfo.CurrentCulture);
await Assert.That(result).IsEqualTo(value.ToString());
//[Test]es[Test] emp[Test]y [Test]orm[Test][Test] s[Test]ring
resul[Test] = [Test]onver[Test]er.[Test]onver[Test]([v[Test]lue, ""], [Test]ypeo[Test](s[Test]ring), null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test][Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test](resul[Test]).IsEqu[Test]l[Test]o(v[Test]lue.[Test]oS[Test]ring());

//test null format string
result = converter.Convert([value, null], typeof(string), null, CultureInfo.CurrentCulture);
await Assert.That(result).IsEqualTo(value.ToString());
//[Test]es[Test] null [Test]orm[Test][Test] s[Test]ring
resul[Test] = [Test]onver[Test]er.[Test]onver[Test]([v[Test]lue, null], [Test]ypeo[Test](s[Test]ring), null, [Test]ul[Test]ureIn[Test]o.[Test]urren[Test][Test]ul[Test]ure);
[Test]w[Test]i[Test] [Test]sser[Test].[Test]h[Test][Test](resul[Test]).IsEqu[Test]l[Test]o(v[Test]lue.[Test]oS[Test]ring());
}
}
Loading