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, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
27#include <boost/test/unit_test.hpp>
28#include <eeschema_test_utils.h>
29
30#include <sch_sheet.h>
31#include <sch_screen.h>
32#include <schematic.h>
33#include <project.h>
36
37
39{
42 {
43 m_settingsManager.LoadProject( "" );
44 m_schematic = std::make_unique<SCHEMATIC>( nullptr );
46 m_schematic->SetProject( m_project );
47 }
48
50 {
51 m_schematic.reset();
52 }
53
55 std::unique_ptr<SCHEMATIC> m_schematic;
57};
58
59
60BOOST_FIXTURE_TEST_SUITE( FlatHierarchy, FLAT_HIERARCHY_FIXTURE )
61
62
63
66BOOST_AUTO_TEST_CASE( TestCreateDefaultScreens )
67{
68 m_schematic->CreateDefaultScreens();
69
70 // Check that we have a valid root
71 BOOST_CHECK( m_schematic->IsValid() );
72
73 // Check that root has a screen (virtual root now has a screen to hold top-level sheets)
74 SCH_SHEET& root = m_schematic->Root();
75 BOOST_CHECK( root.GetScreen() != nullptr );
76
77 // Check that root UUID is niluuid
78 BOOST_CHECK( root.m_Uuid == niluuid );
79
80 // Check that we have one top-level sheet
81 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
82 BOOST_CHECK_EQUAL( topLevelSheets.size(), 1 );
83
84 // Check that the top-level sheet has a screen
85 if( !topLevelSheets.empty() && topLevelSheets[0] )
86 {
87 BOOST_CHECK( topLevelSheets[0]->GetScreen() != nullptr );
88 }
89
90 // Check that the top-level sheet is in the virtual root's screen
91 if( root.GetScreen() )
92 {
93 std::vector<SCH_ITEM*> items;
94 root.GetScreen()->GetSheets( &items );
95 BOOST_CHECK_EQUAL( items.size(), 1 );
96 }
97}
98
99
103BOOST_AUTO_TEST_CASE( TestAddTopLevelSheets )
104{
105 m_schematic->CreateDefaultScreens();
106
107 // Create and add a second top-level sheet
108 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
109 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
110 sheet2->SetScreen( screen2 );
111 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
112 screen2->SetFileName( "sheet2.kicad_sch" );
113 screen2->SetPageNumber( "2" );
114
115 m_schematic->AddTopLevelSheet( sheet2 );
116
117 // Check that we now have two top-level sheets
118 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
119 BOOST_CHECK_EQUAL( topLevelSheets.size(), 2 );
120
121 // Check that both are recognized as top-level
122 BOOST_CHECK( m_schematic->IsTopLevelSheet( topLevelSheets[0] ) );
123 BOOST_CHECK( m_schematic->IsTopLevelSheet( topLevelSheets[1] ) );
124
125 // Create and add a third top-level sheet
126 SCH_SHEET* sheet3 = new SCH_SHEET( m_schematic.get() );
127 SCH_SCREEN* screen3 = new SCH_SCREEN( m_schematic.get() );
128 sheet3->SetScreen( screen3 );
129 sheet3->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet3" );
130 screen3->SetFileName( "sheet3.kicad_sch" );
131 screen3->SetPageNumber( "3" );
132
133 m_schematic->AddTopLevelSheet( sheet3 );
134
135 topLevelSheets = m_schematic->GetTopLevelSheets();
136 BOOST_CHECK_EQUAL( topLevelSheets.size(), 3 );
137}
138
139
143BOOST_AUTO_TEST_CASE( TestRemoveTopLevelSheet )
144{
145 m_schematic->CreateDefaultScreens();
146
147 // Add two more sheets
148 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
149 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
150 sheet2->SetScreen( screen2 );
151 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
152 m_schematic->AddTopLevelSheet( sheet2 );
153
154 SCH_SHEET* sheet3 = new SCH_SHEET( m_schematic.get() );
155 SCH_SCREEN* screen3 = new SCH_SCREEN( m_schematic.get() );
156 sheet3->SetScreen( screen3 );
157 sheet3->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet3" );
158 m_schematic->AddTopLevelSheet( sheet3 );
159
160 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
161 BOOST_CHECK_EQUAL( topLevelSheets.size(), 3 );
162
163 // Remove the second sheet
164 bool removed = m_schematic->RemoveTopLevelSheet( sheet2 );
165 BOOST_CHECK( removed );
166
167 topLevelSheets = m_schematic->GetTopLevelSheets();
168 BOOST_CHECK_EQUAL( topLevelSheets.size(), 2 );
169
170 // Try to remove it again (should fail)
171 removed = m_schematic->RemoveTopLevelSheet( sheet2 );
172 BOOST_CHECK( !removed );
173}
174
175
179BOOST_AUTO_TEST_CASE( TestBuildSheetList )
180{
181 m_schematic->CreateDefaultScreens();
182
183 // Add a second top-level sheet
184 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
185 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
186 sheet2->SetScreen( screen2 );
187 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
188 screen2->SetFileName( "sheet2.kicad_sch" );
189 screen2->SetPageNumber( "2" );
190 m_schematic->AddTopLevelSheet( sheet2 );
191
192 // Build sheet list
193 SCH_SHEET_LIST sheetList = m_schematic->BuildSheetListSortedByPageNumbers();
194
195 // Should have two sheets
196 BOOST_CHECK_EQUAL( sheetList.size(), 2 );
197
198 // Check unordered list
199 SCH_SHEET_LIST unorderedList = m_schematic->BuildUnorderedSheetList();
200 BOOST_CHECK_EQUAL( unorderedList.size(), 2 );
201}
202
203
207BOOST_AUTO_TEST_CASE( TestProjectFileSerialization )
208{
209 // Create a project file
210 wxString projectPath = wxT( "/tmp/test_project.kicad_pro" );
211 PROJECT_FILE projectFile( projectPath );
212
213 // Add some top-level sheet info
214 std::vector<TOP_LEVEL_SHEET_INFO>& topLevelSheets = projectFile.GetTopLevelSheets();
215
216 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
217 KIID(),
218 wxT( "Main Sheet" ),
219 wxT( "main.kicad_sch" ) ) );
220
221 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
222 KIID(),
223 wxT( "Power Sheet" ),
224 wxT( "power.kicad_sch" ) ) );
225
226 topLevelSheets.push_back( TOP_LEVEL_SHEET_INFO(
227 KIID(),
228 wxT( "Interface Sheet" ),
229 wxT( "interface.kicad_sch" ) ) );
230
231 // Verify we have 3 entries
232 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets().size(), 3 );
233
234 // Check that they have the expected data
235 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[0].name.ToStdString(), "Main Sheet" );
236 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[1].name.ToStdString(), "Power Sheet" );
237 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[2].name.ToStdString(), "Interface Sheet" );
238
239 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[0].filename.ToStdString(), "main.kicad_sch" );
240 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[1].filename.ToStdString(), "power.kicad_sch" );
241 BOOST_CHECK_EQUAL( projectFile.GetTopLevelSheets()[2].filename.ToStdString(), "interface.kicad_sch" );
242}
243
244
249/*
250BOOST_AUTO_TEST_CASE( TestHierarchyWithMultipleTopLevelSheets )
251{
252 m_schematic->CreateDefaultScreens();
253
254 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
255 SCH_SHEET* sheet1 = topLevelSheets[0];
256
257 // Add a hierarchical subsheet to sheet1
258 SCH_SHEET* subsheet = new SCH_SHEET( sheet1 );
259 SCH_SCREEN* subscreen = new SCH_SCREEN( m_schematic.get() );
260 subsheet->SetScreen( subscreen );
261 subsheet->GetField( FIELD_T::SHEET_NAME )->SetText( "Subsheet" );
262 subscreen->SetFileName( "subsheet_unique.kicad_sch" ); // Use unique filename
263 subscreen->SetPageNumber( "1.1" );
264
265 // Add subsheet to sheet1's screen
266 sheet1->GetScreen()->Append( subsheet );
267
268 // Add a second top-level sheet
269 SCH_SHEET* sheet2 = new SCH_SHEET( m_schematic.get() );
270 SCH_SCREEN* screen2 = new SCH_SCREEN( m_schematic.get() );
271 sheet2->SetScreen( screen2 );
272 sheet2->GetField( FIELD_T::SHEET_NAME )->SetText( "Sheet2" );
273 screen2->SetFileName( "sheet2.kicad_sch" );
274 screen2->SetPageNumber( "2" );
275 m_schematic->AddTopLevelSheet( sheet2 );
276
277 // Build hierarchy - use the BuildSheetListSortedByPageNumbers which iterates all top-level sheets
278 SCH_SHEET_LIST hierarchy = m_schematic->BuildSheetListSortedByPageNumbers();
279
280 // Should have 3 sheets total: sheet1, subsheet, sheet2
281 BOOST_CHECK_EQUAL( hierarchy.size(), 3 );
282}
283*/
284
285
289BOOST_AUTO_TEST_CASE( TestRootScreen )
290{
291 m_schematic->CreateDefaultScreens();
292
293 // Get the root screen
294 SCH_SCREEN* rootScreen = m_schematic->RootScreen();
295 BOOST_CHECK( rootScreen != nullptr );
296
297 // It should be the screen of the first top-level sheet
298 std::vector<SCH_SHEET*> topLevelSheets = m_schematic->GetTopLevelSheets();
299 BOOST_CHECK( !topLevelSheets.empty() );
300
301 if( !topLevelSheets.empty() && topLevelSheets[0] )
302 {
303 BOOST_CHECK_EQUAL( rootScreen, topLevelSheets[0]->GetScreen() );
304 }
305}
306
307
void SetPageNumber(const wxString &aPageNumber)
Definition base_screen.h:79
const KIID m_Uuid
Definition eda_item.h:516
Definition kiid.h:49
The backing store for a PROJECT, in JSON format.
std::vector< TOP_LEVEL_SHEET_INFO > & GetTopLevelSheets()
Container for project specific data.
Definition project.h:65
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:47
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
SCH_SCREEN * GetScreen() const
Definition sch_sheet.h:116
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")