KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_property_value_converter.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 3
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/gpl-3.0.html
19 * or you may search the http://www.gnu.org website for the version 3 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 <boost/test/unit_test.hpp>
25
27
28#include <geometry/eda_angle.h>
29#include <gal/color4d.h>
30#include <kiid.h>
31#include <layer_ids.h>
32#include <math/box2.h>
33#include <math/vector2d.h>
34
35#include <wx/any.h>
36#include <wx/string.h>
37
38#include <optional>
39
40
41using namespace KICAD_DIFF;
42
43
44BOOST_AUTO_TEST_SUITE( PropertyValueConverter )
45
46
47BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Bool )
48{
49 DIFF_VALUE d = WxAnyToDiffValue( wxAny( true ) );
50 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::BOOL );
51 BOOST_CHECK_EQUAL( d.AsBool(), true );
52
53 d = WxAnyToDiffValue( wxAny( false ) );
54 BOOST_CHECK_EQUAL( d.AsBool(), false );
55}
56
57
58BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Int )
59{
60 DIFF_VALUE d = WxAnyToDiffValue( wxAny( 42 ) );
61 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::INT );
62 BOOST_CHECK_EQUAL( d.AsInt(), 42 );
63
64 d = WxAnyToDiffValue( wxAny( -7 ) );
65 BOOST_CHECK_EQUAL( d.AsInt(), -7 );
66}
67
68
69BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_OptionalIntPresent )
70{
71 std::optional<int> opt = 100;
72 DIFF_VALUE d = WxAnyToDiffValue( wxAny( opt ) );
73 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::INT );
74 BOOST_CHECK_EQUAL( d.AsInt(), 100 );
75}
76
77
78BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_OptionalIntEmpty )
79{
80 // Empty optional<int> distinguishes "unset" from 0 — should become T::NONE.
81 std::optional<int> opt;
82 DIFF_VALUE d = WxAnyToDiffValue( wxAny( opt ) );
83 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::NONE );
84}
85
86
87BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_OptionalDouble )
88{
89 std::optional<double> opt = 3.14;
90 DIFF_VALUE d = WxAnyToDiffValue( wxAny( opt ) );
91 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::DOUBLE );
92 BOOST_CHECK_CLOSE( d.AsDouble(), 3.14, 0.001 );
93
94 std::optional<double> empty;
95 d = WxAnyToDiffValue( wxAny( empty ) );
96 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::NONE );
97}
98
99
100BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Double )
101{
102 DIFF_VALUE d = WxAnyToDiffValue( wxAny( 1.5 ) );
103 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::DOUBLE );
104 BOOST_CHECK_CLOSE( d.AsDouble(), 1.5, 0.001 );
105}
106
107
108BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Float )
109{
110 float v = 2.5f;
111 DIFF_VALUE d = WxAnyToDiffValue( wxAny( v ) );
112 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::DOUBLE );
113 BOOST_CHECK_CLOSE( d.AsDouble(), 2.5, 0.001 );
114}
115
116
117BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_WxString )
118{
119 DIFF_VALUE d = WxAnyToDiffValue( wxAny( wxString( "hello" ) ) );
120 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::STRING );
121 BOOST_CHECK( d.AsString() == wxS( "hello" ) );
122}
123
124
125BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_StdString )
126{
127 std::string s = "world";
128 DIFF_VALUE d = WxAnyToDiffValue( wxAny( s ) );
129 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::STRING );
130 BOOST_CHECK( d.AsString() == wxS( "world" ) );
131}
132
133
134BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Kiid )
135{
136 KIID k;
137 DIFF_VALUE d = WxAnyToDiffValue( wxAny( k ) );
138 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::KIID );
139 BOOST_CHECK( d.AsKiid() == k );
140}
141
142
143BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_EdaAngle )
144{
145 EDA_ANGLE ang( 45.0, DEGREES_T );
146 DIFF_VALUE d = WxAnyToDiffValue( wxAny( ang ) );
147 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::DOUBLE );
148 BOOST_CHECK_CLOSE( d.AsDouble(), 45.0, 0.001 );
149}
150
151
152BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Vector2I )
153{
154 VECTOR2I v( 10, 20 );
155 DIFF_VALUE d = WxAnyToDiffValue( wxAny( v ) );
156 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::VECTOR2I );
157 BOOST_CHECK( d.AsVector2I() == v );
158}
159
160
161BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Box2I )
162{
163 // All four fields participate — y and height regressions previously
164 // would have slipped past a partial-field assertion.
165 BOX2I b( VECTOR2I( 3, 7 ), VECTOR2I( 100, 200 ) );
166 DIFF_VALUE d = WxAnyToDiffValue( wxAny( b ) );
167 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::BOX2I );
168 BOOST_CHECK( d.AsBox2I() == b );
169}
170
171
172BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_Color )
173{
174 KIGFX::COLOR4D c( 0.5, 0.25, 0.125, 0.75 );
175 DIFF_VALUE d = WxAnyToDiffValue( wxAny( c ) );
176 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::COLOR );
177 KIGFX::COLOR4D out = d.AsColor();
178 BOOST_CHECK_CLOSE( out.r, 0.5, 0.001 );
179 BOOST_CHECK_CLOSE( out.g, 0.25, 0.001 );
180 BOOST_CHECK_CLOSE( out.b, 0.125, 0.001 );
181 BOOST_CHECK_CLOSE( out.a, 0.75, 0.001 );
182}
183
184
185BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_PcbLayerId )
186{
187 PCB_LAYER_ID lyr = F_Cu;
188 DIFF_VALUE d = WxAnyToDiffValue( wxAny( lyr ) );
189 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::LAYER );
190 BOOST_CHECK( d.AsLayer() == F_Cu );
191}
192
193
194BOOST_AUTO_TEST_CASE( WxAnyToDiffValue_UnsupportedReturnsNone )
195{
196 // wxAny holding an unsupported user type (no PROPERTY_BASE for enum
197 // fallback) returns DIFF_VALUE::T::NONE.
198 struct Custom { int n; };
199 Custom c{ 5 };
200 DIFF_VALUE d = WxAnyToDiffValue( wxAny( c ) );
201 BOOST_CHECK( d.GetType() == DIFF_VALUE::T::NONE );
202}
203
204
205BOOST_AUTO_TEST_CASE( DiffValueToWxAny_None )
206{
207 // A NONE value carries no payload; the converter must report failure and
208 // leave the output untouched so the merge applier counts it as failed.
209 wxAny out( wxString( "untouched" ) );
210 BOOST_CHECK( !DiffValueToWxAny( DIFF_VALUE(), out ) );
211 BOOST_CHECK( out.As<wxString>() == wxS( "untouched" ) );
212}
213
214
215BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Bool )
216{
217 wxAny out;
218 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromBool( true ), out ) );
219 BOOST_CHECK_EQUAL( out.As<bool>(), true );
220}
221
222
223BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Int )
224{
225 wxAny out;
226 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromInt( -42 ), out ) );
227 BOOST_CHECK_EQUAL( out.As<int>(), -42 );
228}
229
230
231BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Int64 )
232{
233 wxAny out;
234 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromInt64( 1234567890123LL ), out ) );
235 BOOST_CHECK( out.As<long long>() == 1234567890123LL );
236}
237
238
239BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Double )
240{
241 wxAny out;
242 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromDouble( 2.5 ), out ) );
243 BOOST_CHECK_CLOSE( out.As<double>(), 2.5, 0.001 );
244}
245
246
247BOOST_AUTO_TEST_CASE( DiffValueToWxAny_String )
248{
249 wxAny out;
250 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromString( wxString( "hi" ) ), out ) );
251 BOOST_CHECK( out.As<wxString>() == wxS( "hi" ) );
252}
253
254
255BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Kiid )
256{
257 KIID k;
258 wxAny out;
259 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromKiid( k ), out ) );
260 BOOST_CHECK( out.As<KIID>() == k );
261}
262
263
264BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Vector2I )
265{
266 VECTOR2I v( 11, 22 );
267 wxAny out;
268 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromVector2I( v ), out ) );
269 BOOST_CHECK( out.As<VECTOR2I>() == v );
270}
271
272
273BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Box2I )
274{
275 BOX2I b( VECTOR2I( 1, 2 ), VECTOR2I( 30, 40 ) );
276 wxAny out;
277 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromBox2I( b ), out ) );
278 BOOST_CHECK( out.As<BOX2I>() == b );
279}
280
281
282BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Color )
283{
284 KIGFX::COLOR4D c( 0.1, 0.2, 0.3, 0.4 );
285 wxAny out;
286 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromColor( c ), out ) );
287 BOOST_CHECK( out.As<KIGFX::COLOR4D>() == c );
288}
289
290
291BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Layer )
292{
293 wxAny out;
294 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromLayer( B_Cu ), out ) );
295 BOOST_CHECK( out.As<PCB_LAYER_ID>() == B_Cu );
296}
297
298
299BOOST_AUTO_TEST_CASE( DiffValueToWxAny_Enum )
300{
301 // The enum payload's integer is the canonical value a PROPERTY_ENUM setter
302 // consumes; the label is dropped on the way back to wxAny.
303 wxAny out;
304 BOOST_CHECK( DiffValueToWxAny( DIFF_VALUE::FromEnum( 7, "Seven" ), out ) );
305 BOOST_CHECK_EQUAL( out.As<int>(), 7 );
306}
307
308
BOX2< VECTOR2I > BOX2I
Definition box2.h:918
A typed sum value used to carry the before/after of any single property.
static DIFF_VALUE FromLayer(PCB_LAYER_ID aLayer)
static DIFF_VALUE FromDouble(double aValue)
static DIFF_VALUE FromEnum(int aValue, const std::string &aLabel)
KIGFX::COLOR4D AsColor() const
static DIFF_VALUE FromInt64(int64_t aValue)
static DIFF_VALUE FromInt(int aValue)
static DIFF_VALUE FromBox2I(const BOX2I &aValue)
static DIFF_VALUE FromKiid(const KIID &aValue)
static DIFF_VALUE FromColor(const KIGFX::COLOR4D &aValue)
static DIFF_VALUE FromBool(bool aValue)
static DIFF_VALUE FromString(const wxString &aValue)
PCB_LAYER_ID AsLayer() const
static DIFF_VALUE FromVector2I(const VECTOR2I &aValue)
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
double r
Red component.
Definition color4d.h:389
double g
Green component.
Definition color4d.h:390
double a
Alpha component.
Definition color4d.h:392
double b
Blue component.
Definition color4d.h:391
Definition kiid.h:44
static bool empty(const wxTextEntryBase *aCtrl)
@ DEGREES_T
Definition eda_angle.h:31
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ B_Cu
Definition layer_ids.h:61
@ F_Cu
Definition layer_ids.h:60
bool DiffValueToWxAny(const DIFF_VALUE &aValue, wxAny &aOut)
Convert a DIFF_VALUE back into a wxAny a PROPERTY_BASE setter can consume.
DIFF_VALUE WxAnyToDiffValue(const wxAny &aValue, PROPERTY_BASE *aProperty)
Convert a wxAny value read from a PROPERTY_BASE getter into a DIFF_VALUE that the engine can store,...
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(WxAnyToDiffValue_Bool)
BOOST_CHECK_EQUAL(result, "25.4")
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683