using System.Globalization; using System.Windows; using System.Windows.Media; using SpdUp.Converters; namespace SpdUp.Tests; /// /// Tests for WPF value converters. /// public class ConverterTests { private static readonly CultureInfo Culture = CultureInfo.InvariantCulture; // ── BoolToVisibilityConverter ───────────────────────────── [Fact] public void BoolToVisibility_True_ReturnsVisible() { var conv = new BoolToVisibilityConverter(); var result = conv.Convert(true, typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Visible, result); } [Fact] public void BoolToVisibility_False_ReturnsCollapsed() { var conv = new BoolToVisibilityConverter(); var result = conv.Convert(false, typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Collapsed, result); } [Fact] public void BoolToVisibility_ConvertBack_Visible_ReturnsTrue() { var conv = new BoolToVisibilityConverter(); var result = conv.ConvertBack(Visibility.Visible, typeof(bool), null!, Culture); Assert.Equal(true, result); } [Fact] public void BoolToVisibility_ConvertBack_Collapsed_ReturnsFalse() { var conv = new BoolToVisibilityConverter(); var result = conv.ConvertBack(Visibility.Collapsed, typeof(bool), null!, Culture); Assert.Equal(false, result); } // ── InverseBoolToVisibilityConverter ────────────────────── [Fact] public void InverseBoolToVisibility_True_ReturnsCollapsed() { var conv = new InverseBoolToVisibilityConverter(); var result = conv.Convert(true, typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Collapsed, result); } [Fact] public void InverseBoolToVisibility_False_ReturnsVisible() { var conv = new InverseBoolToVisibilityConverter(); var result = conv.Convert(false, typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Visible, result); } // ── PercentToColorConverter ────────────────────────────── [Theory] [InlineData(95f, 255, 69, 58)] // red for > 90 [InlineData(91f, 255, 69, 58)] // red at boundary [InlineData(80f, 255, 159, 10)] // orange for > 70 [InlineData(71f, 255, 159, 10)] // orange at boundary [InlineData(50f, 48, 209, 88)] // green for <= 70 [InlineData(0f, 48, 209, 88)] // green at zero public void PercentToColor_ReturnsCorrectColor(float pct, byte r, byte g, byte b) { var conv = new PercentToColorConverter(); var result = conv.Convert(pct, typeof(Brush), null!, Culture) as SolidColorBrush; Assert.NotNull(result); Assert.Equal(r, result.Color.R); Assert.Equal(g, result.Color.G); Assert.Equal(b, result.Color.B); } [Fact] public void PercentToColor_ConvertBack_Throws() { var conv = new PercentToColorConverter(); Assert.Throws(() => conv.ConvertBack(null!, typeof(float), null!, Culture)); } // ── NullToVisibilityConverter ──────────────────────────── [Fact] public void NullToVisibility_Null_ReturnsCollapsed() { var conv = new NullToVisibilityConverter(); var result = conv.Convert(null!, typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Collapsed, result); } [Fact] public void NullToVisibility_NotNull_ReturnsVisible() { var conv = new NullToVisibilityConverter(); var result = conv.Convert("something", typeof(Visibility), null!, Culture); Assert.Equal(Visibility.Visible, result); } // ── FloatFormatConverter ───────────────────────────────── [Fact] public void FloatFormat_DefaultFormat_OneDecimal() { var conv = new FloatFormatConverter(); var result = (string)conv.Convert(42.567f, typeof(string), null!, CultureInfo.InvariantCulture); // Converter uses current culture internally, so parse back to float Assert.True(float.TryParse(result, System.Globalization.NumberStyles.Float, CultureInfo.CurrentCulture, out var parsed)); Assert.Equal(42.6f, parsed, 0.05f); } [Fact] public void FloatFormat_CustomFormat() { var conv = new FloatFormatConverter(); var result = (string)conv.Convert(42.567f, typeof(string), "F2", CultureInfo.InvariantCulture); Assert.True(float.TryParse(result, System.Globalization.NumberStyles.Float, CultureInfo.CurrentCulture, out var parsed)); Assert.Equal(42.57f, parsed, 0.005f); } // ── BoostButtonTextConverter ───────────────────────────── [Fact] public void BoostButtonText_True_ReturnsStopText() { var conv = new BoostButtonTextConverter(); var result = conv.Convert(true, typeof(string), null!, Culture); Assert.Contains("STOP", result as string ?? ""); } [Fact] public void BoostButtonText_False_ReturnsBoostText() { var conv = new BoostButtonTextConverter(); var result = conv.Convert(false, typeof(string), null!, Culture); Assert.Contains("BOOST", result as string ?? ""); } // ── BoostButtonColorConverter ──────────────────────────── [Fact] public void BoostButtonColor_True_ReturnsRed() { var conv = new BoostButtonColorConverter(); var result = conv.Convert(true, typeof(Brush), null!, Culture) as SolidColorBrush; Assert.NotNull(result); Assert.Equal(255, result.Color.R); Assert.Equal(69, result.Color.G); } [Fact] public void BoostButtonColor_False_ReturnsGreen() { var conv = new BoostButtonColorConverter(); var result = conv.Convert(false, typeof(Brush), null!, Culture) as SolidColorBrush; Assert.NotNull(result); Assert.Equal(48, result.Color.R); Assert.Equal(209, result.Color.G); } }