SchemeTests.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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"]! with { Normal = Attribute.Default };
  111. Assert.NotEqual (Attribute.Default, view.GetScheme ().Normal);
  112. view.GettingScheme += (sender, args) =>
  113. {
  114. args.Result = customScheme;
  115. args.Handled = true;
  116. };
  117. Assert.Equal (customScheme, view.GetScheme ());
  118. Assert.Equal (Attribute.Default, view.GetScheme ().Normal);
  119. view.Dispose ();
  120. }
  121. [Fact]
  122. public void SettingScheme_Event_CanCancelSchemeChange ()
  123. {
  124. var view = new View ();
  125. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  126. view.SchemeChanging += (sender, args) => args.Handled = true;
  127. view.SetScheme (dialogScheme);
  128. Assert.NotEqual (dialogScheme, view.GetScheme ());
  129. view.Dispose ();
  130. }
  131. [Fact]
  132. public void GetAttributeForRole_Event_CanOverrideAttribute ()
  133. {
  134. var view = new View { SchemeName = "Base" };
  135. var customAttribute = new Attribute (Color.BrightRed, Color.BrightYellow);
  136. view.GettingAttributeForRole += (sender, args) =>
  137. {
  138. if (args.Role == VisualRole.Focus)
  139. {
  140. args.Result = customAttribute;
  141. args.Handled = true;
  142. }
  143. };
  144. Assert.Equal (customAttribute, view.GetAttributeForRole (VisualRole.Focus));
  145. view.Dispose ();
  146. }
  147. [Fact]
  148. public void GetHardCodedSchemes_ReturnsExpectedSchemes ()
  149. {
  150. var schemes = Scheme.GetHardCodedSchemes ();
  151. Assert.NotNull (schemes);
  152. Assert.Contains ("Base", schemes.Keys);
  153. Assert.Contains ("Dialog", schemes.Keys);
  154. Assert.Contains ("Error", schemes.Keys);
  155. Assert.Contains ("Menu", schemes.Keys);
  156. Assert.Contains ("Toplevel", schemes.Keys);
  157. }
  158. [Fact]
  159. public void SchemeName_OverridesSuperViewScheme ()
  160. {
  161. var superView = new View ();
  162. var subView = new View ();
  163. superView.Add (subView);
  164. subView.SchemeName = "Error";
  165. var errorScheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  166. Assert.Equal (errorScheme, subView.GetScheme ());
  167. subView.Dispose ();
  168. superView.Dispose ();
  169. }
  170. [Fact]
  171. public void Scheme_DefaultsToBase_WhenNotSet ()
  172. {
  173. var view = new View ();
  174. var baseScheme = SchemeManager.GetHardCodedSchemes ()? ["Base"];
  175. Assert.Equal (baseScheme, view.GetScheme ());
  176. view.Dispose ();
  177. }
  178. [Fact]
  179. public void Scheme_HandlesNullSuperViewGracefully ()
  180. {
  181. var view = new View ();
  182. view.SchemeName = "Dialog";
  183. var dialogScheme = SchemeManager.GetHardCodedSchemes ()? ["Dialog"];
  184. Assert.Equal (dialogScheme, view.GetScheme ());
  185. view.Dispose ();
  186. }
  187. private class CustomView : View
  188. {
  189. protected override bool OnGettingScheme (out Scheme? scheme)
  190. {
  191. scheme = SchemeManager.GetHardCodedSchemes ()? ["Error"];
  192. return true;
  193. }
  194. protected override bool OnSettingScheme (ValueChangingEventArgs<Scheme?> args)
  195. {
  196. return true; // Prevent setting the scheme
  197. }
  198. }
  199. [Fact]
  200. public void View_Resolves_Attributes_From_Scheme ()
  201. {
  202. View view = new Label { SchemeName = "Base" };
  203. foreach (VisualRole role in Enum.GetValues<VisualRole> ())
  204. {
  205. Attribute attr = view.GetAttributeForRole (role);
  206. Assert.NotEqual (default, attr.Foreground); // Defensive: avoid all-defaults
  207. }
  208. view.Dispose ();
  209. }
  210. }