From 2b8625057e0657c642b9e97819e964fd99d8c0e6 Mon Sep 17 00:00:00 2001 From: Chris Combs Date: Sun, 25 Sep 2016 18:36:16 +0200 Subject: [PATCH] 90% coverage now --- Codemine.xcodeproj/project.pbxproj | 42 +++++++++++++++++- Codemine/Application.swift | 2 +- Codemine/Extensions/NSURL+AssetSize.swift | 6 +-- Codemine/Then.swift | 2 +- CodemineTests/CodemineTests.swift | 18 -------- CodemineTests/UIImageTests.swift | 37 ++++++++++++++++ CodemineTests/URLImageAssetSizeTests.swift | 48 +++++++++++++++++++++ CodemineTests/add.png | Bin 0 -> 476 bytes CodemineTests/alert.png | Bin 0 -> 2195 bytes 9 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 CodemineTests/UIImageTests.swift create mode 100644 CodemineTests/URLImageAssetSizeTests.swift create mode 100644 CodemineTests/add.png create mode 100644 CodemineTests/alert.png diff --git a/Codemine.xcodeproj/project.pbxproj b/Codemine.xcodeproj/project.pbxproj index 4052e43..16aeb45 100644 --- a/Codemine.xcodeproj/project.pbxproj +++ b/Codemine.xcodeproj/project.pbxproj @@ -61,6 +61,18 @@ 291272CF1C75F32200FB1BBD /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291272CE1C75F32200FB1BBD /* Operators.swift */; }; 293490EE1C6CAFD500E8305E /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490ED1C6CAFD500E8305E /* Application.swift */; }; 293490F01C6CAFF200E8305E /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 293490EF1C6CAFF200E8305E /* Then.swift */; }; + 83A5BEBC1D981F3500C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; }; + 83A5BEBD1D98215F00C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; }; + 83A5BEBE1D98216000C74312 /* UIImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */; }; + 83A5BEC01D98226800C74312 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEBF1D98226800C74312 /* add.png */; }; + 83A5BEC11D98226800C74312 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEBF1D98226800C74312 /* add.png */; }; + 83A5BEC21D98226800C74312 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEBF1D98226800C74312 /* add.png */; }; + 83A5BEC41D98228300C74312 /* alert.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEC31D98228300C74312 /* alert.png */; }; + 83A5BEC51D98228300C74312 /* alert.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEC31D98228300C74312 /* alert.png */; }; + 83A5BEC61D98228300C74312 /* alert.png in Resources */ = {isa = PBXBuildFile; fileRef = 83A5BEC31D98228300C74312 /* alert.png */; }; + 83A5BEC91D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; }; + 83A5BECA1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; }; + 83A5BECB1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -112,6 +124,10 @@ 291272CE1C75F32200FB1BBD /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; }; 293490ED1C6CAFD500E8305E /* Application.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Application.swift; sourceTree = ""; }; 293490EF1C6CAFF200E8305E /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; + 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageTests.swift; sourceTree = ""; }; + 83A5BEBF1D98226800C74312 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = ""; }; + 83A5BEC31D98228300C74312 /* alert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = alert.png; sourceTree = ""; }; + 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLImageAssetSizeTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -208,8 +224,11 @@ 275BCAAD1C57D1B500FF3647 /* CodemineTests */ = { isa = PBXGroup; children = ( - 275BCAAE1C57D1B500FF3647 /* CodemineTests.swift */, + 83A5BEC71D98228F00C74312 /* Resources */, 275BCAB01C57D1B500FF3647 /* Info.plist */, + 275BCAAE1C57D1B500FF3647 /* CodemineTests.swift */, + 83A5BEBB1D981F3500C74312 /* UIImageTests.swift */, + 83A5BEC81D98249500C74312 /* URLImageAssetSizeTests.swift */, ); path = CodemineTests; sourceTree = ""; @@ -240,6 +259,15 @@ path = "Supporting Files"; sourceTree = ""; }; + 83A5BEC71D98228F00C74312 /* Resources */ = { + isa = PBXGroup; + children = ( + 83A5BEBF1D98226800C74312 /* add.png */, + 83A5BEC31D98228300C74312 /* alert.png */, + ); + name = Resources; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -474,6 +502,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEC51D98228300C74312 /* alert.png in Resources */, + 83A5BEC11D98226800C74312 /* add.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -488,6 +518,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEC61D98228300C74312 /* alert.png in Resources */, + 83A5BEC21D98226800C74312 /* add.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -509,6 +541,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEC41D98228300C74312 /* alert.png in Resources */, + 83A5BEC01D98226800C74312 /* add.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -535,6 +569,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEBD1D98215F00C74312 /* UIImageTests.swift in Sources */, + 83A5BECA1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -562,6 +598,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEBE1D98216000C74312 /* UIImageTests.swift in Sources */, + 83A5BECB1D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -607,7 +645,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 83A5BEC91D98249500C74312 /* URLImageAssetSizeTests.swift in Sources */, 275BCAAF1C57D1B500FF3647 /* CodemineTests.swift in Sources */, + 83A5BEBC1D981F3500C74312 /* UIImageTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Codemine/Application.swift b/Codemine/Application.swift index 893772d..32df5a9 100644 --- a/Codemine/Application.swift +++ b/Codemine/Application.swift @@ -23,7 +23,7 @@ import Foundation public struct Application { - private static func getString(_ key: String) -> String { + fileprivate static func getString(_ key: String) -> String { guard let infoDictionary = Bundle.main.infoDictionary, let value = infoDictionary[key] as? String else { return "" } diff --git a/Codemine/Extensions/NSURL+AssetSize.swift b/Codemine/Extensions/NSURL+AssetSize.swift index 7228478..5252caf 100644 --- a/Codemine/Extensions/NSURL+AssetSize.swift +++ b/Codemine/Extensions/NSURL+AssetSize.swift @@ -41,8 +41,8 @@ public extension URL { - widthParameterName: the name of the width paramter. Default is 'h' - Returns: `URL` as a `NSURL`. */ - public func urlByAppendingAssetSize(_ size: CGSize, mode: ImageUrlMode = .Default, heightParameterName : String = "h", widthParameterName : String = "w") -> URL { - guard var urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: false) else { return self } + public func urlByAppendingAssetSize(_ size: CGSize, mode: ImageUrlMode = .Default, heightParameterName : String = "h", widthParameterName : String = "w") -> URL? { + guard var urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: false) else { return nil } var queryItems:[URLQueryItem] = urlComponents.queryItems ?? [] queryItems.append(URLQueryItem(name: widthParameterName, value: "\(Int(size.width * UIScreen.main.scale ))")) @@ -51,6 +51,6 @@ public extension URL { queryItems.append(URLQueryItem(name: "mode", value: mode.rawValue)) } urlComponents.queryItems = queryItems - return urlComponents.url ?? self + return urlComponents.url } } diff --git a/Codemine/Then.swift b/Codemine/Then.swift index 20c01ba..a14c668 100644 --- a/Codemine/Then.swift +++ b/Codemine/Then.swift @@ -25,7 +25,7 @@ import Foundation public protocol Then {} extension Then { - public func then( _ block: @noescape (Self) -> Void) -> Self { + public func then( _ block: (Self) -> Void) -> Self { block(self) return self } diff --git a/CodemineTests/CodemineTests.swift b/CodemineTests/CodemineTests.swift index 7972893..02a8fc3 100644 --- a/CodemineTests/CodemineTests.swift +++ b/CodemineTests/CodemineTests.swift @@ -189,25 +189,7 @@ class CodemineTests: XCTestCase { XCTAssertEqual(magenta, UIColor.magenta) XCTAssertNotEqual(red, UIColor.yellow) } - - // MARK: - NSURL extension test - func testURLWithSize() { - guard let url = URL(string: "https://example.com/image.png") else { XCTAssertTrue(false, "Failed to create NSURL"); return } - let size = CGSize(width: 512, height: 256) - let heightParameterName = "height" - let widthParameterName = "width" - - let url2 = url.urlByAppendingAssetSize(size, mode: .Default, heightParameterName: heightParameterName, widthParameterName: widthParameterName) - XCTAssertEqual(url2.absoluteString, url.absoluteString + "?\(widthParameterName)=\(Int(size.width * UIScreen.main.scale ))&\(heightParameterName)=\(Int(size.height * UIScreen.main.scale))") - - let url3 = url.urlByAppendingAssetSize(size) - XCTAssertEqual(url3.absoluteString, url.absoluteString + "?w=\(Int(size.width * UIScreen.main.scale ))&h=\(Int(size.height * UIScreen.main.scale))") - let url4 = url.urlByAppendingAssetSize(size, mode: .Crop) - XCTAssertEqual(url4.absoluteString, url.absoluteString + "?w=\(Int(size.width * UIScreen.main.scale ))&h=\(Int(size.height * UIScreen.main.scale))&mode=crop") - - } - func testError() { let domain = "Domain" let code = 123 diff --git a/CodemineTests/UIImageTests.swift b/CodemineTests/UIImageTests.swift new file mode 100644 index 0000000..f8ab579 --- /dev/null +++ b/CodemineTests/UIImageTests.swift @@ -0,0 +1,37 @@ +// +// UIImageTests.swift +// Codemine +// +// Created by Chris on 25/09/2016. +// Copyright © 2016 Nodes. All rights reserved. +// + +import XCTest +@testable import Codemine + +class UIImageTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + func testImageNamed(name: String) -> UIImage { + let bundle = Bundle(for: type(of: self)) + let path = bundle.path(forResource: name, ofType: "png")! + return UIImage(contentsOfFile: path)! + } + + func testUIImageFromColor() { + XCTAssertNotNil(UIImage.imageFromColor(.red, size: CGSize(width: 20, height: 20), cornerRadius: 1.0), "Failed to convert color to image") + } + + func testImageImbed() { + XCTAssertNotNil(UIImage.imageByEmbeddingIconIn(testImageNamed(name: "add"), icon: testImageNamed(name: "alert")), "Failed to embed image") + } + + func testImageRotation() { + XCTAssertNotNil(testImageNamed(name: "add").rotationCorrectedImage(), "Failed to rotate image") + } + +} diff --git a/CodemineTests/URLImageAssetSizeTests.swift b/CodemineTests/URLImageAssetSizeTests.swift new file mode 100644 index 0000000..057c5f5 --- /dev/null +++ b/CodemineTests/URLImageAssetSizeTests.swift @@ -0,0 +1,48 @@ +// +// URLImageAssetSizeTests.swift +// Codemine +// +// Created by Chris on 25/09/2016. +// Copyright © 2016 Nodes. All rights reserved. +// + +import XCTest +@testable import Codemine + +class URLImageAssetSizeTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + + func testURLWithSize() { + guard let url = URL(string: "https://example.com/image.png") else { XCTAssertTrue(false, "Failed to create NSURL"); return } + let size = CGSize(width: 512, height: 256) + let heightParameterName = "height" + let widthParameterName = "width" + + let url2 = url.urlByAppendingAssetSize(size, mode: .Default, heightParameterName: heightParameterName, widthParameterName: widthParameterName) + XCTAssertEqual(url2?.absoluteString, url.absoluteString + "?\(widthParameterName)=\(Int(size.width * UIScreen.main.scale ))&\(heightParameterName)=\(Int(size.height * UIScreen.main.scale))") + + let url3 = url.urlByAppendingAssetSize(size) + XCTAssertEqual(url3?.absoluteString, url.absoluteString + "?w=\(Int(size.width * UIScreen.main.scale ))&h=\(Int(size.height * UIScreen.main.scale))") + + let url4 = url.urlByAppendingAssetSize(size, mode: .Crop) + XCTAssertEqual(url4?.absoluteString, url.absoluteString + "?w=\(Int(size.width * UIScreen.main.scale ))&h=\(Int(size.height * UIScreen.main.scale))&mode=crop") + + } + + func testBadUrl() { + let url = URL(string: "http://example.com:-80/")! + + print(URLComponents(url: url, resolvingAgainstBaseURL: false)) + + let newUrl = url.urlByAppendingAssetSize(CGSize(width: 10, height: 10)) + XCTAssertNil(newUrl?.absoluteString, "Bad URL did not return nil") + } + + + +} diff --git a/CodemineTests/add.png b/CodemineTests/add.png new file mode 100644 index 0000000000000000000000000000000000000000..3d008756180813c54b3115e81b70a1adec94dfff GIT binary patch literal 476 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 literal 0 HcmV?d00001