KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_flat_hierarchy.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
23#include <boost/test/unit_test.hpp>
24#include <eeschema_test_utils.h>
25
26#include <sch_sheet.h>
27#include <sch_screen.h>
28#include <schematic.h>
29#include <project.h>
32
33
35{
38 {
39 m_settingsManager.LoadProject( "" );
40 m_schematic = std::make_unique<SCHEMATIC>( nullptr );
42 m_schematic->SetProject( m_project );
43 }
44
46 {
47 m_schematic.reset();
48 }
49
51 std::unique_ptr<SCHEMATIC> m_schematic;
53};
54
55
56BOOST_FIXTURE_TEST_SUITE( FlatHierarchy, FLAT_HIERARCHY_FIXTURE )
57
58
59
62BOOST_AUTO_TEST_CASE( TestCreateDefaultScreens )
63{
64 m_schematic->CreateDefaultScreens();
65
66 // Check that we have a valid root
67 BOOST_CHECK( m_schematic->IsValid() );
68
69 // Check that root has a screen (virtual root now has a screen to hold top-level sheets)
70 SCH_SHEET& root = m_schematic->Root();
71 BOOST_CHECK( root.GetScreen() != nullptr );
72
73 // Check that root UUID is niluuid
74 BOOST_CHECK( root.m_Uuid == niluuid );
75
76 // Check that we have one top-level sheet
77 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
78 BOOST_CHECK_EQUAL( topLevelSheets.size(), 1 );
79
80 // Check that the top-level sheet has a screen
81 if( !topLevelSheets.empty() && topLevelSheets[0] )
82 {
83 BOOST_CHECK( topLevelSheets[0]->GetScreen() != nullptr );
84 }
85
86 // Check that the top-level sheet is in the virtual root's screen
87 if( root.GetScreen() )
88 {
89 std::vector<SCH_ITEM*> items;
90 root.GetScreen()->GetSheets( &items );
91 BOOST_CHECK_EQUAL( items.size(), 1 );
92 }
93}
94
95
99BOOST_AUTO_TEST_CASE( TestAddTopLevelSheets )
100{
101 m_schematic->CreateDefaultScreens();
102
103 // Create and add a second top-level sheet
104 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
105 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
106 sheet2->SetScreen( screen2 );
107 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
108 screen2->SetFileName( "sheet2.kicad_sch" );
109 screen2->SetPageNumber( "2" );
110
111 m_schematic->AddTopLevelSheet( sheet2 );
112
113 // Check that we now have two top-level sheets
114 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
115 BOOST_CHECK_EQUAL( topLevelSheets.size(), 2 );
116
117 // Check that both are recognized as top-level
118 BOOST_CHECK( m_schematic->IsTopLevelSheet( topLevelSheets[0] ) );
119 BOOST_CHECK( m_schematic->IsTopLevelSheet( topLevelSheets[1] ) );
120
121 // Create and add a third top-level sheet
122 SCH_SHEET* sheet3 = new SCH_SHEET( m_schematic.get() );
123 SCH_SCREEN* screen3 = new SCH_SCREEN( m_schematic.get() );
124 sheet3->SetScreen( screen3 );
125 sheet3->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet3" );
126 screen3->SetFileName( "sheet3.kicad_sch" );
127 screen3->SetPageNumber( "3" );
128
129 m_schematic->AddTopLevelSheet( sheet3 );
130
131 topLevelSheets = m_schematic->GetTopLevelSheets();
132 BOOST_CHECK_EQUAL( topLevelSheets.size(), 3 );
133}
134
135
139BOOST_AUTO_TEST_CASE( TestRemoveTopLevelSheet )
140{
141 m_schematic->CreateDefaultScreens();
142
143 // Add two more sheets
144 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
145 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
146 sheet2->SetScreen( screen2 );
147 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
148 m_schematic->AddTopLevelSheet( sheet2 );
149
150 SCH_SHEET* sheet3 = new SCH_SHEET( m_schematic.get() );
151 SCH_SCREEN* screen3 = new SCH_SCREEN( m_schematic.get() );
152 sheet3->SetScreen( screen3 );
153 sheet3->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet3" );
154 m_schematic->AddTopLevelSheet( sheet3 );
155
156 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
157 BOOST_CHECK_EQUAL( topLevelSheets.size(), 3 );
158
159 // Remove the second sheet
160 bool removed = m_schematic->RemoveTopLevelSheet( sheet2 );
161 BOOST_CHECK( removed );
162
163 topLevelSheets = m_schematic->GetTopLevelSheets();
164 BOOST_CHECK_EQUAL( topLevelSheets.size(), 2 );
165
166 // Try to remove it again (should fail)
167 removed = m_schematic->RemoveTopLevelSheet( sheet2 );
168 BOOST_CHECK( !removed );
169}
170
171
175BOOST_AUTO_TEST_CASE( TestBuildSheetList )
176{
177 m_schematic->CreateDefaultScreens();
178
179 // Add a second top-level sheet
180 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
181 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
182 sheet2->SetScreen( screen2 );
183 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
184 screen2->SetFileName( "sheet2.kicad_sch" );
185 screen2->SetPageNumber( "2" );
186 m_schematic->AddTopLevelSheet( sheet2 );
187
188 // Build sheet list
189 SCH_SHEET_LIST sheetList = m_schematic->BuildSheetListSortedByPageNumbers();
190
191 // Should have two sheets
192 BOOST_CHECK_EQUAL( sheetList.size(), 2 );
193
194 // Check unordered list
195 SCH_SHEET_LIST unorderedList = m_schematic->BuildUnorderedSheetList();
196 BOOST_CHECK_EQUAL( unorderedList.size(), 2 );
197}
198
199
203BOOST_AUTO_TEST_CASE( TestProjectFileSerialization )
204{
205 // Create a project file
206 wxString projectPath = wxT( "/tmp/test_project.kicad_pro" );
207 PROJECT_FILE projectFile( projectPath );
208
209 // Add some top-level sheet info
210 std::vector<TOP_LEVEL_SHEET_INFO>& topLevelSheets = projectFile.GetTopLevelSheets();
211
212 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
213 KIID(),
214 wxT( "Main Sheet" ),
215 wxT( "main.kicad_sch" ) ) );
216
217 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
218 KIID(),
219 wxT( "Power Sheet" ),
220 wxT( "power.kicad_sch" ) ) );
221
222 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
223 KIID(),
224 wxT( "Interface Sheet" ),
225 wxT( "interface.kicad_sch" ) ) );
226
227 // Verify we have 3 entries
228 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets().size(), 3 );
229
230 // Check that they have the expected data
231 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[0].name.ToStdString(), "Main Sheet" );
232 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[1].name.ToStdString(), "Power Sheet" );
233 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[2].name.ToStdString(), "Interface Sheet" );
234
235 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[0].filename.ToStdString(), "main.kicad_sch" );
236 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[1].filename.ToStdString(), "power.kicad_sch" );
237 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[2].filename.ToStdString(), "interface.kicad_sch" );
238}
239
240
245/*
246BOOST_AUTO_TEST_CASE( TestHierarchyWithMultipleTopLevelSheets )
247{
248 m_schematic->CreateDefaultScreens();
249
250 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
251 SCH_SHEET* sheet1 = topLevelSheets[0];
252
253 // Add a hierarchical subsheet to sheet1
254 SCH_SHEET* subsheet = new SCH_SHEET( sheet1 );
255 SCH_SCREEN* subscreen = new SCH_SCREEN( m_schematic.get() );
256 subsheet->SetScreen( subscreen );
257 subsheet->GetField( FIELD_T::SHEET_NAME )->SetText( "Subsheet" );
258 subscreen->SetFileName( "subsheet_unique.kicad_sch" ); // Use unique filename
259 subscreen->SetPageNumber( "1.1" );
260
261 // Add subsheet to sheet1's screen
262 sheet1->GetScreen()->Append( subsheet );
263
264 // Add a second top-level sheet
265 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
266 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
267 sheet2->SetScreen( screen2 );
268 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
269 screen2->SetFileName( "sheet2.kicad_sch" );
270 screen2->SetPageNumber( "2" );
271 m_schematic->AddTopLevelSheet( sheet2 );
272
273 // Build hierarchy - use the BuildSheetListSortedByPageNumbers which iterates all top-level sheets
274 SCH_SHEET_LIST hierarchy = m_schematic->BuildSheetListSortedByPageNumbers();
275
276 // Should have 3 sheets total: sheet1, subsheet, sheet2
277 BOOST_CHECK_EQUAL( hierarchy.size(), 3 );
278}
279*/
280
281
285BOOST_AUTO_TEST_CASE( TestRootScreen )
286{
287 m_schematic->CreateDefaultScreens();
288
289 // Get the root screen
290 SCH_SCREEN* rootScreen = m_schematic->RootScreen();
291 BOOST_CHECK( rootScreen != nullptr );
292
293 // It should be the screen of the first top-level sheet
294 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
295 BOOST_CHECK( !topLevelSheets.empty() );
296
297 if( !topLevelSheets.empty() && topLevelSheets[0] )
298 {
299 BOOST_CHECK_EQUAL( rootScreen, topLevelSheets[0]->GetScreen() );
300 }
301}
302
303
void SetPageNumber(const wxString &aPageNumber)
Definition base_screen.h:75
const KIID m_Uuid
Definition eda_item.h:531
Definition kiid.h:44
The backing store for a PROJECT, in JSON format.
std::vector< TOP_LEVEL_SHEET_INFO > & GetTopLevelSheets()
Container for project specific data.
Definition project.h:62
void SetText(const wxString &aText) override
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
void GetSheets(std::vector< SCH_ITEM * > *aItems) const
Similar to Items().OfType( SCH_SHEET_T ), but return the sheets in a deterministic order (L-R,...
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:44
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
SCH_SCREEN * GetScreen() const
Definition sch_sheet.h:139
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
KIID niluuid(0)
Test flat top-level schematic sheets functionality.
SETTINGS_MANAGER m_settingsManager
std::unique_ptr< SCHEMATIC > m_schematic
Information about a top-level schematic sheet.
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_CASE(TestCreateDefaultScreens)
Test that CreateDefaultScreens creates a virtual root with one top-level sheet.
BOOST_AUTO_TEST_SUITE_END()
BOOST_CHECK_EQUAL(result, "25.4")