@@ -22,6 +22,43 @@ TEST_CASE("Cursor blink", "[Video]")
2222 Video::RendererSoftware rendererSoft;
2323 IF_SIMD (Video::RendererSIMD rendererSIMD)
2424
25+ SECTION (" Control" )
26+ {
27+ constexpr CursorLine EXPECTED_ON{
28+ CYAN, BLACK, CYAN, BLACK, CYAN, BLACK, CYAN, BLACK,
29+ BLACK, CYAN, BLACK, CYAN, BLACK, CYAN, BLACK, CYAN,
30+ };
31+ constexpr CursorLine EXPECTED_OFF{
32+ BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
33+ BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK, BLACK,
34+ };
35+
36+ // No need to test SIMD, as the control code is in Renderer.
37+ rendererSoft.SetCursorEnabled (true );
38+ rendererSoft.SetCursorBlink (false , 1 , 1 );
39+ rendererSoft.SetCursorPattern (0 , 0xAA55 );
40+ rendererSoft.SetCursorColor (0b1011 ); // Cyan
41+ rendererSoft.SetDisplayFormat (Video::Renderer::DisplayFormat::PAL, false , false ); // 50 FPS.
42+
43+ rendererSoft.RenderFrame ();
44+ REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ()));
45+
46+ // Advance time to just before the off period.
47+ rendererSoft.IncrementCursorTime (Video::Renderer::DELTA_50FPS - 1 .);
48+ rendererSoft.RenderFrame ();
49+ REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ()));
50+
51+ // Advance time to exactly the delta time.
52+ rendererSoft.IncrementCursorTime (1 .);
53+ rendererSoft.RenderFrame ();
54+ REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_OFF.data ()));
55+
56+ // Make sure the cursor is on when blink is deactivated on an off/complement period.
57+ rendererSoft.SetCursorBlink (false , 1 , 0 ); // Disable blink.
58+ rendererSoft.RenderFrame ();
59+ REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ()));
60+ }
61+
2562 SECTION (" ON/OFF" )
2663 {
2764 rendererSoft.SetCursorEnabled (true );
@@ -45,9 +82,9 @@ TEST_CASE("Cursor blink", "[Video]")
4582 REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ()));
4683 IF_SIMD (REQUIRE (std::equal (rendererSIMD.m_cursorPlane .begin (), rendererSIMD.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ())))
4784
48- rendererSoft.IncrementCursorTime (240'000'000 . );
85+ rendererSoft.IncrementCursorTime (Video::Renderer::DELTA_50FPS );
4986 rendererSoft.RenderFrame ();
50- IF_SIMD (rendererSIMD.IncrementCursorTime (240'000'000 . ))
87+ IF_SIMD (rendererSIMD.IncrementCursorTime (Video::Renderer::DELTA_50FPS ))
5188 IF_SIMD (rendererSIMD.RenderFrame ())
5289
5390 constexpr CursorLine EXPECTED_OFF{
@@ -81,9 +118,9 @@ TEST_CASE("Cursor blink", "[Video]")
81118 REQUIRE (std::equal (rendererSoft.m_cursorPlane .begin (), rendererSoft.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ()));
82119 IF_SIMD (REQUIRE (std::equal (rendererSIMD.m_cursorPlane .begin (), rendererSIMD.m_cursorPlane .begin () + 16 , EXPECTED_ON.data ())))
83120
84- rendererSoft.IncrementCursorTime (240'000'000 . );
121+ rendererSoft.IncrementCursorTime (Video::Renderer::DELTA_50FPS );
85122 rendererSoft.RenderFrame ();
86- IF_SIMD (rendererSIMD.IncrementCursorTime (240'000'000 . ))
123+ IF_SIMD (rendererSIMD.IncrementCursorTime (Video::Renderer::DELTA_50FPS ))
87124 IF_SIMD (rendererSIMD.RenderFrame ())
88125
89126 constexpr CursorLine EXPECTED_COMPLEMENT{
0 commit comments