44#include <wx/filename.h>
45#include <wx/stdpaths.h>
56const wxString CHAIN_1 = wxS(
"CHAIN_1" );
57const wxString CHAIN_2 = wxS(
"CHAIN_2" );
58const wxString CHAIN_1_NETCLASS = wxS(
"CHAIN_NC_1" );
59const wxString CHAIN_2_NETCLASS = wxS(
"CHAIN_NC_2" );
61const std::vector<wxString> CHAIN_1_NETS = { wxS(
"Net-(R1-Pad1)" ), wxS(
"Net-(R1-Pad2)" ),
62 wxS(
"Net-(R2-Pad2)" ) };
63const std::vector<wxString> CHAIN_2_NETS = { wxS(
"Net-(R3-Pad1)" ), wxS(
"Net-(R3-Pad2)" ),
64 wxS(
"Net-(R4-Pad2)" ) };
68const wxString
LABEL_NET = wxS(
"Net-(R5-Pad1)" );
69const wxString LABEL_NETCLASS = wxS(
"NC_3" );
75 m_dir( wxS(
"kicad-qa-issue25065" ) )
80 wxString sep = wxFileName::GetPathSeparator();
82 m_boardPath = m_dir.PathStr() + sep + wxS(
"issue25065.kicad_pcb" );
83 m_projectPath = m_dir.PathStr() + sep + wxS(
"issue25065.kicad_pro" );
85 BOOST_REQUIRE( wxCopyFile( srcDir + wxS(
"issue25065.kicad_pcb" ), m_boardPath ) );
86 BOOST_REQUIRE( wxCopyFile( srcDir + wxS(
"issue25065.kicad_pro" ), m_projectPath ) );
102 m_board->SetProject( &m_manager.Prj() );
103 m_board->BuildListOfNets();
107 void SaveAndReopenBoard()
116 void UpdateFromNetlist(
const NETLIST& aNetlist )
120 m_board->SynchronizeNetsAndNetClasses(
true );
123 NET_SETTINGS& NetSettings()
const {
return *m_board->GetDesignSettings().m_NetSettings; }
126 wxString ResolvedNetclass(
const wxString& aNetname )
const
128 NETINFO_ITEM* net = m_board->FindNet( aNetname );
133 bool ResolvesTo(
const wxString& aNetname,
const wxString& aNetclass )
const
135 NETINFO_ITEM* net = m_board->FindNet( aNetname );
136 BOOST_REQUIRE_MESSAGE( net,
"net " << aNetname <<
" missing from the board" );
145 m_board->SetProject(
nullptr );
149 m_manager.UnloadProject( &m_manager.Prj(),
false );
152 SETTINGS_MANAGER m_manager;
153 std::unique_ptr<BOARD> m_board;
154 KI_TEST::SCOPED_TEMP_DIR m_dir;
155 wxString m_boardPath;
156 wxString m_projectPath;
162void AddChain(
NETLIST& aNetlist,
const wxString& aChain,
const wxString& aNetclass,
163 const std::vector<wxString>& aNets )
167 for(
const wxString& net : aNets )
182 BOOST_REQUIRE_MESSAGE( ResolvesTo(
LABEL_NET, LABEL_NETCLASS ),
186 AddChain(
netlist, CHAIN_1, CHAIN_1_NETCLASS, CHAIN_1_NETS );
187 AddChain(
netlist, CHAIN_2, CHAIN_2_NETCLASS, CHAIN_2_NETS );
191 for(
const wxString& net : CHAIN_1_NETS )
193 BOOST_REQUIRE_MESSAGE( ResolvesTo( net, CHAIN_1_NETCLASS ),
194 net <<
" resolved to " << ResolvedNetclass( net )
195 <<
" straight after the netlist update" );
198 SaveAndReopenBoard();
200 for(
const wxString& net : CHAIN_1_NETS )
202 BOOST_CHECK_MESSAGE( ResolvesTo( net, CHAIN_1_NETCLASS ),
203 net <<
" resolved to " << ResolvedNetclass( net ) <<
" after reload" );
206 for(
const wxString& net : CHAIN_2_NETS )
208 BOOST_CHECK_MESSAGE( ResolvesTo( net, CHAIN_2_NETCLASS ),
209 net <<
" resolved to " << ResolvedNetclass( net ) <<
" after reload" );
212 BOOST_CHECK_MESSAGE( ResolvesTo(
LABEL_NET, LABEL_NETCLASS ),
214 <<
" after reload" );
217 BOOST_CHECK( !ResolvesTo( wxS(
"Net-(R6-Pad2)" ), CHAIN_1_NETCLASS ) );
228 AddChain(
netlist, CHAIN_1, CHAIN_1_NETCLASS, CHAIN_1_NETS );
229 AddChain(
netlist, CHAIN_2, CHAIN_2_NETCLASS, CHAIN_2_NETS );
232 SaveAndReopenBoard();
233 BOOST_REQUIRE( ResolvesTo( CHAIN_1_NETS[0], CHAIN_1_NETCLASS ) );
236 AddChain( withoutChain1, CHAIN_2, CHAIN_2_NETCLASS, CHAIN_2_NETS );
238 UpdateFromNetlist( withoutChain1 );
240 BOOST_CHECK( NetSettings().GetNetChainNetClass( CHAIN_1 ).IsEmpty() );
241 BOOST_CHECK_MESSAGE( !ResolvesTo( CHAIN_1_NETS[0], CHAIN_1_NETCLASS ),
242 CHAIN_1_NETS[0] <<
" still resolved to "
243 << ResolvedNetclass( CHAIN_1_NETS[0] ) );
244 BOOST_CHECK( ResolvesTo( CHAIN_2_NETS[0], CHAIN_2_NETCLASS ) );
248 SaveAndReopenBoard();
250 BOOST_CHECK( !ResolvesTo( CHAIN_1_NETS[0], CHAIN_1_NETCLASS ) );
251 BOOST_CHECK( ResolvesTo( CHAIN_2_NETS[0], CHAIN_2_NETCLASS ) );
General utilities for PCB file IO for QA programs.
static void ApplyChainAssignments(BOARD *aBoard, const NETLIST &aNetlist, REPORTER *aReporter, bool aDryRun)
Apply the netlist's chain assignments to every NETINFO_ITEM on the board.
static void ApplyChainNetclasses(BOARD *aBoard, const NETLIST &aNetlist)
Mirror the netlist's chain-to-class and chain-to-netclass maps into the project's NET_SETTINGS.
const wxString GetHumanReadableName() const
Gets the consolidated name of this netclass (which may be an aggregate).
bool ContainsNetclassWithName(const wxString &netclass) const
Determines if the given netclass name is a constituent of this (maybe aggregate) netclass.
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
void SetSignalNetClass(const wxString &aNetChain, const wxString &aNetClass)
void SetNetChainFor(const wxString &aNet, const wxString &aNetChain)
std::string GetPcbnewTestDataDir()
Utility which returns a path to the data directory where the test board files are stored.
std::unique_ptr< BOARD > ReadBoardFromFileOrStream(const std::string &aFilename, std::istream &aFallback)
Read a board from a file, or another stream, as appropriate.
void closeBoard(KICAD_API_SERVER *aServer)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
BOOST_FIXTURE_TEST_CASE(ChainNetclassSurvivesReload, FIXTURE)