diff --git a/Packages/Infrastructure/Sources/Public/Enumerations/AssetExtension.swift b/Packages/Infrastructure/Sources/Public/Enumerations/AssetExtension.swift index bdcd25e..be7af89 100644 --- a/Packages/Infrastructure/Sources/Public/Enumerations/AssetExtension.swift +++ b/Packages/Infrastructure/Sources/Public/Enumerations/AssetExtension.swift @@ -1,21 +1,25 @@ /// A file extension used by an ``Asset``. /// /// Each case's raw value is the extension itself (e.g. `"css"`), which an asset appends to its file name when resolving paths. -public enum AssetExtension: String, Sendable { +public enum AssetExtension: String, CaseIterable, Sendable { /// A Cascading Style Sheets file. case css + /// A Windows icon image. + case ico + /// A JPEG image. + case jpg /// A JavaScript file. case js /// A Portable Network Graphics image. case png - /// A Windows icon image. - case ico /// A Scalable Vector Graphics image. case svg /// A plain text file. case txt /// A web application manifest file. case webmanifest + /// A WebP image. + case webp /// An Extensible Markup Language file. case xml } @@ -30,12 +34,14 @@ public extension AssetExtension { var contentType: String { switch self { case .css: "text/css" + case .ico: "image/vnd.microsoft.icon" + case .jpg: "image/jpeg" case .js: "text/javascript" case .png: "image/png" - case .ico: "image/vnd.microsoft.icon" case .svg: "image/svg+xml" case .txt: "text/plain" case .webmanifest: "application/manifest+json" + case .webp: "image/webp" case .xml: "application/xml" } } @@ -45,6 +51,9 @@ public extension AssetExtension { switch self { case .css: "css" case .js: "js" + case .jpg, + .mp4, + .webp: "media" default: nil } } diff --git a/Packages/Infrastructure/Tests/Cases/Public/Enumerations/AssetExtensionTests.swift b/Packages/Infrastructure/Tests/Cases/Public/Enumerations/AssetExtensionTests.swift index f1fff74..d5f8c80 100644 --- a/Packages/Infrastructure/Tests/Cases/Public/Enumerations/AssetExtensionTests.swift +++ b/Packages/Infrastructure/Tests/Cases/Public/Enumerations/AssetExtensionTests.swift @@ -32,6 +32,17 @@ struct AssetExtensionTests { #expect(fileExtension.folder == folder) } + // MARK: CaseIterable tests + + @Test + func `covers every case in the parameterised tests`() { + // `zip` stops at the shorter sequence, so a case missing from the arrays below is silently untested rather + // than failing — this is what catches that. + #expect(Self.extensions == AssetExtension.allCases) + #expect(Self.contentTypes.count == AssetExtension.allCases.count) + #expect(Self.folders.count == AssetExtension.allCases.count) + } + } // MARK: - Helpers @@ -44,6 +55,8 @@ private extension AssetExtensionTests { .css, .js, .png, + .jpg, + .webp, .ico, .svg, .txt, @@ -54,6 +67,8 @@ private extension AssetExtensionTests { "text/css", "text/javascript", "image/png", + "image/jpeg", + "image/webp", "image/vnd.microsoft.icon", "image/svg+xml", "text/plain", @@ -64,6 +79,8 @@ private extension AssetExtensionTests { "css", "js", nil, + "media", + "media", nil, nil, nil,