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 // Prefix order in m_prefixData is unordered_map iteration order, so verify
64 // round-trip stability by content rather than by string compare.
65 REFDES_TRACKER tracker3;
66 BOOST_REQUIRE( tracker3.Deserialize( tracker2.Serialize() ) );
67 BOOST_CHECK_EQUAL( tracker3.Size(), tracker.Size() );
68 BOOST_CHECK( tracker3.Contains( "C254" ) );
69 BOOST_CHECK( tracker3.Contains( "C257" ) );
70 BOOST_CHECK( tracker3.Contains( "C258" ) );
71 BOOST_CHECK( tracker3.Contains( "#PWR304" ) );
72}
73
74
75BOOST_AUTO_TEST_CASE( SinglePowerFlagSurvivesRoundTrip )
76{
77 REFDES_TRACKER tracker;
78 tracker.Insert( "#FLG1" );
79
80 const std::string serialized = tracker.Serialize();
81 BOOST_CHECK( !serialized.empty() );
82
83 REFDES_TRACKER tracker2;
84 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
85
86 BOOST_CHECK_EQUAL( tracker2.Size(), 1u );
87 BOOST_CHECK( tracker2.Contains( "#FLG1" ) );
88}
89
90
91// Power-flag entries emitted by pre-fix KiCad 10.0.x appeared as prefix-only
92// tokens because parseRefDes stored "#PWR304" under an empty-number key.
93BOOST_AUTO_TEST_CASE( DeserializeLegacyPrefixOnlyPowerFlag )
94{
95 REFDES_TRACKER tracker;
96
97 BOOST_REQUIRE( tracker.Deserialize( "C254,C257-258,#PWR304" ) );
98
99 BOOST_CHECK( tracker.Contains( "C254" ) );
100 BOOST_CHECK( tracker.Contains( "C257" ) );
101 BOOST_CHECK( tracker.Contains( "C258" ) );
102 BOOST_CHECK( tracker.Contains( "#PWR304" ) );
103}
104
105
106BOOST_AUTO_TEST_CASE( PrefixContainingDigitRoundTrips )
107{
108 REFDES_TRACKER tracker;
109 BOOST_REQUIRE( tracker.Insert( "U1U2" ) );
110 BOOST_REQUIRE( tracker.Insert( "U1U3" ) );
111
112 const std::string serialized = tracker.Serialize();
113 BOOST_CHECK( !serialized.empty() );
114
115 REFDES_TRACKER tracker2;
116 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
117
118 BOOST_CHECK( tracker2.Contains( "U1U2" ) );
119 BOOST_CHECK( tracker2.Contains( "U1U3" ) );
120}
121
122
123// Pure-numeric input has no non-digit prefix; parseRefDes must store it as a
124// prefix-only entry rather than colliding under an empty key.
125BOOST_AUTO_TEST_CASE( PureNumericRefDesRoundTrips )
126{
127 REFDES_TRACKER tracker;
128 BOOST_REQUIRE( tracker.Insert( "304" ) );
129 BOOST_CHECK( tracker.Contains( "304" ) );
130
131 const std::string serialized = tracker.Serialize();
132 BOOST_CHECK( !serialized.empty() );
133
134 REFDES_TRACKER tracker2;
135 BOOST_REQUIRE( tracker2.Deserialize( serialized ) );
136 BOOST_CHECK( tracker2.Contains( "304" ) );
137}
138
139
140// QA builds install wxAssertThrower around the load path, so a throw from the
141// numeric parser would abort the project load.
142BOOST_AUTO_TEST_CASE( OverflowNumberFailsCleanly )
143{
144 REFDES_TRACKER tracker;
145 BOOST_CHECK( !tracker.Deserialize( "R99999999999999999999" ) );
146 BOOST_CHECK_EQUAL( tracker.Size(), 0u );
147}
148
149
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")