KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_bus_parsing.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 modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * 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
21
22#include <connection_graph.h>
24#include <sch_connection.h>
25
26
27BOOST_AUTO_TEST_SUITE( BusParsing )
28
29
30BOOST_AUTO_TEST_CASE( EscapedVectorMembersMatchScalarConnections )
31{
32 SCH_CONNECTION bus( static_cast<CONNECTION_GRAPH*>( nullptr ) );
33 bus.ConfigureFromLabel( wxS( "{slash}IRQ[1..2]" ) );
34 BOOST_REQUIRE_EQUAL( bus.Members().size(), 2 );
35
36 for( size_t i = 0; i < bus.Members().size(); ++i )
37 {
38 SCH_CONNECTION scalar( static_cast<CONNECTION_GRAPH*>( nullptr ) );
39 scalar.ConfigureFromLabel( wxString::Format( wxS( "{slash}IRQ%zu" ), i + 1 ) );
40 BOOST_CHECK_EQUAL( bus.Members()[i]->Name(), scalar.Name() );
41 BOOST_CHECK_EQUAL( bus.Members()[i]->LocalName(), scalar.LocalName() );
42 }
43}
44
45
46BOOST_AUTO_TEST_CASE( EscapedGroupMembersMatchScalarConnections )
47{
48 CONNECTION_GRAPH graph;
49 SCH_CONNECTION bus( &graph );
50 bus.ConfigureFromLabel( wxS( "{ {slash}IRQ1 {slash}IRQ2 }" ) );
51 BOOST_REQUIRE_EQUAL( bus.Members().size(), 2 );
52
53 for( size_t i = 0; i < bus.Members().size(); ++i )
54 {
55 SCH_CONNECTION scalar( &graph );
56 scalar.ConfigureFromLabel( wxString::Format( wxS( "{slash}IRQ%zu" ), i + 1 ) );
57 BOOST_CHECK_EQUAL( bus.Members()[i]->Name(), scalar.Name() );
58 BOOST_CHECK_EQUAL( bus.Members()[i]->LocalName(), scalar.LocalName() );
59 }
60}
61
62
63BOOST_AUTO_TEST_CASE( ParsesFormattedVectorBus )
64{
65 wxString name;
66 std::vector<wxString> members;
67
68 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "D_{[1..2]}" ), &name, &members ) );
69 BOOST_CHECK_EQUAL( name, wxS( "D" ) );
70
71 std::vector<wxString> expected = { wxS( "D1" ), wxS( "D2" ) };
72
73 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
74}
75
76
77BOOST_AUTO_TEST_CASE( ParsesFormattedGroupWithVectorMember )
78{
79 wxString name;
80 std::vector<wxString> members;
81
82 // D_{[1..2]} keeps the subscript so recursive expansion via ParseBusVector works.
83 // ~{LATCH} preserves the overbar notation because ~{LATCH} and LATCH are different nets.
84 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "MEM{D_{[1..2]} ~{LATCH}}" ), &name, &members ) );
85 BOOST_CHECK_EQUAL( name, wxS( "MEM" ) );
86
87 std::vector<wxString> expected = { wxS( "D_{[1..2]}" ), wxS( "~{LATCH}" ) };
88
89 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
90}
91
92
93BOOST_AUTO_TEST_CASE( RejectsUnescapedSpacesInBusVector )
94{
95 wxString name;
96 std::vector<wxString> members;
97
98 // Unescaped space in bus vector prefix should fail
99 BOOST_CHECK( !NET_SETTINGS::ParseBusVector( wxS( "Data Bus[1..4]" ), &name, &members ) );
100}
101
102
103BOOST_AUTO_TEST_CASE( ParsesBackslashEscapedSpacesInBusVector )
104{
105 wxString name;
106 std::vector<wxString> members;
107
108 // Backslash-escaped space in bus vector prefix should work
109 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "Data\\ Bus[1..2]" ), &name, &members ) );
110 BOOST_CHECK_EQUAL( name, wxS( "Data Bus" ) );
111
112 std::vector<wxString> expected = { wxS( "Data Bus1" ), wxS( "Data Bus2" ) };
113
114 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
115}
116
117
118BOOST_AUTO_TEST_CASE( ParsesQuotedSpacesInBusVector )
119{
120 wxString name;
121 std::vector<wxString> members;
122
123 // Quoted string with space in bus vector prefix should work
124 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "\"Data Bus\"[1..2]" ), &name, &members ) );
125 BOOST_CHECK_EQUAL( name, wxS( "Data Bus" ) );
126
127 std::vector<wxString> expected = { wxS( "Data Bus1" ), wxS( "Data Bus2" ) };
128
129 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
130}
131
132
133BOOST_AUTO_TEST_CASE( RejectsUnescapedSpacesInBusGroupPrefix )
134{
135 wxString name;
136 std::vector<wxString> members;
137
138 // Unescaped space in bus group prefix should fail
139 BOOST_CHECK( !NET_SETTINGS::ParseBusGroup( wxS( "My Bus{NET1 NET2}" ), &name, &members ) );
140}
141
142
143BOOST_AUTO_TEST_CASE( ParsesBackslashEscapedSpacesInBusGroupPrefix )
144{
145 wxString name;
146 std::vector<wxString> members;
147
148 // Backslash-escaped space in bus group prefix should work
149 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "My\\ Bus{NET1 NET2}" ), &name, &members ) );
150 BOOST_CHECK_EQUAL( name, wxS( "My Bus" ) );
151
152 std::vector<wxString> expected = { wxS( "NET1" ), wxS( "NET2" ) };
153
154 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
155}
156
157
158BOOST_AUTO_TEST_CASE( ParsesQuotedSpacesInBusGroupPrefix )
159{
160 wxString name;
161 std::vector<wxString> members;
162
163 // Quoted string with space in bus group prefix should work
164 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "\"My Bus\"{NET1 NET2}" ), &name, &members ) );
165 BOOST_CHECK_EQUAL( name, wxS( "My Bus" ) );
166
167 std::vector<wxString> expected = { wxS( "NET1" ), wxS( "NET2" ) };
168
169 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
170}
171
172
173BOOST_AUTO_TEST_CASE( ParsesBackslashEscapedSpacesInBusGroupMembers )
174{
175 wxString name;
176 std::vector<wxString> members;
177
178 // Backslash-escaped space in bus group member name should work.
179 // Members are stored with escaped spaces so ForEachBusMember recursion works correctly.
180 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "BUS{Net\\ One Net\\ Two}" ), &name, &members ) );
181 BOOST_CHECK_EQUAL( name, wxS( "BUS" ) );
182
183 std::vector<wxString> expected = { wxS( "Net\\ One" ), wxS( "Net\\ Two" ) };
184
185 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
186}
187
188
189BOOST_AUTO_TEST_CASE( ParsesQuotedSpacesInBusGroupMembers )
190{
191 wxString name;
192 std::vector<wxString> members;
193
194 // Quoted member names with spaces should work.
195 // Members are stored with escaped spaces so ForEachBusMember recursion works correctly.
196 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "BUS{\"Net One\" \"Net Two\"}" ), &name, &members ) );
197 BOOST_CHECK_EQUAL( name, wxS( "BUS" ) );
198
199 std::vector<wxString> expected = { wxS( "Net\\ One" ), wxS( "Net\\ Two" ) };
200
201 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
202}
203
204
205BOOST_AUTO_TEST_CASE( ParsesMixedEscapingInBusGroup )
206{
207 wxString name;
208 std::vector<wxString> members;
209
210 // Mix of quoted and backslash-escaped names should work.
211 // Members are stored with escaped spaces so ForEachBusMember recursion works correctly.
212 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "BUS{\"Net One\" Net\\ Two PLAIN}" ), &name, &members ) );
213 BOOST_CHECK_EQUAL( name, wxS( "BUS" ) );
214
215 std::vector<wxString> expected = { wxS( "Net\\ One" ), wxS( "Net\\ Two" ), wxS( "PLAIN" ) };
216
217 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
218}
219
220
221BOOST_AUTO_TEST_CASE( ForEachBusMemberExpandsVectorWithSpacesInGroup )
222{
223 // Test that vector members with spaces inside bus groups are correctly expanded.
224 // This tests the fix for the bug where quoted vector members like "Data Bus"[1..2]
225 // would fail recursive parsing because the quotes were stripped without preserving
226 // space escaping.
227 std::vector<wxString> expandedMembers;
228 auto collector = [&expandedMembers]( const wxString& member )
229 {
230 expandedMembers.push_back( member );
231 };
232
233 // Quoted vector member inside a bus group
234 NET_SETTINGS::ForEachBusMember( wxS( "BUS{\"Data Bus\"[1..2] PLAIN}" ), collector );
235
236 std::vector<wxString> expected = { wxS( "Data Bus1" ), wxS( "Data Bus2" ), wxS( "PLAIN" ) };
237
238 BOOST_CHECK_EQUAL_COLLECTIONS( expandedMembers.begin(), expandedMembers.end(),
239 expected.begin(), expected.end() );
240}
241
242
243BOOST_AUTO_TEST_CASE( ForEachBusMemberExpandsEscapedVectorInGroup )
244{
245 // Test backslash-escaped vector member inside a bus group
246 std::vector<wxString> expandedMembers;
247 auto collector = [&expandedMembers]( const wxString& member )
248 {
249 expandedMembers.push_back( member );
250 };
251
252 NET_SETTINGS::ForEachBusMember( wxS( "BUS{Data\\ Bus[1..2] PLAIN}" ), collector );
253
254 std::vector<wxString> expected = { wxS( "Data Bus1" ), wxS( "Data Bus2" ), wxS( "PLAIN" ) };
255
256 BOOST_CHECK_EQUAL_COLLECTIONS( expandedMembers.begin(), expandedMembers.end(),
257 expected.begin(), expected.end() );
258}
259
260
261BOOST_AUTO_TEST_CASE( ParsesOverbarInVectorBusPrefix )
262{
263 // Overbar formatting in bus vector prefix must be preserved so expanded member
264 // net names match labels on the schematic (issue #22873, #23615).
265 wxString name;
266 std::vector<wxString> members;
267
268 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "bus_~{label}[0..2]" ), &name, &members ) );
269 BOOST_CHECK_EQUAL( name, wxS( "bus_~{label}" ) );
270
271 std::vector<wxString> expected = { wxS( "bus_~{label}0" ), wxS( "bus_~{label}1" ),
272 wxS( "bus_~{label}2" ) };
273
274 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
275}
276
277
278BOOST_AUTO_TEST_CASE( ParsesSuperscriptInVectorBusPrefix )
279{
280 // Superscript formatting in bus vector prefix must be preserved (issue #23615).
281 wxString name;
282 std::vector<wxString> members;
283
284 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "bus_^{label}[0..2]" ), &name, &members ) );
285 BOOST_CHECK_EQUAL( name, wxS( "bus_^{label}" ) );
286
287 std::vector<wxString> expected = { wxS( "bus_^{label}0" ), wxS( "bus_^{label}1" ),
288 wxS( "bus_^{label}2" ) };
289
290 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
291}
292
293
294BOOST_AUTO_TEST_CASE( ParsesSubscriptInVectorBusPrefix )
295{
296 // Subscript formatting in bus vector prefix must be preserved (issue #23615).
297 wxString name;
298 std::vector<wxString> members;
299
300 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "bus__{label}[0..2]" ), &name, &members ) );
301 BOOST_CHECK_EQUAL( name, wxS( "bus__{label}" ) );
302
303 std::vector<wxString> expected = { wxS( "bus__{label}0" ), wxS( "bus__{label}1" ),
304 wxS( "bus__{label}2" ) };
305
306 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
307}
308
309
310BOOST_AUTO_TEST_CASE( ParsesOverbarInGroupBusPrefix )
311{
312 // Overbar formatting in bus group prefix must be preserved so the net prefix
313 // matches labels on the schematic (issue #22873, #23615).
314 wxString name;
315 std::vector<wxString> members;
316
317 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "bus_~{label}{net1 net2}" ), &name, &members ) );
318 BOOST_CHECK_EQUAL( name, wxS( "bus_~{label}" ) );
319
320 std::vector<wxString> expected = { wxS( "net1" ), wxS( "net2" ) };
321
322 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
323}
324
325
326BOOST_AUTO_TEST_CASE( ParsesSuperscriptInGroupBusPrefix )
327{
328 // Superscript formatting in bus group prefix must be preserved (issue #23615).
329 wxString name;
330 std::vector<wxString> members;
331
332 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "bus_^{label}{net1 net2}" ), &name, &members ) );
333 BOOST_CHECK_EQUAL( name, wxS( "bus_^{label}" ) );
334
335 std::vector<wxString> expected = { wxS( "net1" ), wxS( "net2" ) };
336
337 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
338}
339
340
341BOOST_AUTO_TEST_CASE( ParsesSubscriptInGroupBusPrefix )
342{
343 // Subscript formatting in bus group prefix must be preserved (issue #23615).
344 wxString name;
345 std::vector<wxString> members;
346
347 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "bus__{label}{net1 net2}" ), &name, &members ) );
348 BOOST_CHECK_EQUAL( name, wxS( "bus__{label}" ) );
349
350 std::vector<wxString> expected = { wxS( "net1" ), wxS( "net2" ) };
351
352 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
353}
354
355
356BOOST_AUTO_TEST_CASE( ParsesOverbarMembersInBusGroup )
357{
358 // Regression test for issue #23521: inverted (overbar) group bus members
359 // must be preserved as-is so they match the net name on the schematic.
360 // ~{CAS} and CAS are distinct nets; stripping the overbar loses connectivity.
361 wxString name;
362 std::vector<wxString> members;
363
364 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "MEM{~{CAS} ~{RAS} ~{WE} A[2..0]}" ), &name, &members ) );
365 BOOST_CHECK_EQUAL( name, wxS( "MEM" ) );
366
367 std::vector<wxString> expected = { wxS( "~{CAS}" ), wxS( "~{RAS}" ), wxS( "~{WE}" ),
368 wxS( "A[2..0]" ) };
369
370 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
371}
372
373
374BOOST_AUTO_TEST_CASE( ForEachBusMemberExpandsOverbarMembersInGroup )
375{
376 // Verify that overbar group bus members are passed through as net names to the callback,
377 // and that subscript vector members are still correctly expanded.
378 std::vector<wxString> expandedMembers;
379 auto collector = [&expandedMembers]( const wxString& member )
380 {
381 expandedMembers.push_back( member );
382 };
383
384 NET_SETTINGS::ForEachBusMember( wxS( "MEM{~{CAS} ~{RAS} A[0..1]}" ), collector );
385
386 std::vector<wxString> expected = { wxS( "~{CAS}" ), wxS( "~{RAS}" ),
387 wxS( "A0" ), wxS( "A1" ) };
388
389 BOOST_CHECK_EQUAL_COLLECTIONS( expandedMembers.begin(), expandedMembers.end(),
390 expected.begin(), expected.end() );
391}
392
393
394BOOST_AUTO_TEST_CASE( ParsesSuperscriptInBusGroupName )
395{
396 // Regression test for issue #23615. A bus label I^{2}C{SDA SCL} must preserve
397 // the superscript marker in the group name so expanded member net names
398 // (I^{2}C.SDA, I^{2}C.SCL) match labels placed by "Unfold from Bus".
399 wxString name;
400 std::vector<wxString> members;
401
402 BOOST_CHECK( NET_SETTINGS::ParseBusGroup( wxS( "I^{2}C{SDA SCL}" ), &name, &members ) );
403 BOOST_CHECK_EQUAL( name, wxS( "I^{2}C" ) );
404
405 std::vector<wxString> expected = { wxS( "SDA" ), wxS( "SCL" ) };
406
407 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
408}
409
410
411BOOST_AUTO_TEST_CASE( ParsesSuperscriptInBusVectorName )
412{
413 // Superscript in vector bus prefix must be preserved for net name identity.
414 wxString name;
415 std::vector<wxString> members;
416
417 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "I^{2}C[0..1]" ), &name, &members ) );
418 BOOST_CHECK_EQUAL( name, wxS( "I^{2}C" ) );
419
420 std::vector<wxString> expected = { wxS( "I^{2}C0" ), wxS( "I^{2}C1" ) };
421
422 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
423}
424
425
426BOOST_AUTO_TEST_CASE( ForEachBusMemberExpandsSuperscriptGroupBus )
427{
428 // End-to-end test for issue #23615. ForEachBusMember on I^{2}C{SDA SCL}
429 // must produce I^{2}C.SDA and I^{2}C.SCL as member names (with formatting).
430 std::vector<wxString> expandedMembers;
431 auto collector = [&expandedMembers]( const wxString& member )
432 {
433 expandedMembers.push_back( member );
434 };
435
436 NET_SETTINGS::ForEachBusMember( wxS( "I^{2}C{SDA SCL}" ), collector );
437
438 std::vector<wxString> expected = { wxS( "SDA" ), wxS( "SCL" ) };
439
440 BOOST_CHECK_EQUAL_COLLECTIONS( expandedMembers.begin(), expandedMembers.end(),
441 expected.begin(), expected.end() );
442}
443
444
445BOOST_AUTO_TEST_CASE( PrintBusForUIUnescapesBackslashSpaces )
446{
447 // Test that PrintBusForUI converts backslash-escaped spaces to regular spaces (issue #22872)
448
449 // Simple case with backslash-escaped space
450 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "net\\ name" ) ),
451 wxS( "net name" ) );
452
453 // Bus group member with escaped space in prefix
454 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "bus\\ name.net\\ 1" ) ),
455 wxS( "bus name.net 1" ) );
456
457 // Multiple escaped spaces
458 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "my\\ net\\ name" ) ),
459 wxS( "my net name" ) );
460
461 // No escaped spaces (should pass through unchanged)
462 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "simple_net" ) ),
463 wxS( "simple_net" ) );
464}
465
466
467BOOST_AUTO_TEST_CASE( PrintBusForUIHandlesMixedFormatting )
468{
469 // Test that PrintBusForUI handles both super/sub/overbar formatting and escaped spaces
470
471 // Overbar formatting only
472 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "~{reset}" ) ), wxS( "~reset" ) );
473
474 // Both overbar and escaped space
475 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "my\\ ~{signal}" ) ), wxS( "my ~signal" ) );
476}
477
478
479BOOST_AUTO_TEST_CASE( PrintBusForUIUnescapesNetNameTokens )
480{
481 // Regression test for issue #24153: bus member names containing '/' are stored
482 // escaped as "{slash}" (CTX_NETNAME). PrintBusForUI must unescape those tokens
483 // before parsing formatting markup or the '{' opens a phantom overbar group and
484 // the matching '}' gets dropped.
485
486 // Slash plus overbar (R/~{W}): escaped form has the slash token before the overbar.
487 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "R{slash}~{W}" ) ), wxS( "R/~W" ) );
488
489 // Plain slash by itself round-trips to '/'.
490 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "A{slash}B" ) ), wxS( "A/B" ) );
491
492 // Already-unescaped overbar still works (defensive: PrintBusForUI accepts either form).
493 BOOST_CHECK_EQUAL( SCH_CONNECTION::PrintBusForUI( wxS( "R/~{W}" ) ), wxS( "R/~W" ) );
494}
495
496
497BOOST_AUTO_TEST_CASE( ParsesOverbarWrappingNameAndRange )
498{
499 // Regression test for issue #23827: ~{BE[0..3]} where the overbar wraps
500 // both the signal name and the range must produce ~{BE0}, ~{BE1}, etc.
501 wxString name;
502 std::vector<wxString> members;
503
504 BOOST_CHECK( NET_SETTINGS::ParseBusVector( wxS( "~{BE[0..3]}" ), &name, &members ) );
505 BOOST_CHECK_EQUAL( name, wxS( "~{BE" ) );
506
507 std::vector<wxString> expected = { wxS( "~{BE0}" ), wxS( "~{BE1}" ), wxS( "~{BE2}" ), wxS( "~{BE3}" ) };
508
509 BOOST_CHECK_EQUAL_COLLECTIONS( members.begin(), members.end(), expected.begin(), expected.end() );
510}
511
512
const char * name
Calculate the connectivity of a schematic and generate netlists.
static bool ParseBusGroup(const wxString &aGroup, wxString *name, std::vector< wxString > *aMemberList, size_t *aPrefixEnd=nullptr)
Parse a bus group label into the name and a list of components.
static bool ParseBusVector(const wxString &aBus, wxString *aName, std::vector< wxString > *aMemberList)
Parse a bus vector (e.g.
static void ForEachBusMember(const wxString &aBusPattern, const std::function< void(const wxString &)> &aFunction)
Call a function for each member of an expanded bus pattern.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
void ConfigureFromLabel(const wxString &aLabel)
Configures the connection given a label.
wxString LocalName() const
wxString Name(bool aIgnoreSheet=false) const
const std::vector< std::shared_ptr< SCH_CONNECTION > > & Members() const
static wxString PrintBusForUI(const wxString &aString)
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_CASE(EscapedVectorMembersMatchScalarConnections)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_CHECK_EQUAL_COLLECTIONS(mixed.begin(), mixed.end(), expMixed.begin(), expMixed.end())
BOOST_AUTO_TEST_SUITE_END()
VECTOR3I expected(15, 30, 45)
BOOST_CHECK_EQUAL(result, "25.4")