Files
Nonemm/tests/Nonemm.App.Tests/ThemesTests.cs
ericek111 da04764756 Two themes, and one place that decides what colour a station is
Colours came from static brushes scattered over the windows. They now come
from a Theme, and everything that paints a station, a spot or a log row
asks Themes.Current as it paints, so changing the theme changes every
window without reopening it.

light is N1MM's own palette, read out of ApplicationStyles: the pale blue
behind a window, ivory on a button, white boxes, and the four colours a
station is painted in. dark is the same states in colours for a dark
screen, which is roughly what the program looked like before.

Config > Manage Skins, Colors and Fonts picks one, under N1MM's name for
the same dialog, and shows what each theme paints a callsign. The choice
is kept in settings.json as Theme, and light is the default.

The window chrome follows through resources the Fluent controls read, so a
text box and a button take the theme's colours in every state. Fonts and
skins are not part of it.

Looked at under Xvfb in both themes: the entry window, the theme dialog,
and the log window with its rows still coloured by what each contact was
worth.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 13:06:32 +00:00

31 lines
811 B
C#

using Nonemm.App.Theming;
namespace Nonemm.App.Tests;
public class ThemesTests
{
[Fact]
public void TheThemesAreFoundByName()
{
Assert.Equal("light", Themes.Find("light").Name);
Assert.Equal("dark", Themes.Find("DARK").Name);
}
[Fact]
public void AThemeNobodyShipsFallsBackToTheN1mmColours() =>
Assert.Equal(Theme.Light, Themes.Find("solarized"));
[Fact]
public void OneBrushIsHandedOutPerColour() =>
Assert.Same(Themes.Brush(Theme.Light.Worth), Themes.Brush(Theme.Light.Worth));
[Fact]
public void EveryThemePaintsTheFourStatesApart()
{
foreach (Theme theme in Themes.All)
{
Assert.Equal(4, new[] { theme.Worth, theme.Multiplier, theme.Multipliers, theme.Dupe }.Distinct().Count());
}
}
}