KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_issue24314_power_flag_designators.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, see <https://www.gnu.org/licenses/>.
18 */
19
21
22#include <refdes_tracker.h>
23
24
25BOOST_AUTO_TEST_SUITE( Issue24314_PowerFlagDesignators )
26
27
28BOOST_AUTO_TEST_CASE( InsertPowerFlagRefDes )
29{
30 REFDES_TRACKER tracker;
31
32 BOOST_CHECK( tracker.Insert( "#PWR304" ) );
33 BOOST_CHECK( tracker.Contains( "#PWR304" ) );
34 BOOST_CHECK( !tracker.Insert( "#PWR304" ) );
35
36 BOOST_CHECK( tracker.Insert( "#PWR305" ) );
37 BOOST_CHECK( tracker.Contains( "#PWR305" ) );
38}
39
40
41BOOST_AUTO_TEST_CASE( SerializeRoundTripIncludesPowerFlags )
42{
43 REFDES_TRACKER tracker;
44
45 tracker.Insert( "C254" );
46 tracker.Insert( "C257" );
47 tracker.Insert( "C258" );
48 tracker.Insert( "#PWR304" );
49
50 const std::string serialized = tracker.Serialize();
51
52 BOOST_CHECK( serialized.find( "C254" ) != std::string::npos );
53 BOOST_CHECK( serialized.find( "#PWR304" ) != std::string::npos );
54
55 REFDES_TRACKER tracker2;
56 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
57
58 BOOST_CHECK( tracker2.Contains( "C254" ) );
59 BOOST_CHECK( tracker2.Contains( "C257" ) );
60 BOOST_CHECK( tracker2.Contains( "C258" ) );
61 BOOST_CHECK( tracker2.Contains( "#PWR304" ) );
62
63 REFDES_TRACKER tracker3;
64 BOOST_REQUIRE( tracker3.Deserialize( tracker2.Serialize() ) );
65 BOOST_CHECK_EQUAL( tracker3.Serialize(), serialized );
66 BOOST_CHECK_EQUAL( tracker3.Size(), tracker.Size() );
67 BOOST_CHECK( tracker3.Contains( "C254" ) );
68 BOOST_CHECK( tracker3.Contains( "C257" ) );
69 BOOST_CHECK( tracker3.Contains( "C258" ) );
70 BOOST_CHECK( tracker3.Contains( "#PWR304" ) );
71}
72
73
74BOOST_AUTO_TEST_CASE( SerializationIsSortedAndStable )
75{
76 REFDES_TRACKER tracker;
77
78 tracker.Insert( "R2" );
79 tracker.Insert( "C3" );
80 tracker.Insert( "#PWR1" );
81 tracker.Insert( "C1" );
82 tracker.Insert( "TP" );
83 tracker.Insert( "C2" );
84
85 BOOST_CHECK_EQUAL( tracker.Serialize(), "#PWR1,C1-3,R2,TP" );
86
87 REFDES_TRACKER tracker2;
88 BOOST_REQUIRE( tracker2.Deserialize( "TP,C1-3,#PWR1,R2" ) );
89 BOOST_CHECK_EQUAL( tracker2.Serialize(), tracker.Serialize() );
90}
91
92
93BOOST_AUTO_TEST_CASE( SinglePowerFlagSurvivesRoundTrip )
94{
95 REFDES_TRACKER tracker;
96 tracker.Insert( "#FLG1" );
97
98 const std::string serialized = tracker.Serialize();
99 BOOST_CHECK( !serialized.empty() );
100
101 REFDES_TRACKER tracker2;
102 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
103
104 BOOST_CHECK_EQUAL( tracker2.Size(), 1u );
105 BOOST_CHECK( tracker2.Contains( "#FLG1" ) );
106}
107
108
109// Power-flag entries emitted by pre-fix KiCad 10.0.x appeared as prefix-only
110// tokens because parseRefDes stored "#PWR304" under an empty-number key.
111BOOST_AUTO_TEST_CASE( DeserializeLegacyPrefixOnlyPowerFlag )
112{
113 REFDES_TRACKER tracker;
114
115 BOOST_REQUIRE( tracker.Deserialize( "C254,C257-258,#PWR304" ) );
116
117 BOOST_CHECK( tracker.Contains( "C254" ) );
118 BOOST_CHECK( tracker.Contains( "C257" ) );
119 BOOST_CHECK( tracker.Contains( "C258" ) );
120 BOOST_CHECK( tracker.Contains( "#PWR304" ) );
121}
122
123
124BOOST_AUTO_TEST_CASE( PrefixContainingDigitRoundTrips )
125{
126 REFDES_TRACKER tracker;
127 BOOST_REQUIRE( tracker.Insert( "U1U2" ) );
128 BOOST_REQUIRE( tracker.Insert( "U1U3" ) );
129
130 const std::string serialized = tracker.Serialize();
131 BOOST_CHECK( !serialized.empty() );
132
133 REFDES_TRACKER tracker2;
134 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
135
136 BOOST_CHECK( tracker2.Contains( "U1U2" ) );
137 BOOST_CHECK( tracker2.Contains( "U1U3" ) );
138}
139
140
141// Pure-numeric input has no non-digit prefix; parseRefDes must store it as a
142// prefix-only entry rather than colliding under an empty key.
143BOOST_AUTO_TEST_CASE( PureNumericRefDesRoundTrips )
144{
145 REFDES_TRACKER tracker;
146 BOOST_REQUIRE( tracker.Insert( "304" ) );
147 BOOST_CHECK( tracker.Contains( "304" ) );
148
149 const std::string serialized = tracker.Serialize();
150 BOOST_CHECK( !serialized.empty() );
151
152 REFDES_TRACKER tracker2;
153 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
154 BOOST_CHECK( tracker2.Contains( "304" ) );
155}
156
157
158// QA builds install wxAssertThrower around the load path, so a throw from the
159// numeric parser would abort the project load.
160BOOST_AUTO_TEST_CASE( OverflowNumberFailsCleanly )
161{
162 REFDES_TRACKER tracker;
163 BOOST_CHECK( !tracker.Deserialize( "R99999999999999999999" ) );
164 BOOST_CHECK_EQUAL( tracker.Size(), 0u );
165}
166
167
Class to efficiently track reference designators and provide next available designators.
bool Deserialize(const std::string &aData)
Deserialize tracker data from string representation.
bool Insert(const std::string &aRefDes)
Insert a reference designator into the tracker.
size_t Size() const
Get the total count of stored reference designators.
std::string Serialize() const
Serialize the tracker data to a compact string representation.
bool Contains(const std::string &aRefDes) const
Check if a reference designator exists in the tracker.
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(InsertPowerFlagRefDes)
BOOST_CHECK_EQUAL(result, "25.4")