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