diff --git a/Zip/Zip.swift b/Zip/Zip.swift index e062b14267567dd51c8f8d1e08c1ca3ac4473627..1284835c7756fb6fa3b5f76fa6073488ce35c1f4 100644 --- a/Zip/Zip.swift +++ b/Zip/Zip.swift @@ -31,6 +31,11 @@ public enum ZipError: ErrorType { /// Zip class public class Zip { + /** + Set of vaild file extensions + */ + internal static var customFileExtensions: Set = [] + // MARK: Lifecycle /** @@ -308,13 +313,45 @@ public class Zip { - parameter fileExtension: A file extension. - - returns: false if the extension is "zip" or "cbz", otherwise true. + - returns: false if the extension is a valid file extension, otherwise true. */ internal class func fileExtensionIsInvalid(fileExtension: String?) -> Bool { guard let fileExtension = fileExtension else { return true } - return !["zip", "cbz"].contains(fileExtension) + return !isValidFileExtension(fileExtension) } -} \ No newline at end of file + /** + Add a file extension to the set of custom file extensions + + - parameter fileExtension: A file extension. + */ + public class func addCustomFileExtension(fileExtension: String) { + customFileExtensions.insert(fileExtension) + } + + /** + Remove a file extension from the set of custom file extensions + + - parameter fileExtension: A file extension. + */ + public class func removeCustomFileExtension(fileExtension: String) { + customFileExtensions.remove(fileExtension) + } + + /** + Check if a specific file extension is valid + + - parameter fileExtension: A file extension. + + - returns: true if the extension valid, otherwise false. + */ + public class func isValidFileExtension(fileExtension: String) -> Bool { + + let validFileExtensions: Set = customFileExtensions.union(["zip", "cbz"]) + + return validFileExtensions.contains(fileExtension) + } + +} diff --git a/ZipTests/ZipTests.swift b/ZipTests/ZipTests.swift index 2b59732e041af05d219f3cdb439b93ba2bdb0cc6..3f3880fcaf3feee0131aceeacdb972c358a4af7b 100644 --- a/ZipTests/ZipTests.swift +++ b/ZipTests/ZipTests.swift @@ -209,7 +209,7 @@ class ZipTests: XCTestCase { } } - func testFileExtensionIsInvalidForValidUrl() { + func testFileExtensionIsNotInvalidForValidUrl() { let fileUrl = NSURL(string: "file.cbz") let result = Zip.fileExtensionIsInvalid(fileUrl?.pathExtension) XCTAssertFalse(result) @@ -220,4 +220,33 @@ class ZipTests: XCTestCase { let result = Zip.fileExtensionIsInvalid(fileUrl?.pathExtension) XCTAssertTrue(result) } + + func testAddedCustomFileExtensionIsValid() { + let fileExtension = "cstm" + Zip.addCustomFileExtension(fileExtension) + let result = Zip.isValidFileExtension(fileExtension) + XCTAssertTrue(result) + Zip.removeCustomFileExtension(fileExtension) + } + + func testRemovedCustomFileExtensionIsInvalid() { + let fileExtension = "cstm" + Zip.addCustomFileExtension(fileExtension) + Zip.removeCustomFileExtension(fileExtension) + let result = Zip.isValidFileExtension(fileExtension) + XCTAssertFalse(result) + } + + func testDefaultFileExtensionsIsValid() { + XCTAssertTrue(Zip.isValidFileExtension("zip")) + XCTAssertTrue(Zip.isValidFileExtension("cbz")) + } + + func testDefaultFileExtensionsIsNotRemoved() { + Zip.removeCustomFileExtension("zip") + Zip.removeCustomFileExtension("cbz") + XCTAssertTrue(Zip.isValidFileExtension("zip")) + XCTAssertTrue(Zip.isValidFileExtension("cbz")) + } + }