SchemeTests.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #nullable enable
  2. using Xunit;
  3. namespace Terminal.Gui.ViewTests;
  4. [Trait ("Category", "View.Scheme")]
  5. public class SchemeTests
  6. {
  7. [Fact]
  8. public void GetScheme_Default_ReturnsBaseScheme ()
  9. {
  10. var view = new View ();
  11. var baseScheme = SchemeManager.GetHardCodedSchemes ()? ["Base"];
  12. Assert.Equal (baseScheme, view.GetScheme ());
  13. view.Dispose ();
  14. }
  15. [Fact]
  16. public void SetScheme_Explicitly_SetsSchemeCorrectly ()
  17. {
  18. var view = new View ();
  19. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  20. view.SetScheme (dialogScheme);
  21. Assert.True (view.HasScheme);
  22. Assert.Equal (dialogScheme, view.GetScheme ());
  23. view.Dispose ();
  24. }
  25. [Fact]
  26. public void GetScheme_InheritsFromSuperView_WhenNotExplicitlySet ()
  27. {
  28. var superView = new View ();
  29. var subView = new View ();
  30. superView.Add (subView);
  31. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  32. superView.SetScheme (dialogScheme);
  33. Assert.Equal (dialogScheme, subView.GetScheme ());
  34. Assert.False (subView.HasScheme);
  35. subView.Dispose ();
  36. superView.Dispose ();
  37. }
  38. [Fact]
  39. public void SetSchemeName_OverridesInheritedScheme ()
  40. {
  41. var view = new View ();
  42. view.SchemeName = "Dialog";
  43. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  44. Assert.Equal (dialogScheme, view.GetScheme ());
  45. view.Dispose ();
  46. }
  47. [Fact]
  48. public void GetAttribute_ReturnsCorrectAttribute_Via_Mock ()
  49. {
  50. var view = new View { SchemeName = "Base" };
  51. view.Driver = new MockConsoleDriver ();
  52. view.Driver.SetAttribute (new Attribute (Color.Red, Color.Green));
  53. // Act
  54. var attribute = view.GetCurrentAttribute ();
  55. // Assert
  56. Assert.Equal (new Attribute (Color.Red, Color.Green), attribute);
  57. }
  58. [Fact]
  59. public void GetAttributeForRole_ReturnsCorrectAttribute ()
  60. {
  61. var view = new View { SchemeName = "Base" };
  62. Assert.Equal (view.GetScheme ().Normal, view.GetAttributeForRole (VisualRole.Normal));
  63. Assert.Equal (view.GetScheme ().HotNormal, view.GetAttributeForRole (VisualRole.HotNormal));
  64. Assert.Equal (view.GetScheme ().Focus, view.GetAttributeForRole (VisualRole.Focus));
  65. Assert.Equal (view.GetScheme ().HotFocus, view.GetAttributeForRole (VisualRole.HotFocus));
  66. Assert.Equal (view.GetScheme ().Disabled, view.GetAttributeForRole (VisualRole.Disabled));
  67. view.Dispose ();
  68. }
  69. [Fact]
  70. public void GetAttributeForRole_DisabledView_ReturnsCorrectAttribute ()
  71. {
  72. var view = new View { SchemeName = "Base" };
  73. view.Enabled = false;
  74. Assert.Equal (view.GetScheme ().Disabled, view.GetAttributeForRole (VisualRole.Normal));
  75. Assert.Equal (view.GetScheme ().Disabled, view.GetAttributeForRole (VisualRole.HotNormal));
  76. view.Dispose ();
  77. }
  78. [Fact]
  79. public void SetAttributeForRole_SetsCorrectAttribute ()
  80. {
  81. var view = new View { SchemeName = "Base" };
  82. view.Driver = new MockConsoleDriver ();
  83. view.Driver.SetAttribute (new Attribute (Color.Red, Color.Green));
  84. var previousAttribute = view.SetAttributeForRole (VisualRole.Focus);
  85. Assert.Equal (view.GetScheme ().Focus, view.GetCurrentAttribute ());
  86. Assert.NotEqual (previousAttribute, view.GetCurrentAttribute ());
  87. view.Dispose ();
  88. }
  89. [Fact]
  90. public void OnGettingScheme_Override_StopsDefaultBehavior ()
  91. {
  92. var view = new CustomView ();
  93. var customScheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  94. Assert.Equal (customScheme, view.GetScheme ());
  95. view.Dispose ();
  96. }
  97. [Fact]
  98. public void OnSettingScheme_Override_PreventsSettingScheme ()
  99. {
  100. var view = new CustomView ();
  101. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  102. view.SetScheme (dialogScheme);
  103. Assert.NotEqual (dialogScheme, view.GetScheme ());
  104. view.Dispose ();
  105. }
  106. [Fact]
  107. public void GettingScheme_Event_CanOverrideScheme ()
  108. {
  109. var view = new View ();
  110. var customScheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  111. view.GettingScheme += (sender, args) =>
  112. {
  113. args.NewScheme = customScheme;
  114. args.Cancel = true;
  115. };
  116. Assert.Equal (customScheme, view.GetScheme ());
  117. view.Dispose ();
  118. }
  119. [Fact]
  120. public void SettingScheme_Event_CanCancelSchemeChange ()
  121. {
  122. var view = new View ();
  123. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  124. view.SettingScheme += (sender, args) => args.Cancel = true;
  125. view.SetScheme (dialogScheme);
  126. Assert.NotEqual (dialogScheme, view.GetScheme ());
  127. view.Dispose ();
  128. }
  129. [Fact]
  130. public void GetAttributeForRole_Event_CanOverrideAttribute ()
  131. {
  132. var view = new View { SchemeName = "Base" };
  133. var customAttribute = new Attribute (Color.BrightRed, Color.BrightYellow);
  134. view.GettingAttributeForRole += (sender, args) =>
  135. {
  136. if (args.Role == VisualRole.Focus)
  137. {
  138. args.NewValue = customAttribute;
  139. args.Cancel = true;
  140. }
  141. };
  142. Assert.Equal (customAttribute, view.GetAttributeForRole (VisualRole.Focus));
  143. view.Dispose ();
  144. }
  145. [Fact]
  146. public void GetHardCodedSchemes_ReturnsExpectedSchemes ()
  147. {
  148. var schemes = Scheme.GetHardCodedSchemes ();
  149. Assert.NotNull (schemes);
  150. Assert.Contains ("Base", schemes.Keys);
  151. Assert.Contains ("Dialog", schemes.Keys);
  152. Assert.Contains ("Error", schemes.Keys);
  153. Assert.Contains ("Menu", schemes.Keys);
  154. Assert.Contains ("Toplevel", schemes.Keys);
  155. }
  156. [Fact]
  157. public void SchemeName_OverridesSuperViewScheme ()
  158. {
  159. var superView = new View ();
  160. var subView = new View ();
  161. superView.Add (subView);
  162. subView.SchemeName = "Error";
  163. var errorScheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  164. Assert.Equal (errorScheme, subView.GetScheme());
  165. subView.Dispose ();
  166. superView.Dispose ();
  167. }
  168. [Fact]
  169. public void Scheme_DefaultsToBase_WhenNotSet ()
  170. {
  171. var view = new View ();
  172. var baseScheme = SchemeManager.GetHardCodedSchemes ()? ["Base"];
  173. Assert.Equal (baseScheme, view.GetScheme());
  174. view.Dispose ();
  175. }
  176. [Fact]
  177. public void Scheme_HandlesNullSuperViewGracefully ()
  178. {
  179. var view = new View ();
  180. view.SchemeName = "Dialog";
  181. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  182. Assert.Equal (dialogScheme, view.GetScheme());
  183. view.Dispose ();
  184. }
  185. private class CustomView : View
  186. {
  187. protected override bool OnGettingScheme (out Scheme? scheme)
  188. {
  189. scheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  190. return true;
  191. }
  192. protected override bool OnSettingScheme (in Scheme? scheme)
  193. {
  194. return true; // Prevent setting the scheme
  195. }
  196. }
  197. [Fact]
  198. public void View_Resolves_Attributes_From_Scheme ()
  199. {
  200. View view = new Label { SchemeName = "Base" };
  201. foreach (VisualRole role in Enum.GetValues<VisualRole> ())
  202. {
  203. Attribute attr = view.GetAttributeForRole (role);
  204. Assert.NotEqual (default, attr.Foreground); // Defensive: avoid all-defaults
  205. }
  206. view.Dispose ();
  207. }
  208. }