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,67 @@ 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{KeyType::Char, ' z' };
238+ const KeyEvent zoomOutEv{KeyType::Char, ' Z' };
239+ const KeyEvent zoomDefaultEv{KeyType::Char, ' z' , true , false , false }; // Ctrl+z
240+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
241+ for (size_t i = ZOOM_DEFAULT_INDEX + 1 ; i < ZOOM_FACTORS.size (); i++)
242+ {
243+ gameDesktop->Msg_KeyDown (zoomInEv);
244+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[i]);
245+ }
246+ // Wrap around
247+ gameDesktop->Msg_KeyDown (zoomInEv);
248+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[0 ]);
249+ gameDesktop->Msg_KeyDown (zoomInEv);
250+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[1 ]);
251+
252+ gameDesktop->Msg_KeyDown (zoomOutEv);
253+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[0 ]);
254+ gameDesktop->Msg_KeyDown (zoomOutEv);
255+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS.back ());
256+
257+ gameDesktop->Msg_KeyDown (zoomDefaultEv);
258+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
259+
260+ gameDesktop->Msg_WheelDown ({});
261+ auto curZoom = view->GetCurrentTargetZoomFactor ();
262+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
263+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1 ]);
264+ // Go to prev index
265+ gameDesktop->Msg_KeyDown (zoomOutEv);
266+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1 ]);
267+
268+ gameDesktop->Msg_KeyDown (zoomDefaultEv);
269+ gameDesktop->Msg_WheelUp ({});
270+ curZoom = view->GetCurrentTargetZoomFactor ();
271+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
272+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
273+ // Go to next index
274+ gameDesktop->Msg_KeyDown (zoomInEv);
275+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
276+
277+ gameDesktop->Msg_WheelDown ({});
278+ curZoom = view->GetCurrentTargetZoomFactor ();
279+ BOOST_TEST (curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
280+ BOOST_TEST (curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1 ]);
281+ // Go to prev index
282+ gameDesktop->Msg_KeyDown (zoomOutEv);
283+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
284+
285+ // Zoom in and out gets to 1.0 (default)
286+ static_assert (ZOOM_FACTORS[ZOOM_DEFAULT_INDEX] == 1 .f );
287+ gameDesktop->Msg_WheelUp ({});
288+ gameDesktop->Msg_WheelDown ({});
289+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == 1 .f );
290+ const auto numZoom = rttr::test::randomValue (2 , 10 );
291+ for (int i = 0 ; i < numZoom; i++)
292+ gameDesktop->Msg_WheelDown ({});
293+ for (int i = 0 ; i < numZoom; i++)
294+ gameDesktop->Msg_WheelUp ({});
295+ BOOST_TEST (view->GetCurrentTargetZoomFactor () == 1 .f );
296+ }
297+
230298BOOST_AUTO_TEST_SUITE_END ()
0 commit comments