88 CMakePresets ,
99 CMakeSyncData ,
1010 ConfigurePreset ,
11+ TestPreset ,
1112)
1213
1314
@@ -100,22 +101,25 @@ def write_cppython_preset(
100101 @staticmethod
101102 def _create_presets (
102103 cmake_data : CMakeData , build_directory : Path
103- ) -> tuple [list [ConfigurePreset ], list [BuildPreset ]]:
104- """Create the default configure and build presets for the user.
104+ ) -> tuple [list [ConfigurePreset ], list [BuildPreset ], list [ TestPreset ] ]:
105+ """Create the default configure, build, and test presets for the user.
105106
106107 Args:
107108 cmake_data: The CMake data to use
108109 build_directory: The build directory to use
109110
110111 Returns:
111- A tuple containing the configure preset and list of build presets
112+ A tuple containing the configure presets, build presets, and test presets
112113 """
113114 user_configure_presets : list [ConfigurePreset ] = []
114115 user_build_presets : list [BuildPreset ] = []
116+ user_test_presets : list [TestPreset ] = []
115117
116118 name = cmake_data .configuration_name
117119 release_name = name + '-release'
118120 debug_name = name + '-debug'
121+ bench_release_name = name + '-bench-release'
122+ bench_debug_name = name + '-bench-debug'
119123
120124 user_configure_presets .append (
121125 ConfigurePreset (
@@ -161,7 +165,43 @@ def _create_presets(
161165 )
162166 )
163167
164- return user_configure_presets , user_build_presets
168+ # Test presets
169+ user_test_presets .append (
170+ TestPreset (
171+ name = release_name ,
172+ description = 'Run tests for release configuration' ,
173+ configurePreset = release_name ,
174+ )
175+ )
176+
177+ user_test_presets .append (
178+ TestPreset (
179+ name = debug_name ,
180+ description = 'Run tests for debug configuration' ,
181+ configurePreset = debug_name ,
182+ )
183+ )
184+
185+ # Benchmark test presets with label filter
186+ user_test_presets .append (
187+ TestPreset (
188+ name = bench_release_name ,
189+ description = 'Run benchmark tests for release configuration' ,
190+ configurePreset = release_name ,
191+ filter = {'include' : {'label' : 'benchmark' }},
192+ )
193+ )
194+
195+ user_test_presets .append (
196+ TestPreset (
197+ name = bench_debug_name ,
198+ description = 'Run benchmark tests for debug configuration' ,
199+ configurePreset = debug_name ,
200+ filter = {'include' : {'label' : 'benchmark' }},
201+ )
202+ )
203+
204+ return user_configure_presets , user_build_presets , user_test_presets
165205
166206 @staticmethod
167207 def _load_existing_preset (preset_file : Path ) -> CMakePresets | None :
@@ -200,11 +240,35 @@ def _update_configure_preset(existing_preset: ConfigurePreset, build_directory:
200240 if not existing_preset .binaryDir :
201241 existing_preset .binaryDir = '${sourceDir}/' + build_directory .as_posix () # type: ignore[misc]
202242
243+ @staticmethod
244+ def _merge_presets [T : (ConfigurePreset , BuildPreset , TestPreset )](
245+ existing : list [T ] | None ,
246+ new_presets : list [T ],
247+ ) -> list [T ]:
248+ """Merge new presets into an existing list, adding only those not already present.
249+
250+ Args:
251+ existing: The existing preset list (may be None)
252+ new_presets: The new presets to merge in
253+
254+ Returns:
255+ The merged list of presets
256+ """
257+ if existing is None :
258+ return new_presets .copy ()
259+
260+ for preset in new_presets :
261+ if not any (p .name == preset .name for p in existing ):
262+ existing .append (preset )
263+
264+ return existing
265+
203266 @staticmethod
204267 def _modify_presets (
205268 root_preset : CMakePresets ,
206269 user_configure_presets : list [ConfigurePreset ],
207270 user_build_presets : list [BuildPreset ],
271+ user_test_presets : list [TestPreset ],
208272 build_directory : Path ,
209273 ) -> None :
210274 """Handle presets in the root preset.
@@ -213,6 +277,7 @@ def _modify_presets(
213277 root_preset: The root preset to modify
214278 user_configure_presets: The user's configure presets
215279 user_build_presets: The user's build presets
280+ user_test_presets: The user's test presets
216281 build_directory: The build directory to use
217282 """
218283 if root_preset .configurePresets is None :
@@ -228,14 +293,8 @@ def _modify_presets(
228293 else :
229294 root_preset .configurePresets .append (user_configure_preset )
230295
231- if root_preset .buildPresets is None :
232- root_preset .buildPresets = user_build_presets .copy () # type: ignore[misc]
233- else :
234- # Add build presets if they don't exist
235- for build_preset in user_build_presets :
236- existing = next ((p for p in root_preset .buildPresets if p .name == build_preset .name ), None )
237- if not existing :
238- root_preset .buildPresets .append (build_preset )
296+ root_preset .buildPresets = Builder ._merge_presets (root_preset .buildPresets , user_build_presets ) # type: ignore[misc]
297+ root_preset .testPresets = Builder ._merge_presets (root_preset .testPresets , user_test_presets ) # type: ignore[misc]
239298
240299 @staticmethod
241300 def _modify_includes (root_preset : CMakePresets , preset_file : Path , cppython_preset_file : Path ) -> None :
@@ -273,17 +332,22 @@ def generate_root_preset(
273332 A CMakePresets object
274333 """
275334 # Create user presets
276- user_configure_presets , user_build_presets = Builder ._create_presets (cmake_data , build_directory )
335+ user_configure_presets , user_build_presets , user_test_presets = Builder ._create_presets (
336+ cmake_data , build_directory
337+ )
277338
278339 # Load existing preset or create new one
279340 root_preset = Builder ._load_existing_preset (preset_file )
280341 if root_preset is None :
281342 root_preset = CMakePresets (
282343 configurePresets = user_configure_presets ,
283344 buildPresets = user_build_presets ,
345+ testPresets = user_test_presets ,
284346 )
285347 else :
286- Builder ._modify_presets (root_preset , user_configure_presets , user_build_presets , build_directory )
348+ Builder ._modify_presets (
349+ root_preset , user_configure_presets , user_build_presets , user_test_presets , build_directory
350+ )
287351
288352 Builder ._modify_includes (root_preset , preset_file , cppython_preset_file )
289353
0 commit comments