2
0

FakeDriverTests.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. using System.Text;
  2. using UnitTests;
  3. using Xunit.Abstractions;
  4. namespace UnitTests_Parallelizable.DriverTests;
  5. /// <summary>
  6. /// Tests for the FakeDriver to ensure it works properly with the modern component factory architecture.
  7. /// </summary>
  8. public class FakeDriverTests (ITestOutputHelper output) : FakeDriverBase
  9. {
  10. private readonly ITestOutputHelper _output = output;
  11. #region Basic FakeDriver Tests
  12. [Fact]
  13. public void FakeDriver_Init_Works ()
  14. {
  15. IDriver driver = CreateFakeDriver ();
  16. Assert.IsAssignableFrom<IDriver> (driver);
  17. _output.WriteLine ($"Driver type: {driver.GetType ().Name}");
  18. _output.WriteLine ($"Screen size: {driver.Screen}");
  19. }
  20. [Fact]
  21. public void FakeDriver_Screen_Has_Default_Size ()
  22. {
  23. IDriver driver = CreateFakeDriver ();
  24. // Default size should be 80x25
  25. Assert.Equal (new (0, 0, 80, 25), driver.Screen);
  26. Assert.Equal (80, driver.Cols);
  27. Assert.Equal (25, driver.Rows);
  28. }
  29. [Fact]
  30. public void FakeDriver_Can_Resize ()
  31. {
  32. IDriver driver = CreateFakeDriver ();
  33. // Start with default size
  34. Assert.Equal (80, driver.Cols);
  35. Assert.Equal (25, driver.Rows);
  36. // Resize to 100x30
  37. driver?.SetScreenSize (100, 30);
  38. // Verify new size
  39. Assert.Equal (100, driver.Cols);
  40. Assert.Equal (30, driver.Rows);
  41. Assert.Equal (new (0, 0, 100, 30), driver.Screen);
  42. }
  43. #endregion
  44. #region CreateFakeDriver Tests
  45. [Fact]
  46. public void SetupFakeDriver_Initializes_Driver_With_80x25 ()
  47. {
  48. IDriver driver = CreateFakeDriver ();
  49. Assert.NotNull (driver);
  50. Assert.Equal (new (0, 0, 80, 25), driver.Screen);
  51. Assert.Equal (80, driver.Cols);
  52. Assert.Equal (25, driver.Rows);
  53. }
  54. [Fact]
  55. public void SetupFakeDriver_Driver_Is_IDriver ()
  56. {
  57. IDriver driver = CreateFakeDriver ();
  58. Assert.NotNull (driver);
  59. // Should be IDriver
  60. Assert.IsAssignableFrom<IDriver> (driver);
  61. _output.WriteLine ($"Driver type: {driver.GetType ().Name}");
  62. }
  63. [Fact]
  64. public void SetupFakeDriver_Can_Set_Screen_Size ()
  65. {
  66. IDriver driver = CreateFakeDriver ();
  67. IDriver fakeDriver = driver;
  68. Assert.NotNull (fakeDriver);
  69. fakeDriver!.SetScreenSize (100, 50);
  70. Assert.Equal (100, driver.Cols);
  71. Assert.Equal (50, driver.Rows);
  72. }
  73. #endregion
  74. #region Clipboard Tests
  75. [Fact]
  76. public void FakeDriver_Clipboard_Works_When_Enabled ()
  77. {
  78. IDriver driver = CreateFakeDriver ();
  79. Assert.NotNull (driver.Clipboard);
  80. Assert.True (driver.Clipboard.IsSupported);
  81. // Set clipboard content
  82. driver.Clipboard.SetClipboardData ("Test content");
  83. // Get clipboard content
  84. string content = driver.Clipboard.GetClipboardData ();
  85. Assert.Equal ("Test content", content);
  86. }
  87. [Fact]
  88. public void FakeDriver_Clipboard_GetClipboarData_Works ()
  89. {
  90. IDriver driver = CreateFakeDriver ();
  91. Assert.NotNull (driver.Clipboard);
  92. driver.Clipboard.SetClipboardData ("test");
  93. Assert.Equal ("test", driver.Clipboard.GetClipboardData ());
  94. }
  95. #endregion
  96. #region Buffer and Fill Tests
  97. [Fact]
  98. public void FakeDriver_Can_Fill_Rectangle ()
  99. {
  100. IDriver driver = CreateFakeDriver ();
  101. // Verify driver is initialized with buffers
  102. Assert.NotNull (driver);
  103. Assert.NotNull (driver.Contents);
  104. // Fill a rectangle
  105. var rect = new Rectangle (5, 5, 10, 5);
  106. driver.FillRect (rect, (Rune)'X');
  107. // Verify the rectangle was filled
  108. for (int row = rect.Y; row < rect.Y + rect.Height; row++)
  109. {
  110. for (int col = rect.X; col < rect.X + rect.Width; col++)
  111. {
  112. Assert.Equal ("X", driver.Contents [row, col].Grapheme);
  113. }
  114. }
  115. }
  116. [Fact]
  117. public void FakeDriver_Buffer_Integrity_After_Multiple_Resizes ()
  118. {
  119. IDriver driver = CreateFakeDriver ();
  120. // Start with default size
  121. Assert.Equal (80, driver.Cols);
  122. Assert.Equal (25, driver.Rows);
  123. // Fill with a pattern
  124. driver.FillRect (new (0, 0, 10, 5), (Rune)'A');
  125. // Resize
  126. driver?.SetScreenSize (100, 30);
  127. // Verify new size
  128. Assert.Equal (100, driver.Cols);
  129. Assert.Equal (30, driver.Rows);
  130. // Verify buffer is clean (no stale runes from previous size)
  131. Assert.NotNull (driver.Contents);
  132. Assert.Equal (30, driver.Contents!.GetLength (0));
  133. Assert.Equal (100, driver.Contents.GetLength (1));
  134. // Fill with new pattern
  135. driver.FillRect (new (0, 0, 20, 10), (Rune)'B');
  136. // Resize back
  137. driver?.SetScreenSize (80, 25);
  138. // Verify size is back
  139. Assert.Equal (80, driver.Cols);
  140. Assert.Equal (25, driver.Rows);
  141. // Verify buffer dimensions match
  142. Assert.Equal (25, driver.Contents.GetLength (0));
  143. Assert.Equal (80, driver.Contents.GetLength (1));
  144. }
  145. #endregion
  146. #region ScreenChanged Event Tests
  147. [Fact]
  148. public void ScreenChanged_Event_Fires_On_SetScreenSize ()
  149. {
  150. IDriver driver = CreateFakeDriver ();
  151. var screenChangedFired = false;
  152. Size? newSize = null;
  153. driver.SizeChanged += (sender, args) =>
  154. {
  155. screenChangedFired = true;
  156. newSize = args.Size;
  157. };
  158. // Trigger resize using FakeResize which uses SetScreenSize internally
  159. driver?.SetScreenSize (100, 30);
  160. // Verify event fired
  161. Assert.True (screenChangedFired);
  162. Assert.NotNull (newSize);
  163. Assert.Equal (100, newSize!.Value.Width);
  164. Assert.Equal (30, newSize.Value.Height);
  165. }
  166. [Fact]
  167. public void FakeResize_Triggers_ScreenChanged_And_Updates_Application_Screen ()
  168. {
  169. IDriver driver = CreateFakeDriver ();
  170. var screenChangedFired = false;
  171. Size? eventSize = null;
  172. driver.SizeChanged += (sender, args) =>
  173. {
  174. screenChangedFired = true;
  175. eventSize = args.Size;
  176. };
  177. // Use FakeResize helper
  178. driver?.SetScreenSize (120, 40);
  179. // Verify event fired
  180. Assert.True (screenChangedFired);
  181. Assert.NotNull (eventSize);
  182. Assert.Equal (120, eventSize!.Value.Width);
  183. Assert.Equal (40, eventSize.Value.Height);
  184. // Verify driver.Screen was updated
  185. Assert.Equal (new (0, 0, 120, 40), driver.Screen);
  186. Assert.Equal (120, driver.Cols);
  187. Assert.Equal (40, driver.Rows);
  188. }
  189. [Fact]
  190. public void SizeChanged_Event_Still_Fires_For_Compatibility ()
  191. {
  192. IDriver driver = CreateFakeDriver ();
  193. var sizeChangedFired = false;
  194. var screenChangedFired = false;
  195. #pragma warning disable CS0618 // Type or member is obsolete
  196. driver.SizeChanged += (sender, args) => { sizeChangedFired = true; };
  197. #pragma warning restore CS0618 // Type or member is obsolete
  198. driver.SizeChanged += (sender, args) => { screenChangedFired = true; };
  199. // Trigger resize using FakeResize
  200. driver?.SetScreenSize (90, 35);
  201. // Both events should fire for compatibility
  202. Assert.True (sizeChangedFired);
  203. Assert.True (screenChangedFired);
  204. }
  205. #endregion
  206. }