KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_altium_rule_transformer.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
28
29
#include <
qa_utils/wx_utils/unit_test_utils.h
>
30
31
#include <
pcbnew/pcb_io/altium/altium_rule_transformer.h
>
32
33
struct
ALTIUM_RULE_TRANSFORMER_FIXTURE
34
{
35
ALTIUM_RULE_TRANSFORMER_FIXTURE
() {}
36
};
37
38
42
BOOST_FIXTURE_TEST_SUITE( AltiumRuleTransformer,
ALTIUM_RULE_TRANSFORMER_FIXTURE
)
43
44
45
BOOST_AUTO_TEST_CASE
( AltiumRuleTokenizerEmptyInput )
46
{
47
ALTIUM_RULE_TOKENIZER
tokenizer(
""
);
48
49
const
ALTIUM_RULE_TOKEN
& peek = tokenizer.
Peek
();
50
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== peek.
kind
) );
51
BOOST_CHECK_EQUAL
( 0, peek.
pos
);
52
53
const
ALTIUM_RULE_TOKEN
&
next
= tokenizer.
Next
();
54
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
==
next
.kind ) );
55
BOOST_CHECK_EQUAL
( 0,
next
.pos );
56
57
const
ALTIUM_RULE_TOKEN
& peek2 = tokenizer.
Peek
();
58
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== peek2.
kind
) );
59
BOOST_CHECK_EQUAL
( 0, peek2.
pos
);
60
}
61
62
BOOST_AUTO_TEST_CASE
( AltiumRuleTokenizerOnlySpaces )
63
{
64
ALTIUM_RULE_TOKENIZER
tokenizer(
" "
);
65
66
const
ALTIUM_RULE_TOKEN
& peek = tokenizer.
Peek
();
67
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== peek.
kind
) );
68
BOOST_CHECK_EQUAL
( 3, peek.
pos
);
69
70
const
ALTIUM_RULE_TOKEN
&
next
= tokenizer.
Next
();
71
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
==
next
.kind ) );
72
BOOST_CHECK_EQUAL
( 3,
next
.pos );
73
74
const
ALTIUM_RULE_TOKEN
& peek2 = tokenizer.
Peek
();
75
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== peek2.
kind
) );
76
BOOST_CHECK_EQUAL
( 3, peek2.
pos
);
77
}
78
79
BOOST_AUTO_TEST_CASE
( AltiumRuleTokenizerSingleCharIdentifier )
80
{
81
ALTIUM_RULE_TOKENIZER
tokenizer(
"a"
);
82
83
const
ALTIUM_RULE_TOKEN
&
next
= tokenizer.
Next
();
84
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::IDENT
==
next
.kind ) );
85
BOOST_CHECK_EQUAL
( 0,
next
.pos );
86
BOOST_CHECK_EQUAL
(
"a"
,
next
.sValue );
87
88
const
ALTIUM_RULE_TOKEN
& peek = tokenizer.
Peek
();
89
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== peek.
kind
) );
90
BOOST_CHECK_EQUAL
( 1, peek.
pos
);
91
92
const
ALTIUM_RULE_TOKEN
& next2 = tokenizer.
Next
();
93
BOOST_CHECK( (
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
== next2.
kind
) );
94
BOOST_CHECK_EQUAL
( 1, next2.
pos
);
95
}
96
97
98
struct
ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT
99
{
100
wxString
input
;
101
std::vector<ALTIUM_RULE_TOKEN>
exp_token
;
102
};
103
107
static
const
std::vector<ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT>
altium_rule_tokens_property
= {
108
// Empty string
109
{
""
,
110
{
111
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 0 },
112
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 0 }
113
}
114
},
115
// Single Token
116
{
"All"
,
117
{
118
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 0,
"All"
},
119
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
120
}
121
},
122
{
"1234"
,
123
{
124
{
ALTIUM_RULE_TOKEN_KIND::CONST_INT
, 0, 1234L },
125
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 4 }
126
}
127
},
128
{
"+1234"
,
129
{
130
{
ALTIUM_RULE_TOKEN_KIND::CONST_INT
, 0, 1234L },
131
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 5 }
132
}
133
},
134
{
"-1234"
,
135
{
136
{
ALTIUM_RULE_TOKEN_KIND::CONST_INT
, 0, -1234L },
137
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 5 }
138
}
139
},
140
{
"'1234'"
,
141
{
142
{
ALTIUM_RULE_TOKEN_KIND::CONST_STRING
, 0,
"1234"
},
143
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 6 }
144
}
145
},
146
{
"True"
,
147
{
148
{
ALTIUM_RULE_TOKEN_KIND::CONST_TRUE
, 0 },
149
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 4 }
150
}
151
},
152
{
"true"
,
153
{
154
{
ALTIUM_RULE_TOKEN_KIND::CONST_TRUE
, 0 },
155
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 4 }
156
}
157
},
158
{
"False"
,
159
{
160
{
ALTIUM_RULE_TOKEN_KIND::CONST_FALSE
, 0 },
161
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 5 }
162
}
163
},
164
{
"false"
,
165
{
166
{
ALTIUM_RULE_TOKEN_KIND::CONST_FALSE
, 0 },
167
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 5 }
168
}
169
},
170
{
"+"
,
171
{
172
{
ALTIUM_RULE_TOKEN_KIND::ADD
, 0 },
173
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
174
}
175
},
176
{
"-"
,
177
{
178
{
ALTIUM_RULE_TOKEN_KIND::SUB
, 0 },
179
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
180
}
181
},
182
{
"*"
,
183
{
184
{
ALTIUM_RULE_TOKEN_KIND::MUL
, 0 },
185
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
186
}
187
},
188
{
"/"
,
189
{
190
{
ALTIUM_RULE_TOKEN_KIND::DIV
, 0 },
191
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
192
}
193
},
194
{
"Div"
,
195
{
196
{
ALTIUM_RULE_TOKEN_KIND::INTEGRAL_DIV
, 0 },
197
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
198
}
199
},
200
{
"div"
,
201
{
202
{
ALTIUM_RULE_TOKEN_KIND::INTEGRAL_DIV
, 0 },
203
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
204
}
205
},
206
{
"Mod"
,
207
{
208
{
ALTIUM_RULE_TOKEN_KIND::MOD
, 0 },
209
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
210
}
211
},
212
{
"mod"
,
213
{
214
{
ALTIUM_RULE_TOKEN_KIND::MOD
, 0 },
215
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
216
}
217
},
218
{
"And"
,
219
{
220
{
ALTIUM_RULE_TOKEN_KIND::AND
, 0 },
221
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
222
}
223
},
224
{
"and"
,
225
{
226
{
ALTIUM_RULE_TOKEN_KIND::AND
, 0 },
227
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
228
}
229
},
230
{
"&&"
,
231
{
232
{
ALTIUM_RULE_TOKEN_KIND::LOW_AND
, 0 },
233
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
234
}
235
},
236
{
"Or"
,
237
{
238
{
ALTIUM_RULE_TOKEN_KIND::OR
, 0 },
239
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
240
}
241
},
242
{
"or"
,
243
{
244
{
ALTIUM_RULE_TOKEN_KIND::OR
, 0 },
245
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
246
}
247
},
248
{
"||"
,
249
{
250
{
ALTIUM_RULE_TOKEN_KIND::LOW_OR
, 0 },
251
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
252
}
253
},
254
{
"Xor"
,
255
{
256
{
ALTIUM_RULE_TOKEN_KIND::XOR
, 0 },
257
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
258
}
259
},
260
{
"xor"
,
261
{
262
{
ALTIUM_RULE_TOKEN_KIND::XOR
, 0 },
263
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
264
}
265
},
266
{
"Not"
,
267
{
268
{
ALTIUM_RULE_TOKEN_KIND::NOT
, 0 },
269
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
270
}
271
},
272
{
"not"
,
273
{
274
{
ALTIUM_RULE_TOKEN_KIND::NOT
, 0 },
275
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 3 }
276
}
277
},
278
{
"<"
,
279
{
280
{
ALTIUM_RULE_TOKEN_KIND::LESS
, 0 },
281
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
282
}
283
},
284
{
"<="
,
285
{
286
{
ALTIUM_RULE_TOKEN_KIND::LESS_EQUAL
, 0 },
287
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
288
}
289
},
290
{
">"
,
291
{
292
{
ALTIUM_RULE_TOKEN_KIND::GREATER
, 0 },
293
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
294
}
295
},
296
{
">="
,
297
{
298
{
ALTIUM_RULE_TOKEN_KIND::GREATER_EQUAL
, 0 },
299
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
300
}
301
},
302
{
"<>"
,
303
{
304
{
ALTIUM_RULE_TOKEN_KIND::NOT_EQUAL
, 0 },
305
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 2 }
306
}
307
},
308
{
"="
,
309
{
310
{
ALTIUM_RULE_TOKEN_KIND::EQUAL
, 0 },
311
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 1 }
312
}
313
},
314
{
"Between"
,
315
{
316
{
ALTIUM_RULE_TOKEN_KIND::BETWEEN
, 0 },
317
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 7 }
318
}
319
},
320
{
"between"
,
321
{
322
{
ALTIUM_RULE_TOKEN_KIND::BETWEEN
, 0 },
323
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 7 }
324
}
325
},
326
{
"Like"
,
327
{
328
{
ALTIUM_RULE_TOKEN_KIND::LIKE
, 0 },
329
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 4 }
330
}
331
},
332
{
"like"
,
333
{
334
{
ALTIUM_RULE_TOKEN_KIND::LIKE
, 0 },
335
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 4 }
336
}
337
},
338
// Multiple tokens
339
{
"ab cd ef"
,
340
{
341
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 0,
"ab"
},
342
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 3,
"cd"
},
343
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 6,
"ef"
},
344
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 8 }
345
}
346
},
347
// Complex tests
348
{
"InComponent('LEDS1') or InComponent('LEDS2')"
,
349
{
350
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 0,
"InComponent"
},
351
{
ALTIUM_RULE_TOKEN_KIND::LPAR
, 11 },
352
{
ALTIUM_RULE_TOKEN_KIND::CONST_STRING
, 12,
"LEDS1"
},
353
{
ALTIUM_RULE_TOKEN_KIND::RPAR
, 19 },
354
{
ALTIUM_RULE_TOKEN_KIND::OR
, 21 },
355
{
ALTIUM_RULE_TOKEN_KIND::IDENT
, 24,
"InComponent"
},
356
{
ALTIUM_RULE_TOKEN_KIND::LPAR
, 35 },
357
{
ALTIUM_RULE_TOKEN_KIND::CONST_STRING
, 36,
"LEDS2"
},
358
{
ALTIUM_RULE_TOKEN_KIND::RPAR
, 43 },
359
{
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
, 44 }
360
}
361
}
362
};
363
367
BOOST_AUTO_TEST_CASE
( AltiumRuleTokenizerParameterizedTest )
368
{
369
for
(
const
auto
& c :
altium_rule_tokens_property
)
370
{
371
BOOST_TEST_CONTEXT
( wxString::Format( wxT(
"'%s'"
), c.input ) )
372
{
373
ALTIUM_RULE_TOKENIZER
tokenizer( c.input );
374
375
for
(
const
auto
&
expected
: c.exp_token )
376
{
377
const
ALTIUM_RULE_TOKEN
& token = tokenizer.
Next
();
378
BOOST_CHECK( (
expected
.kind == token.
kind
) );
379
BOOST_CHECK_EQUAL
(
expected
.pos, token.
pos
);
380
BOOST_CHECK_EQUAL
(
expected
.iValue, token.
iValue
);
381
BOOST_CHECK_EQUAL
(
expected
.fValue, token.
fValue
);
382
BOOST_CHECK_EQUAL
(
expected
.sValue, token.
sValue
);
383
}
384
}
385
}
386
}
387
388
BOOST_AUTO_TEST_SUITE_END
()
altium_rule_transformer.h
ALTIUM_RULE_TOKEN_KIND::CONST_INT
@ CONST_INT
Definition
altium_rule_transformer.h:36
ALTIUM_RULE_TOKEN_KIND::NOT
@ NOT
Definition
altium_rule_transformer.h:58
ALTIUM_RULE_TOKEN_KIND::LESS
@ LESS
Definition
altium_rule_transformer.h:60
ALTIUM_RULE_TOKEN_KIND::OR
@ OR
Definition
altium_rule_transformer.h:55
ALTIUM_RULE_TOKEN_KIND::SUB
@ SUB
Definition
altium_rule_transformer.h:47
ALTIUM_RULE_TOKEN_KIND::DIV
@ DIV
Definition
altium_rule_transformer.h:49
ALTIUM_RULE_TOKEN_KIND::MUL
@ MUL
Definition
altium_rule_transformer.h:48
ALTIUM_RULE_TOKEN_KIND::NOT_EQUAL
@ NOT_EQUAL
Definition
altium_rule_transformer.h:64
ALTIUM_RULE_TOKEN_KIND::AND
@ AND
Definition
altium_rule_transformer.h:53
ALTIUM_RULE_TOKEN_KIND::CONST_FALSE
@ CONST_FALSE
Definition
altium_rule_transformer.h:41
ALTIUM_RULE_TOKEN_KIND::GREATER_EQUAL
@ GREATER_EQUAL
Definition
altium_rule_transformer.h:62
ALTIUM_RULE_TOKEN_KIND::LESS_EQUAL
@ LESS_EQUAL
Definition
altium_rule_transformer.h:61
ALTIUM_RULE_TOKEN_KIND::EQUAL
@ EQUAL
Definition
altium_rule_transformer.h:65
ALTIUM_RULE_TOKEN_KIND::XOR
@ XOR
Definition
altium_rule_transformer.h:57
ALTIUM_RULE_TOKEN_KIND::END_OF_EXPR
@ END_OF_EXPR
Definition
altium_rule_transformer.h:70
ALTIUM_RULE_TOKEN_KIND::ADD
@ ADD
Definition
altium_rule_transformer.h:46
ALTIUM_RULE_TOKEN_KIND::LIKE
@ LIKE
Definition
altium_rule_transformer.h:68
ALTIUM_RULE_TOKEN_KIND::CONST_TRUE
@ CONST_TRUE
Definition
altium_rule_transformer.h:40
ALTIUM_RULE_TOKEN_KIND::BETWEEN
@ BETWEEN
Definition
altium_rule_transformer.h:67
ALTIUM_RULE_TOKEN_KIND::MOD
@ MOD
Definition
altium_rule_transformer.h:51
ALTIUM_RULE_TOKEN_KIND::LOW_AND
@ LOW_AND
Definition
altium_rule_transformer.h:54
ALTIUM_RULE_TOKEN_KIND::LPAR
@ LPAR
Definition
altium_rule_transformer.h:43
ALTIUM_RULE_TOKEN_KIND::INTEGRAL_DIV
@ INTEGRAL_DIV
Definition
altium_rule_transformer.h:50
ALTIUM_RULE_TOKEN_KIND::LOW_OR
@ LOW_OR
Definition
altium_rule_transformer.h:56
ALTIUM_RULE_TOKEN_KIND::RPAR
@ RPAR
Definition
altium_rule_transformer.h:44
ALTIUM_RULE_TOKEN_KIND::GREATER
@ GREATER
Definition
altium_rule_transformer.h:63
ALTIUM_RULE_TOKEN_KIND::IDENT
@ IDENT
Definition
altium_rule_transformer.h:35
ALTIUM_RULE_TOKEN_KIND::CONST_STRING
@ CONST_STRING
Definition
altium_rule_transformer.h:38
ALTIUM_RULE_TOKENIZER
Definition
altium_rule_transformer.h:110
ALTIUM_RULE_TOKENIZER::Peek
const ALTIUM_RULE_TOKEN & Peek() const
Definition
altium_rule_transformer.cpp:217
ALTIUM_RULE_TOKENIZER::Next
const ALTIUM_RULE_TOKEN & Next()
Definition
altium_rule_transformer.cpp:30
next
CITER next(CITER it)
Definition
ptree.cpp:124
ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT
Definition
test_altium_rule_transformer.cpp:99
ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT::exp_token
std::vector< ALTIUM_RULE_TOKEN > exp_token
Definition
test_altium_rule_transformer.cpp:101
ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT::input
wxString input
Definition
test_altium_rule_transformer.cpp:100
ALTIUM_RULE_TOKEN
Definition
altium_rule_transformer.h:74
ALTIUM_RULE_TOKEN::pos
size_t pos
Definition
altium_rule_transformer.h:76
ALTIUM_RULE_TOKEN::kind
ALTIUM_RULE_TOKEN_KIND kind
Definition
altium_rule_transformer.h:75
ALTIUM_RULE_TOKEN::sValue
wxString sValue
Definition
altium_rule_transformer.h:80
ALTIUM_RULE_TOKEN::fValue
double fValue
Definition
altium_rule_transformer.h:79
ALTIUM_RULE_TOKEN::iValue
long iValue
Definition
altium_rule_transformer.h:78
ALTIUM_RULE_TRANSFORMER_FIXTURE
Definition
test_altium_rule_transformer.cpp:34
ALTIUM_RULE_TRANSFORMER_FIXTURE::ALTIUM_RULE_TRANSFORMER_FIXTURE
ALTIUM_RULE_TRANSFORMER_FIXTURE()
Definition
test_altium_rule_transformer.cpp:35
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(AltiumRuleTokenizerEmptyInput)
Declares the struct as the Boost test fixture.
Definition
test_altium_rule_transformer.cpp:45
altium_rule_tokens_property
static const std::vector< ALTIUM_RULE_TOKENIZER_INPUT_OUTPUT > altium_rule_tokens_property
A list of valid test strings and the expected results.
Definition
test_altium_rule_transformer.cpp:107
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
Definition
test_api_enums.cpp:134
BOOST_AUTO_TEST_SUITE_END
BOOST_AUTO_TEST_SUITE_END()
expected
VECTOR3I expected(15, 30, 45)
BOOST_TEST_CONTEXT
BOOST_TEST_CONTEXT("Test Clearance")
Definition
test_shape_arc.cpp:656
BOOST_CHECK_EQUAL
BOOST_CHECK_EQUAL(result, "25.4")
unit_test_utils.h
src
qa
tests
pcbnew
pcb_io
altium
test_altium_rule_transformer.cpp
Generated on Mon Oct 13 2025 00:06:27 for KiCad PCB EDA Suite by
1.13.2