1- // Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
1+ // Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org)
22//
33// SPDX-License-Identifier: GPL-2.0-or-later
44
1414#include " uiHelper/uiHelpers.hpp"
1515#include " worldFixtures/CreateEmptyWorld.h"
1616#include " worldFixtures/WorldFixture.h"
17+ #include " gameData/GuiConsts.h"
18+ #include " rttr/test/random.hpp"
1719#include < boost/test/unit_test.hpp>
1820
1921// LCOV_EXCL_START
@@ -36,6 +38,9 @@ struct dskGameInterfaceMock : public dskGameInterface
3638 void Msg_PaintBefore () override {}
3739 void Msg_PaintAfter () override {}
3840 using dskGameInterface::actionwindow;
41+ using dskGameInterface::Msg_KeyDown;
42+ using dskGameInterface::Msg_WheelDown;
43+ using dskGameInterface::Msg_WheelUp;
3944};
4045struct GameInterfaceFixture : uiHelper::Fixture
4146{
@@ -227,4 +232,69 @@ BOOST_FIXTURE_TEST_CASE(IwActionClose, GameInterfaceFixture)
227232 BOOST_TEST_REQUIRE (gameDesktop->actionwindow == nullptr );
228233}
229234
235+ BOOST_FIXTURE_TEST_CASE (Zooming, GameInterfaceFixture)
236+ {
237+ const KeyEvent zoomInEv (' z' );
238+ const KeyEvent zoomOutEv (' Z' );
239+ KeyEvent zoomDefaultEv (' z' );
240+ zoomDefaultEv.ctrl = true ;
241+
242+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
243+ for (size_t i = ZOOM_DEFAULT_INDEX + 1 ; i < ZOOM_FACTORS.size (); i++)
244+ {
245+ gameDesktop->Msg_KeyDown (zoomInEv);
246+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[i]);
247+ }
248+ // Wrap around
249+ gameDesktop->Msg_KeyDown (zoomInEv);
250+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[0 ]);
251+ gameDesktop->Msg_KeyDown (zoomInEv);
252+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[1 ]);
253+
254+ gameDesktop->Msg_KeyDown (zoomOutEv);
255+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[0 ]);
256+ gameDesktop->Msg_KeyDown (zoomOutEv);
257+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS.back ());
258+
259+ gameDesktop->Msg_KeyDown (zoomDefaultEv);
260+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
261+
262+ gameDesktop->Msg_WheelDown ({});
263+ auto curZoom = view->GetCurrentTargetZoomFactor ();
264+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
265+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1 ]);
266+ // Go to prev index
267+ gameDesktop->Msg_KeyDown (zoomOutEv);
268+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1 ]);
269+
270+ gameDesktop->Msg_KeyDown (zoomDefaultEv);
271+ gameDesktop->Msg_WheelUp ({});
272+ curZoom = view->GetCurrentTargetZoomFactor ();
273+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
274+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
275+ // Go to next index
276+ gameDesktop->Msg_KeyDown (zoomInEv);
277+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
278+
279+ gameDesktop->Msg_WheelDown ({});
280+ curZoom = view->GetCurrentTargetZoomFactor ();
281+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
282+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
283+ // Go to prev index
284+ gameDesktop->Msg_KeyDown (zoomOutEv);
285+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
286+
287+ // Zoom in and out gets to 1.0 (default)
288+ static_assert (ZOOM_FACTORS[ZOOM_DEFAULT_INDEX] == 1 .f );
289+ gameDesktop->Msg_WheelUp ({});
290+ gameDesktop->Msg_WheelDown ({});
291+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == 1 .f );
292+ const auto numZoom = rttr::test::randomValue (2 , 10 );
293+ for (int i = 0 ; i < numZoom; i++)
294+ gameDesktop->Msg_WheelDown ({});
295+ for (int i = 0 ; i < numZoom; i++)
296+ gameDesktop->Msg_WheelUp ({});
297+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == 1 .f );
298+ }
299+
230300BOOST_AUTO_TEST_SUITE_END ()
0 commit comments