diff --git a/Sources/PackageListTool/Models/SwiftPackageIndexAPI+Package.swift b/Sources/PackageListTool/Models/SwiftPackageIndexAPI+Package.swift index aaeb655..99909bb 100644 --- a/Sources/PackageListTool/Models/SwiftPackageIndexAPI+Package.swift +++ b/Sources/PackageListTool/Models/SwiftPackageIndexAPI+Package.swift @@ -29,12 +29,16 @@ extension SwiftPackageIndexAPI { public enum PlatformCompatibilityGroup: String, CaseIterable, Codable { case apple = "Apple" case linux = "Linux" + case wasm = "Wasm" + case android = "Android" var platforms: OrderedSet { switch self { // The order here is important and should match the columns in the compatibility matrix on the SPI website. case .apple: return [.iOS, .macOS, .visionOS, .watchOS, .tvOS] case .linux: return [.linux] + case .wasm: return [.wasm] + case .android: return [.android] } } } @@ -49,7 +53,7 @@ extension SwiftPackageIndexAPI.Package { } public var platformCompatibilityTooltip: String { - groupedPlatformCompatibility.map { group in + let tooltips = groupedPlatformCompatibility.map { group in let platforms = group.platforms.intersection(Set(platformCompatibility ?? [])) if group == .apple { let detail = "(" + platforms.map(\.rawValue).joined(separator: ", ") + ")" @@ -57,7 +61,20 @@ extension SwiftPackageIndexAPI.Package { } else { return group.rawValue } - }.joined(separator: " and ") + } + + switch tooltips.count { + case 0: + return "" + case 1: + return tooltips[0] + case 2: + return tooltips.joined(separator: " and ") + default: + let allButLast = tooltips.dropLast().joined(separator: ", ") + let last = tooltips.last! + return "\(allButLast), and \(last)" + } } } diff --git a/Tests/PackageListToolTests/API+APIPackageTests.swift b/Tests/PackageListToolTests/API+APIPackageTests.swift index eff58b5..445c937 100644 --- a/Tests/PackageListToolTests/API+APIPackageTests.swift +++ b/Tests/PackageListToolTests/API+APIPackageTests.swift @@ -34,6 +34,15 @@ class API_APIPackageTests: XCTestCase { package.platformCompatibility = [.linux] XCTAssertEqual(package.groupedPlatformCompatibility, [.linux]) + + package.platformCompatibility = [.wasm] + XCTAssertEqual(package.groupedPlatformCompatibility, [.wasm]) + + package.platformCompatibility = [.android] + XCTAssertEqual(package.groupedPlatformCompatibility, [.android]) + + package.platformCompatibility = [.macOS, .linux, .wasm, .android] + XCTAssertEqual(package.groupedPlatformCompatibility, [.apple, .linux, .wasm, .android]) } func test_platformCompatibilityTooltip() throws { @@ -50,6 +59,24 @@ class API_APIPackageTests: XCTestCase { package.platformCompatibility = [.linux] XCTAssertEqual(package.platformCompatibilityTooltip, "Linux") + + package.platformCompatibility = [.wasm] + XCTAssertEqual(package.platformCompatibilityTooltip, "Wasm") + + package.platformCompatibility = [.android] + XCTAssertEqual(package.platformCompatibilityTooltip, "Android") + + package.platformCompatibility = [.linux, .wasm] + XCTAssertEqual(package.platformCompatibilityTooltip, "Linux and Wasm") + + package.platformCompatibility = [.macOS, .linux, .wasm] + XCTAssertEqual(package.platformCompatibilityTooltip, "Apple (macOS), Linux, and Wasm") + + package.platformCompatibility = [.macOS, .linux, .wasm, .android] + XCTAssertEqual(package.platformCompatibilityTooltip, "Apple (macOS), Linux, Wasm, and Android") + + package.platformCompatibility = [.iOS, .macOS, .linux, .wasm, .android] + XCTAssertEqual(package.platformCompatibilityTooltip, "Apple (iOS, macOS), Linux, Wasm, and Android") } func test_reformatYMLToSwiftOrgStyle() {