From fc22a221ebc8bfa5a8a3ffdb3800bee845afaaf0 Mon Sep 17 00:00:00 2001 From: jchas2 Date: Fri, 14 Aug 2026 07:00:22 +1000 Subject: [PATCH] Theme tests --- src/taskmon/Actions/SortHelpAction.cs | 2 +- src/taskmon/Configuration/Theme.cs | 2 +- .../Configuration/AppConfigTests.cs | 6 +- .../ThemeColourPersistenceTests.cs | 73 ------- .../Configuration/ThemeTests.cs | 186 ++++++++++++++++++ 5 files changed, 191 insertions(+), 78 deletions(-) delete mode 100644 tests/Task.Monitor.Tests/Configuration/ThemeColourPersistenceTests.cs create mode 100644 tests/Task.Monitor.Tests/Configuration/ThemeTests.cs diff --git a/src/taskmon/Actions/SortHelpAction.cs b/src/taskmon/Actions/SortHelpAction.cs index 1aadde2..a04b5a2 100644 --- a/src/taskmon/Actions/SortHelpAction.cs +++ b/src/taskmon/Actions/SortHelpAction.cs @@ -10,7 +10,7 @@ public int Run() var columns = Enum.GetNames() .OrderBy(name => name, StringComparer.Ordinal); - foreach (string? column in columns) { + foreach (string column in columns) { OutputWriter.Out.WriteLine(column); } diff --git a/src/taskmon/Configuration/Theme.cs b/src/taskmon/Configuration/Theme.cs index 8485de9..16fb39c 100644 --- a/src/taskmon/Configuration/Theme.cs +++ b/src/taskmon/Configuration/Theme.cs @@ -16,7 +16,7 @@ public Theme() { } public void Update(ConfigSection configSection) => themeSection = configSection; - private static readonly string[] ColourKeys = + internal static readonly string[] ColourKeys = [ Constants.Keys.Background, Constants.Keys.BackgroundHighlight, diff --git a/tests/Task.Monitor.Tests/Configuration/AppConfigTests.cs b/tests/Task.Monitor.Tests/Configuration/AppConfigTests.cs index 22034be..af3c164 100644 --- a/tests/Task.Monitor.Tests/Configuration/AppConfigTests.cs +++ b/tests/Task.Monitor.Tests/Configuration/AppConfigTests.cs @@ -37,7 +37,7 @@ public void Constructor_With_FileSystem_And_Config_Initialises_Successfully() Assert.NotNull(appConfig.Themes); } - internal static string DefaultIniFile => @" + private static string DefaultIniFile => @" [filter] pid=-1 username= @@ -121,7 +121,7 @@ public void Should_Load_AndOr_Parse_DefaultIniFile(string iniFileData) Assert.Equal(ConsolePalette.Green, appConfig.DefaultTheme.RangeLowBackground); Assert.Equal(ConsolePalette.Black, appConfig.DefaultTheme.RangeLowForeground); Assert.Equal(ConsolePalette.Yellow, appConfig.DefaultTheme.RangeMidBackground); - Assert.Equal(ConsolePalette.Black, appConfig.DefaultTheme.RangeMidForeground); + Assert.Equal(ConsolePalette.Black, appConfig.DefaultTheme.RangeMidForeground); Assert.Equal(Processor.DefaultDelayInMilliseconds, appConfig.DelayInMilliseconds); Assert.Equal(-1, appConfig.FilterPid); @@ -204,7 +204,7 @@ public void Should_Load_And_Parse_CustomIniFile() Assert.Equal(ConsolePalette.DarkBlue, appConfig.DefaultTheme.Background); Assert.Equal(ConsolePalette.Cyan, appConfig.DefaultTheme.BackgroundHighlight); Assert.Equal(ConsolePalette.Gray, appConfig.DefaultTheme.ColumnCommandLowPriority); - Assert.Equal(ConsolePalette.Red, appConfig.DefaultTheme.ColumnCommandHighCpu); + Assert.Equal(ConsolePalette.Red, appConfig.DefaultTheme.ColumnCommandHighCpu); Assert.Equal(ConsolePalette.Red, appConfig.DefaultTheme.ColumnCommandIoBound); Assert.Equal(ConsolePalette.Yellow, appConfig.DefaultTheme.ColumnCommandNormalUserSpace); Assert.Equal(ConsolePalette.Yellow, appConfig.DefaultTheme.ColumnCommandScript); diff --git a/tests/Task.Monitor.Tests/Configuration/ThemeColourPersistenceTests.cs b/tests/Task.Monitor.Tests/Configuration/ThemeColourPersistenceTests.cs deleted file mode 100644 index 4113da5..0000000 --- a/tests/Task.Monitor.Tests/Configuration/ThemeColourPersistenceTests.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Text.RegularExpressions; -using Moq; -using Task.Monitor.Configuration; -using Task.Monitor.Internal.Abstractions; -using Task.Monitor.System.Configuration; - -namespace Task.Monitor.Tests.Configuration; - -public sealed class ThemeColourPersistenceTests -{ - // A persisted colour value must be hex (#RRGGBB / #AARRGGBB) or the transparent token. - private static readonly Regex HexOrTransparent = - new("^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent)$", RegexOptions.Compiled); - - // TODO: - private static readonly string[] PredefinedThemes = - [ - Constants.Sections.ThemeTaskmonDefault, - Constants.Sections.ThemeMsDos, - // Constants.Sections.ThemeMono, - // Constants.Sections.ThemeTokyoNight, - // Constants.Sections.ThemeMatrix, - // Constants.Sections.ThemeSolar, - ]; - - [Fact] - public void Normalize_Converts_Legacy_Names_To_Hex() - { - ConfigSection section = new("theme-test"); - section.Add(Constants.Keys.Background, "black"); - section.Add(Constants.Keys.Foreground, "White"); - section.Add(Constants.Keys.MenubarBackground, "DarkBlue"); - - new Theme(section).Normalize(); - - Assert.Equal("#000000", section.GetString(Constants.Keys.Background)); - Assert.Equal("#FFFFFF", section.GetString(Constants.Keys.Foreground)); - Assert.Equal("#000080", section.GetString(Constants.Keys.MenubarBackground)); - } - - [Fact] - public void Normalize_Preserves_Transparent_Token() - { - ConfigSection section = new("theme-test"); - section.Add(Constants.Keys.Background, "transparent"); - - new Theme(section).Normalize(); - - Assert.Equal("transparent", section.GetString(Constants.Keys.Background)); - } - - [Fact] - public void Normalize_Is_Idempotent_For_Hex_Values() - { - ConfigSection section = new("theme-test"); - section.Add(Constants.Keys.Background, "#123456"); - - new Theme(section).Normalize(); - - Assert.Equal("#123456", section.GetString(Constants.Keys.Background)); - } - - [Fact] - public void Normalize_Does_Not_Add_Missing_Keys() - { - ConfigSection section = new("theme-test"); - section.Add(Constants.Keys.Background, "black"); - - new Theme(section).Normalize(); - - Assert.False(section.Contains(Constants.Keys.Foreground)); - } -} diff --git a/tests/Task.Monitor.Tests/Configuration/ThemeTests.cs b/tests/Task.Monitor.Tests/Configuration/ThemeTests.cs new file mode 100644 index 0000000..aa72cf4 --- /dev/null +++ b/tests/Task.Monitor.Tests/Configuration/ThemeTests.cs @@ -0,0 +1,186 @@ +using System.Drawing; +using System.Text.RegularExpressions; +using Task.Monitor.Configuration; +using Task.Monitor.System.Configuration; +using Task.Monitor.Tests.Common; + +namespace Task.Monitor.Tests.Configuration; + +public sealed class ThemeTests +{ + private static string ThemeIni => @" +[Test Theme] +colour-mode=truecolour + +background=#0f1610 +background-highlight=#1d4125 + +col-cmd-normal-user-space=#327f77 +col-cmd-low-priority=#10b981 +col-cmd-high-cpu=#b082d1 +col-cmd-io-bound=#dff0e6 +col-cmd-script=#dff0e6 +col-user-current-non-root=#b082d1 +col-user-other-non-root=#b082d1 +col-user-system=#73fa91 +col-user-root=#73fa91 + +command-foreground=#717f24 +command-background=#121d18 + +delta-highlight-colour=#bda25c + +error=#a6423f + +foreground=#717f24 +foreground-highlight=#73fa91 + +menubar-foreground=#717f24 +menubar-background=#121d18 + +range-high-background=#b082d1 +range-low-background=#10b981 +range-mid-background=#ffd085 +range-high-foreground=#000000 +range-low-foreground=#000000 +range-mid-foreground=#000000 + +header-background=#121d18 +header-foreground=#717f24 +"; + + // A persisted colour value must be hex (#RRGGBB / #AARRGGBB) or the transparent token. + private static readonly Regex HexOrTransparent = + new("^(#[0-9A-Fa-f]{6}|#[0-9A-Fa-f]{8}|transparent)$", RegexOptions.Compiled); + + [Fact] + public void Theme_Canary_Test() => + Assert.Equal(29, CanaryTestHelper.GetPropertyCount()); + + [Fact] + public void Constructor_Initialises_Successfully() + { + ConfigParser parser = new(ThemeIni); + parser.Parse(); + Theme theme = new(parser.Sections[0]); + + AssertThemeColours(theme); + } + + [Fact] + public void Setters_Initialise_Successfully() + { + ConfigSection section = new("Test Theme"); + + Theme theme = new(section) { + Background = ColorTranslator.FromHtml("#0f1610"), + BackgroundHighlight = ColorTranslator.FromHtml("#1d4125"), + ColumnCommandNormalUserSpace = ColorTranslator.FromHtml("#327f77"), + ColumnCommandLowPriority = ColorTranslator.FromHtml("#10b981"), + ColumnCommandHighCpu = ColorTranslator.FromHtml("#b082d1"), + ColumnCommandIoBound = ColorTranslator.FromHtml("#dff0e6"), + ColumnCommandScript = ColorTranslator.FromHtml("#dff0e6"), + ColumnUserCurrentNonRoot = ColorTranslator.FromHtml("#b082d1"), + ColumnUserOtherNonRoot = ColorTranslator.FromHtml("#b082d1"), + ColumnUserSystem = ColorTranslator.FromHtml("#73fa91"), + ColumnUserRoot = ColorTranslator.FromHtml("#73fa91"), + CommandBackground = ColorTranslator.FromHtml("#121d18"), + CommandForeground = ColorTranslator.FromHtml("#717f24"), + DeltaHighlightColour = ColorTranslator.FromHtml("#bda25c"), + Error = ColorTranslator.FromHtml("#a6423f"), + Foreground = ColorTranslator.FromHtml("#717f24"), + ForegroundHighlight = ColorTranslator.FromHtml("#73fa91"), + HeaderBackground = ColorTranslator.FromHtml("#121d18"), + HeaderForeground = ColorTranslator.FromHtml("#717f24"), + MenubarBackground = ColorTranslator.FromHtml("#121d18"), + MenubarForeground = ColorTranslator.FromHtml("#717f24"), + RangeHighBackground = ColorTranslator.FromHtml("#b082d1"), + RangeLowBackground = ColorTranslator.FromHtml("#10b981"), + RangeMidBackground = ColorTranslator.FromHtml("#ffd085"), + RangeHighForeground = ColorTranslator.FromHtml("#000000"), + RangeLowForeground = ColorTranslator.FromHtml("#000000"), + RangeMidForeground = ColorTranslator.FromHtml("#000000") + }; + + AssertThemeColours(theme); + } + + private void AssertThemeColours(Theme theme) + { + Assert.Equal(ColorTranslator.FromHtml("#0f1610"), theme.Background); + Assert.Equal(ColorTranslator.FromHtml("#1d4125"), theme.BackgroundHighlight); + Assert.Equal(ColorTranslator.FromHtml("#327f77"), theme.ColumnCommandNormalUserSpace); + Assert.Equal(ColorTranslator.FromHtml("#10b981"), theme.ColumnCommandLowPriority); + Assert.Equal(ColorTranslator.FromHtml("#b082d1"), theme.ColumnCommandHighCpu); + Assert.Equal(ColorTranslator.FromHtml("#dff0e6"), theme.ColumnCommandIoBound); + Assert.Equal(ColorTranslator.FromHtml("#dff0e6"), theme.ColumnCommandScript); + Assert.Equal(ColorTranslator.FromHtml("#b082d1"), theme.ColumnUserCurrentNonRoot); + Assert.Equal(ColorTranslator.FromHtml("#b082d1"), theme.ColumnUserOtherNonRoot); + Assert.Equal(ColorTranslator.FromHtml("#73fa91"), theme.ColumnUserSystem); + Assert.Equal(ColorTranslator.FromHtml("#73fa91"), theme.ColumnUserRoot); + Assert.Equal(ColorTranslator.FromHtml("#121d18"), theme.CommandBackground); + Assert.Equal(ColorTranslator.FromHtml("#717f24"), theme.CommandForeground); + Assert.Equal(ColorTranslator.FromHtml("#bda25c"), theme.DeltaHighlightColour); + Assert.Equal(ColorTranslator.FromHtml("#a6423f"), theme.Error); + Assert.Equal(ColorTranslator.FromHtml("#717f24"), theme.Foreground); + Assert.Equal(ColorTranslator.FromHtml("#73fa91"), theme.ForegroundHighlight); + Assert.Equal(ColorTranslator.FromHtml("#121d18"), theme.HeaderBackground); + Assert.Equal(ColorTranslator.FromHtml("#717f24"), theme.HeaderForeground); + Assert.Equal(ColorTranslator.FromHtml("#121d18"), theme.MenubarBackground); + Assert.Equal(ColorTranslator.FromHtml("#717f24"), theme.MenubarForeground); + Assert.Equal(ColorTranslator.FromHtml("#b082d1"), theme.RangeHighBackground); + Assert.Equal(ColorTranslator.FromHtml("#10b981"), theme.RangeLowBackground); + Assert.Equal(ColorTranslator.FromHtml("#ffd085"), theme.RangeMidBackground); + Assert.Equal(ColorTranslator.FromHtml("#000000"), theme.RangeHighForeground); + Assert.Equal(ColorTranslator.FromHtml("#000000"), theme.RangeLowForeground); + Assert.Equal(ColorTranslator.FromHtml("#000000"), theme.RangeMidForeground); + } + + [Fact] + public void Normalize_Converts_Legacy_Names_To_Hex() + { + ConfigSection section = new("theme-test"); + section.Add(Constants.Keys.Background, "black"); + section.Add(Constants.Keys.Foreground, "White"); + section.Add(Constants.Keys.MenubarBackground, "DarkBlue"); + + new Theme(section).Normalize(); + + Assert.Equal("#000000", section.GetString(Constants.Keys.Background)); + Assert.Equal("#FFFFFF", section.GetString(Constants.Keys.Foreground)); + Assert.Equal("#000080", section.GetString(Constants.Keys.MenubarBackground)); + } + + [Fact] + public void Normalize_Preserves_Transparent_Token() + { + ConfigSection section = new("theme-test"); + section.Add(Constants.Keys.Background, "transparent"); + + new Theme(section).Normalize(); + + Assert.Equal("transparent", section.GetString(Constants.Keys.Background)); + } + + [Fact] + public void Normalize_Is_Idempotent_For_Hex_Values() + { + ConfigSection section = new("theme-test"); + section.Add(Constants.Keys.Background, "#123456"); + + new Theme(section).Normalize(); + + Assert.Equal("#123456", section.GetString(Constants.Keys.Background)); + } + + [Fact] + public void Normalize_Does_Not_Add_Missing_Keys() + { + ConfigSection section = new("theme-test"); + section.Add(Constants.Keys.Background, "black"); + + new Theme(section).Normalize(); + + Assert.False(section.Contains(Constants.Keys.Foreground)); + } +}