SchemeTests.cs 7.6 KB

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