PageRenderTime 25ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/UnitTests/GitUI.Tests/CommandsDialogs/SettingsDialog/Pages/ColorsPageSettingsPageControllerTests.cs

https://github.com/gitextensions/gitextensions
C# | 202 lines | 170 code | 32 blank | 0 comment | 0 complexity | e2040684c3cba14ff3f225adc587cd0e MD5 | raw file
Possible License(s): GPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using FluentAssertions;
  6. using GitCommands;
  7. using GitExtUtils.GitUI.Theming;
  8. using GitUI.CommandsDialogs.SettingsDialog.Pages;
  9. using GitUI.Theming;
  10. using NSubstitute;
  11. using NUnit.Framework;
  12. namespace GitUITests.CommandsDialogs.SettingsDialog.Pages
  13. {
  14. [TestFixture]
  15. public class ColorsPageSettingsPageControllerTests
  16. {
  17. private ColorSettingsPageTestContext _context = null!;
  18. [SetUp]
  19. public void Setup()
  20. {
  21. ThemeModule.TestAccessor.SuppressWin32Hooks = true;
  22. MockColorsSettingsPage page = new();
  23. var themeRepository = Substitute.For<IThemeRepository>();
  24. var themePathProvider = Substitute.For<IThemePathProvider>();
  25. themeRepository
  26. .GetTheme(Arg.Any<ThemeId>(), Arg.Any<IReadOnlyList<string>>())
  27. .Returns(callInfo => new Theme(new Dictionary<AppColor, Color>(), new Dictionary<KnownColor, Color>(), callInfo.Arg<ThemeId>()));
  28. ColorsSettingsPageController controller = new(page, themeRepository, themePathProvider);
  29. _context = new ColorSettingsPageTestContext(page, controller, themeRepository);
  30. }
  31. [Test]
  32. public void When_current_theme_is_default_choosing_visual_style_or_theme_variation_should_be_disabled()
  33. {
  34. AppSettings.ThemeId = ThemeId.Default;
  35. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  36. _context.Controller.ShowThemeSettings();
  37. _context.Page.IsChoosingThemeVariationsEnabled.Should().BeFalse();
  38. _context.Page.IsChoosingVisualStyleEnabled.Should().BeFalse();
  39. }
  40. [Test]
  41. public void When_current_theme_is_non_default_choosing_visual_style_or_theme_variation_should_be_enabled()
  42. {
  43. AppSettings.ThemeId = new ThemeId("non_default", isBuiltin: true);
  44. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  45. _context.Controller.ShowThemeSettings();
  46. _context.Page.IsChoosingThemeVariationsEnabled.Should().BeTrue();
  47. _context.Page.IsChoosingVisualStyleEnabled.Should().BeTrue();
  48. }
  49. [Test]
  50. public void When_user_switches_to_default_theme_UseSystemVisualStyle_should_be_checked()
  51. {
  52. AppSettings.ThemeId = new ThemeId("non_default", isBuiltin: true);
  53. AppSettings.UseSystemVisualStyle = false;
  54. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  55. _context.Controller.ShowThemeSettings();
  56. _context.Page.UseSystemVisualStyle.Should().BeFalse();
  57. _context.Page.SelectedThemeId = ThemeId.Default;
  58. _context.Controller.HandleSelectedThemeChanged();
  59. _context.Page.UseSystemVisualStyle.Should().BeTrue();
  60. }
  61. [Test]
  62. public void When_user_switches_to_non_default_theme_UseSystemVisualStyle_should_be_unchecked()
  63. {
  64. AppSettings.ThemeId = ThemeId.Default;
  65. AppSettings.UseSystemVisualStyle = true;
  66. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  67. _context.Controller.ShowThemeSettings();
  68. _context.Page.UseSystemVisualStyle.Should().BeTrue();
  69. _context.Page.SelectedThemeId = new ThemeId("non_default", isBuiltin: true);
  70. _context.Controller.HandleSelectedThemeChanged();
  71. _context.Page.UseSystemVisualStyle.Should().BeFalse();
  72. }
  73. [Test]
  74. public void When_user_switches_to_default_theme_UseColorblindVariation_should_be_unchecked()
  75. {
  76. AppSettings.ThemeId = new ThemeId("non_default", isBuiltin: true);
  77. AppSettings.ThemeVariations = new[] { ThemeVariations.Colorblind };
  78. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  79. _context.Controller.ShowThemeSettings();
  80. _context.Page.SelectedThemeVariations.Should().BeEquivalentTo(ThemeVariations.Colorblind);
  81. _context.Page.SelectedThemeId = ThemeId.Default;
  82. _context.Controller.HandleSelectedThemeChanged();
  83. _context.Page.SelectedThemeVariations.Should().BeEmpty();
  84. }
  85. [TestCaseSource(nameof(CasesThemeSettings))]
  86. public void SettingsAreModified_should_reflect_ThemeId_change(
  87. ThemeId themeId, string[] themeVariations, bool useSystemVisualStyle)
  88. {
  89. AppSettings.ThemeId = themeId;
  90. AppSettings.ThemeVariations = themeVariations;
  91. AppSettings.UseSystemVisualStyle = useSystemVisualStyle;
  92. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  93. _context.Controller.ShowThemeSettings();
  94. _context.Page.SelectedThemeId = new ThemeId("another_theme", isBuiltin: false);
  95. _context.Controller.SettingsAreModified.Should().BeTrue();
  96. }
  97. [TestCaseSource(nameof(CasesThemeSettings))]
  98. public void SettingsAreModified_should_reflect_UseSystemVisualStyle_change(
  99. ThemeId themeId, string[] themeVariations, bool useSystemVisualStyle)
  100. {
  101. AppSettings.ThemeId = themeId;
  102. AppSettings.ThemeVariations = themeVariations;
  103. AppSettings.UseSystemVisualStyle = useSystemVisualStyle;
  104. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  105. _context.Controller.ShowThemeSettings();
  106. _context.Controller.SettingsAreModified.Should().BeFalse();
  107. _context.Page.UseSystemVisualStyle = !_context.Page.UseSystemVisualStyle;
  108. _context.Controller.SettingsAreModified.Should().BeTrue();
  109. }
  110. [TestCaseSource(nameof(CasesThemeSettings))]
  111. public void SettingsAreModified_should_reflect_ThemeVariations_change(
  112. ThemeId themeId, string[] themeVariations, bool useSystemVisualStyle)
  113. {
  114. AppSettings.ThemeId = themeId;
  115. AppSettings.ThemeVariations = themeVariations;
  116. AppSettings.UseSystemVisualStyle = useSystemVisualStyle;
  117. ThemeModule.TestAccessor.ReloadThemeSettings(_context.ThemeRepository);
  118. _context.Controller.ShowThemeSettings();
  119. _context.Controller.SettingsAreModified.Should().BeFalse();
  120. _context.Page.SelectedThemeVariations = themeVariations.SequenceEqual(ThemeVariations.None)
  121. ? new[] { ThemeVariations.Colorblind }
  122. : ThemeVariations.None;
  123. _context.Controller.SettingsAreModified.Should().BeTrue();
  124. }
  125. private static IEnumerable<object[]> CasesThemeSettings()
  126. {
  127. yield return new object[]
  128. {
  129. ThemeId.Default,
  130. ThemeVariations.None,
  131. true // useSystemVisualStyle
  132. };
  133. yield return new object[]
  134. {
  135. new ThemeId("non_default", isBuiltin: true),
  136. new[] { ThemeVariations.Colorblind },
  137. false // useSystemVisualStyle
  138. };
  139. }
  140. private class MockColorsSettingsPage : IColorsSettingsPage
  141. {
  142. public ThemeId SelectedThemeId { get; set; }
  143. public string[] SelectedThemeVariations { get; set; }
  144. public bool UseSystemVisualStyle { get; set; }
  145. public bool LabelRestartIsNeededVisible { get; set; }
  146. public bool IsChoosingThemeVariationsEnabled { get; set; }
  147. public bool IsChoosingVisualStyleEnabled { get; set; }
  148. public void ShowThemeLoadingErrorMessage(ThemeId themeId, string[] variations, Exception ex) =>
  149. throw new NotImplementedException();
  150. public void PopulateThemeMenu(IEnumerable<ThemeId> themeIds)
  151. {
  152. }
  153. }
  154. private class ColorSettingsPageTestContext
  155. {
  156. public ColorSettingsPageTestContext(
  157. IColorsSettingsPage page,
  158. ColorsSettingsPageController controller,
  159. IThemeRepository themeRepository)
  160. {
  161. Page = page;
  162. Controller = controller;
  163. ThemeRepository = themeRepository;
  164. }
  165. public IColorsSettingsPage Page { get; }
  166. public ColorsSettingsPageController Controller { get; }
  167. public IThemeRepository ThemeRepository { get; }
  168. }
  169. }
  170. }