@@ -296,4 +296,104 @@ suite("SwiftToolchain Unit Test Suite", () => {
296296 await expect ( SwiftToolchain . findXcodeInstalls ( ) ) . to . eventually . be . empty ;
297297 } ) ;
298298 } ) ;
299+
300+ suite ( "getSwiftlyToolchainInstalls()" , ( ) => {
301+ const mockedEnv = mockGlobalValue ( process , "env" ) ;
302+
303+ test ( "returns installed toolchains on Linux" , async ( ) => {
304+ mockedPlatform . setValue ( "linux" ) ;
305+ const mockHomeDir = "/home/user/.swiftly" ;
306+ mockedEnv . setValue ( { SWIFTLY_HOME_DIR : mockHomeDir } ) ;
307+
308+ mockFS ( {
309+ [ path . join ( mockHomeDir , "config.json" ) ] : JSON . stringify ( {
310+ installedToolchains : [ "swift-5.9.0" , "swift-6.0.0" ] ,
311+ } ) ,
312+ } ) ;
313+
314+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
315+ expect ( toolchains ) . to . deep . equal ( [
316+ path . join ( mockHomeDir , "toolchains" , "swift-5.9.0" ) ,
317+ path . join ( mockHomeDir , "toolchains" , "swift-6.0.0" ) ,
318+ ] ) ;
319+ } ) ;
320+
321+ test ( "returns installed toolchains on macOS" , async ( ) => {
322+ mockedPlatform . setValue ( "darwin" ) ;
323+ const mockHomeDir = "/Users/user/.swiftly" ;
324+ mockedEnv . setValue ( { SWIFTLY_HOME_DIR : mockHomeDir } ) ;
325+
326+ mockFS ( {
327+ [ path . join ( mockHomeDir , "config.json" ) ] : JSON . stringify ( {
328+ installedToolchains : [ "swift-5.9.0" , "swift-6.0.0" ] ,
329+ } ) ,
330+ } ) ;
331+
332+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
333+ expect ( toolchains ) . to . deep . equal ( [
334+ path . join ( mockHomeDir , "toolchains" , "swift-5.9.0" ) ,
335+ path . join ( mockHomeDir , "toolchains" , "swift-6.0.0" ) ,
336+ ] ) ;
337+ } ) ;
338+
339+ test ( "returns empty array when SWIFTLY_HOME_DIR is not set" , async ( ) => {
340+ mockedPlatform . setValue ( "linux" ) ;
341+ mockedEnv . setValue ( { } ) ;
342+
343+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
344+ expect ( toolchains ) . to . be . empty ;
345+ } ) ;
346+
347+ test ( "returns empty array when config file does not exist" , async ( ) => {
348+ mockedPlatform . setValue ( "linux" ) ;
349+ const mockHomeDir = "/home/user/.swiftly" ;
350+ mockedEnv . setValue ( { SWIFTLY_HOME_DIR : mockHomeDir } ) ;
351+
352+ mockFS ( { } ) ;
353+
354+ await expect ( SwiftToolchain . getSwiftlyToolchainInstalls ( ) ) . to . be . rejectedWith (
355+ "Failed to retrieve Swiftly installations from disk."
356+ ) ;
357+ } ) ;
358+
359+ test ( "returns empty array when config has no installedToolchains" , async ( ) => {
360+ mockedPlatform . setValue ( "linux" ) ;
361+ const mockHomeDir = "/home/user/.swiftly" ;
362+ mockedEnv . setValue ( { SWIFTLY_HOME_DIR : mockHomeDir } ) ;
363+
364+ mockFS ( {
365+ [ path . join ( mockHomeDir , "config.json" ) ] : JSON . stringify ( {
366+ someOtherProperty : "value" ,
367+ } ) ,
368+ } ) ;
369+
370+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
371+ expect ( toolchains ) . to . be . empty ;
372+ } ) ;
373+
374+ test ( "returns empty array on Windows" , async ( ) => {
375+ mockedPlatform . setValue ( "win32" ) ;
376+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
377+ expect ( toolchains ) . to . be . empty ;
378+ } ) ;
379+
380+ test ( "filters out non-string toolchain entries" , async ( ) => {
381+ mockedPlatform . setValue ( "linux" ) ;
382+ const mockHomeDir = "/home/user/.swiftly" ;
383+ mockedEnv . setValue ( { SWIFTLY_HOME_DIR : mockHomeDir } ) ;
384+
385+ mockFS ( {
386+ [ path . join ( mockHomeDir , "config.json" ) ] : JSON . stringify ( {
387+ installedToolchains : [ "swift-5.9.0" , null , "swift-6.0.0" , 123 , "swift-6.1.0" ] ,
388+ } ) ,
389+ } ) ;
390+
391+ const toolchains = await SwiftToolchain . getSwiftlyToolchainInstalls ( ) ;
392+ expect ( toolchains ) . to . deep . equal ( [
393+ path . join ( mockHomeDir , "toolchains" , "swift-5.9.0" ) ,
394+ path . join ( mockHomeDir , "toolchains" , "swift-6.0.0" ) ,
395+ path . join ( mockHomeDir , "toolchains" , "swift-6.1.0" ) ,
396+ ] ) ;
397+ } ) ;
398+ } ) ;
299399} ) ;
0 commit comments