KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_zoom_controller.cpp
Go to the documentation of this file.
1
/*
2
* This program source code file is part of KiCad, a free EDA CAD application.
3
*
4
* Copyright The KiCad Developers, see AUTHORS.TXT for contributors.
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, you may find one here:
18
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19
* or you may search the http://www.gnu.org website for the version 2 license,
20
* or you may write to the Free Software Foundation, Inc.,
21
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22
*/
23
24
#include <
qa_utils/wx_utils/unit_test_utils.h
>
25
26
#include <
view/zoom_controller.h
>
27
28
29
// All these tests are of a class in KIGFX
30
using namespace
KIGFX
;
31
32
33
BOOST_AUTO_TEST_SUITE
( ZoomController )
34
35
36
struct
CONST_ZOOM_CASE
37
{
38
double
scale_factor
;
39
int
scroll_amount
;
40
double
exp_zoom_in
;
41
double
exp_zoom_out
;
42
};
43
44
45
/*
46
* Some "sane" examples for steps, scale factors and results.
47
* These should be actual examples that could be encountered
48
*
49
* TODO: Add more cases for, eg, Mac
50
*/
51
static
const
std::vector<CONST_ZOOM_CASE>
const_zoom_cases
= {
52
// A single scroll step on a GTK3 Linux system
53
// 120 is the standard wheel delta, so it's what you might expect
54
// from a single scroll wheel detent.
55
{
CONSTANT_ZOOM_CONTROLLER::GTK3_SCALE
, 120, 1.1, 1 / 1.1 },
56
};
57
61
BOOST_AUTO_TEST_CASE
( ConstController )
62
{
63
// How close we need to be (not very, this is a subjective thing anyway)
64
const
double
tol_percent = 10;
65
66
double
scale_for_step;
67
68
for
(
const
auto
& c :
const_zoom_cases
)
69
{
70
CONSTANT_ZOOM_CONTROLLER
zoom_ctrl( c.scale_factor );
71
72
scale_for_step = zoom_ctrl.
GetScaleForRotation
( c.scroll_amount );
73
BOOST_CHECK_CLOSE( scale_for_step, c.exp_zoom_in, tol_percent );
74
75
scale_for_step = zoom_ctrl.
GetScaleForRotation
( -c.scroll_amount );
76
BOOST_CHECK_CLOSE( scale_for_step, c.exp_zoom_out, tol_percent );
77
}
78
}
79
83
class
PREDEF_TIMESTAMPER
:
public
ACCELERATING_ZOOM_CONTROLLER::TIMESTAMP_PROVIDER
84
{
85
public
:
86
using
STAMP_LIST
= std::vector<int>;
87
88
PREDEF_TIMESTAMPER
(
const
STAMP_LIST
& aStamps )
89
:
m_stamps
( aStamps ),
m_iter
(
m_stamps
.begin() )
90
{
91
}
92
96
ACCELERATING_ZOOM_CONTROLLER::TIME_PT
GetTimestamp
()
override
97
{
98
// Don't ask for more samples than given
99
BOOST_REQUIRE
(
m_iter
!=
m_stamps
.end() );
100
101
return
ACCELERATING_ZOOM_CONTROLLER::TIME_PT
( std::chrono::milliseconds( *
m_iter
++ ) );
102
}
103
104
const
STAMP_LIST
m_stamps
;
105
STAMP_LIST::const_iterator
m_iter
;
106
};
107
108
109
struct
ACCEL_ZOOM_CASE
110
{
111
int
timeout
;
112
std::vector<int>
stamps
;
// NB includes the initial stamp!
113
std::vector<int>
scrolls
;
114
std::vector<double>
zooms
;
115
};
116
117
static
const
std::vector<ACCEL_ZOOM_CASE>
accel_cases
= {
118
// Scrolls widely spaced, just go up and down by a constant factor
119
{ 500, { 0, 1000, 2000, 3000, 4000 }, { 120, 120, -120, -120 }, { 1.05, 1.05, 1 / 1.05, 1 / 1.05 } },
120
// Close scrolls - acceleration, apart from when changing direction
121
{ 500, { 0, 1000, 1100, 1200, 1300, 1400 }, { 120, 120, -120, -120, 120 }, { 1.05, 2.05, 1 / 1.05, 1 / 2.05, 1.05 } },
122
};
123
124
128
BOOST_AUTO_TEST_CASE
( AccelController )
129
{
130
const
double
tol_percent = 10.0;
131
132
for
(
const
auto
& c :
accel_cases
)
133
{
134
PREDEF_TIMESTAMPER
timestamper( c.stamps );
135
136
ACCELERATING_ZOOM_CONTROLLER
zoom_ctrl(
137
ACCELERATING_ZOOM_CONTROLLER::DEFAULT_ACCELERATION_SCALE
,
138
std::chrono::milliseconds( c.timeout ), ×tamper );
139
140
for
(
unsigned
i = 0; i < c.scrolls.size(); i++ )
141
{
142
const
auto
zoom_scale = zoom_ctrl.
GetScaleForRotation
( c.scrolls[i] );
143
144
BOOST_CHECK_CLOSE( zoom_scale, c.zooms[i], tol_percent );
145
}
146
}
147
}
148
149
150
BOOST_AUTO_TEST_SUITE_END
()
KIGFX::ACCELERATING_ZOOM_CONTROLLER::TIMESTAMP_PROVIDER
Definition
zoom_controller.h:84
KIGFX::ACCELERATING_ZOOM_CONTROLLER
Class that zooms faster if scroll events happen very close together.
Definition
zoom_controller.h:63
KIGFX::ACCELERATING_ZOOM_CONTROLLER::TIME_PT
std::chrono::time_point< CLOCK > TIME_PT
The type of the time stamps.
Definition
zoom_controller.h:72
KIGFX::ACCELERATING_ZOOM_CONTROLLER::GetScaleForRotation
double GetScaleForRotation(int aRotation) override
Get the scale factor produced by a given mousewheel rotation.
Definition
zoom_controller.cpp:73
KIGFX::ACCELERATING_ZOOM_CONTROLLER::DEFAULT_ACCELERATION_SCALE
static constexpr double DEFAULT_ACCELERATION_SCALE
The default minimum step factor for accelerating controller.
Definition
zoom_controller.h:78
KIGFX::CONSTANT_ZOOM_CONTROLLER
A CONSTANT_ZOOM_CONTROLLER that zooms by a fixed factor based only on the magnitude of the scroll whe...
Definition
zoom_controller.h:143
KIGFX::CONSTANT_ZOOM_CONTROLLER::GetScaleForRotation
double GetScaleForRotation(int aRotation) override
Get the scale factor produced by a given mousewheel rotation.
Definition
zoom_controller.cpp:125
KIGFX::CONSTANT_ZOOM_CONTROLLER::GTK3_SCALE
static constexpr double GTK3_SCALE
A suitable (magic) scale factor for GTK3 systems.
Definition
zoom_controller.h:154
PREDEF_TIMESTAMPER
Timestamper that returns predefined values from a vector.
Definition
test_zoom_controller.cpp:84
PREDEF_TIMESTAMPER::STAMP_LIST
std::vector< int > STAMP_LIST
Definition
test_zoom_controller.cpp:86
PREDEF_TIMESTAMPER::PREDEF_TIMESTAMPER
PREDEF_TIMESTAMPER(const STAMP_LIST &aStamps)
Definition
test_zoom_controller.cpp:88
PREDEF_TIMESTAMPER::GetTimestamp
ACCELERATING_ZOOM_CONTROLLER::TIME_PT GetTimestamp() override
Definition
test_zoom_controller.cpp:96
PREDEF_TIMESTAMPER::m_stamps
const STAMP_LIST m_stamps
Definition
test_zoom_controller.cpp:104
PREDEF_TIMESTAMPER::m_iter
STAMP_LIST::const_iterator m_iter
Definition
test_zoom_controller.cpp:105
KIGFX
The Cairo implementation of the graphics abstraction layer.
Definition
eda_group.h:33
ACCEL_ZOOM_CASE
Definition
test_zoom_controller.cpp:110
ACCEL_ZOOM_CASE::scrolls
std::vector< int > scrolls
Definition
test_zoom_controller.cpp:113
ACCEL_ZOOM_CASE::stamps
std::vector< int > stamps
Definition
test_zoom_controller.cpp:112
ACCEL_ZOOM_CASE::zooms
std::vector< double > zooms
Definition
test_zoom_controller.cpp:114
ACCEL_ZOOM_CASE::timeout
int timeout
Definition
test_zoom_controller.cpp:111
CONST_ZOOM_CASE
Definition
test_zoom_controller.cpp:37
CONST_ZOOM_CASE::scale_factor
double scale_factor
Definition
test_zoom_controller.cpp:38
CONST_ZOOM_CASE::scroll_amount
int scroll_amount
Definition
test_zoom_controller.cpp:39
CONST_ZOOM_CASE::exp_zoom_out
double exp_zoom_out
Definition
test_zoom_controller.cpp:41
CONST_ZOOM_CASE::exp_zoom_in
double exp_zoom_in
Definition
test_zoom_controller.cpp:40
BOOST_AUTO_TEST_SUITE
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END
BOOST_AUTO_TEST_SUITE_END()
accel_cases
static const std::vector< ACCEL_ZOOM_CASE > accel_cases
Definition
test_zoom_controller.cpp:117
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(ConstController)
Check basic setting and getting of values.
Definition
test_zoom_controller.cpp:61
const_zoom_cases
static const std::vector< CONST_ZOOM_CASE > const_zoom_cases
Definition
test_zoom_controller.cpp:51
unit_test_utils.h
zoom_controller.h
ZOOM_CONTROLLER class definition.
src
qa
tests
common
view
test_zoom_controller.cpp
Generated on Sun Sep 21 2025 01:05:32 for KiCad PCB EDA Suite by
1.13.2