diff --git a/tests/ThemeToggleStatesTests.cs b/tests/ThemeToggleStatesTests.cs new file mode 100644 index 0000000..965b5aa --- /dev/null +++ b/tests/ThemeToggleStatesTests.cs @@ -0,0 +1,44 @@ +namespace Cthangover.Tools.Tests +{ + using Cthangover.Core.Mods.Testing; + using Cthangover.Core.UI.Theming; + using Godot; + + /// A checked box or toggle under the mouse keeps the margins of its other states, so its label never jumps. + public class ThemeToggleStatesTests + { + private static readonly string[] States = { "normal", "hover", "pressed", "hover_pressed", "disabled" }; + + [ModTest("theme/toggle_states_keep_their_margins")] + static void ToggleStatesKeepTheirMargins(ModTestContext ctx) + { + // In the tree: styles are looked up through the theme owner only there. + var theme = CthangoverTheme.Build(); + var root = ((SceneTree)Engine.GetMainLoop()).Root; + var controls = new (string What, Button Control)[] + { + ("CheckBox", new CheckBox()), + ("toggle Button", new Button { ToggleMode = true }), + ("tab", new Button { ToggleMode = true, ThemeTypeVariation = CthangoverTheme.TabVariation }), + ("primary", new Button { ToggleMode = true, ThemeTypeVariation = CthangoverTheme.PrimaryVariation }), + ("danger", new Button { ToggleMode = true, ThemeTypeVariation = CthangoverTheme.DangerVariation }), + ("icon", new Button { ToggleMode = true, ThemeTypeVariation = CthangoverTheme.IconVariation }), + ("ribbon", new Button { ToggleMode = true, ThemeTypeVariation = CthangoverTheme.RibbonVariation }), + ("OptionButton", new OptionButton()), + }; + foreach (var (what, control) in controls) + { + control.Theme = theme; + root.AddChild(control); + var normal = control.GetThemeStylebox("normal"); + foreach (var state in States) + { + var box = control.GetThemeStylebox(state); + ModAssert.CloseTo(normal.ContentMarginLeft, box.ContentMarginLeft, what: $"{what} {state}: left margin"); + ModAssert.CloseTo(normal.ContentMarginRight, box.ContentMarginRight, what: $"{what} {state}: right margin"); + } + control.Free(); + } + } + } +}