Added tests

This commit is contained in:
Jonathan Cardasis 2019-05-02 12:37:27 -04:00
parent 105f76bc0e
commit 9f06fb522f
8 changed files with 304 additions and 19 deletions

View File

@ -26,6 +26,10 @@
FCCA42A5226022A800BE2FF9 /* ColorWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCCA42A4226022A800BE2FF9 /* ColorWheelView.swift */; };
FCCA42A7226023F000BE2FF9 /* ChromaColorHandle.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCCA42A6226023F000BE2FF9 /* ChromaColorHandle.swift */; };
FCCA42AA2260329900BE2FF9 /* UIView+DropShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCCA42A92260329900BE2FF9 /* UIView+DropShadow.swift */; };
FCE07BFE227B4A8100920217 /* UIColor+BrightnessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE07BFD227B4A8100920217 /* UIColor+BrightnessTests.swift */; };
FCE07C01227B4C8B00920217 /* UIColor+TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE07C00227B4C8B00920217 /* UIColor+TestHelpers.swift */; };
FCE07C04227B4DB900920217 /* UIView+DropShadowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE07C03227B4DB900920217 /* UIView+DropShadowTests.swift */; };
FCE07C06227B525000920217 /* ChromaControlStylableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE07C05227B525000920217 /* ChromaControlStylableTests.swift */; };
FCEA4E272235AAA200C0A1B6 /* ChromaColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCEA4E262235AAA200C0A1B6 /* ChromaColorPicker.swift */; };
/* End PBXBuildFile section */
@ -89,6 +93,10 @@
FCCA42A6226023F000BE2FF9 /* ChromaColorHandle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChromaColorHandle.swift; sourceTree = "<group>"; };
FCCA42A92260329900BE2FF9 /* UIView+DropShadow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+DropShadow.swift"; sourceTree = "<group>"; };
FCCA42AB226038A400BE2FF9 /* ColorWheelViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorWheelViewTests.swift; sourceTree = "<group>"; };
FCE07BFD227B4A8100920217 /* UIColor+BrightnessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+BrightnessTests.swift"; sourceTree = "<group>"; };
FCE07C00227B4C8B00920217 /* UIColor+TestHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+TestHelpers.swift"; sourceTree = "<group>"; };
FCE07C03227B4DB900920217 /* UIView+DropShadowTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+DropShadowTests.swift"; sourceTree = "<group>"; };
FCE07C05227B525000920217 /* ChromaControlStylableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChromaControlStylableTests.swift; sourceTree = "<group>"; };
FCEA4E262235AAA200C0A1B6 /* ChromaColorPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChromaColorPicker.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -171,9 +179,12 @@
FC1BD8BE2207D7B700817AF3 /* Tests */ = {
isa = PBXGroup;
children = (
FCE07BFF227B4C7A00920217 /* TestHelpers */,
FCE07C02227B4D9500920217 /* Helpers */,
FCCA42AD226038BD00BE2FF9 /* Extensions */,
FC1BD8BF2207D7B700817AF3 /* ChromaColorPickerTests.swift */,
FCCA42AB226038A400BE2FF9 /* ColorWheelViewTests.swift */,
FCE07C05227B525000920217 /* ChromaControlStylableTests.swift */,
FC1BD8C12207D7B700817AF3 /* Info.plist */,
);
path = Tests;
@ -205,8 +216,8 @@
FCCA42A82260325F00BE2FF9 /* Extensions */ = {
isa = PBXGroup;
children = (
FCCA42A92260329900BE2FF9 /* UIView+DropShadow.swift */,
FC4387DC226972EB00F739F1 /* UIColor+Brightness.swift */,
FCCA42A92260329900BE2FF9 /* UIView+DropShadow.swift */,
);
path = Extensions;
sourceTree = "<group>";
@ -214,10 +225,27 @@
FCCA42AD226038BD00BE2FF9 /* Extensions */ = {
isa = PBXGroup;
children = (
FCE07BFD227B4A8100920217 /* UIColor+BrightnessTests.swift */,
FCE07C03227B4DB900920217 /* UIView+DropShadowTests.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
FCE07BFF227B4C7A00920217 /* TestHelpers */ = {
isa = PBXGroup;
children = (
FCE07C00227B4C8B00920217 /* UIColor+TestHelpers.swift */,
);
path = TestHelpers;
sourceTree = "<group>";
};
FCE07C02227B4D9500920217 /* Helpers */ = {
isa = PBXGroup;
children = (
);
path = Helpers;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@ -319,6 +347,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
@ -391,8 +420,12 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FCE07C06227B525000920217 /* ChromaControlStylableTests.swift in Sources */,
FC1BD8C02207D7B700817AF3 /* ChromaColorPickerTests.swift in Sources */,
FCE07BFE227B4A8100920217 /* UIColor+BrightnessTests.swift in Sources */,
FC4387C422603AE900F739F1 /* ColorWheelViewTests.swift in Sources */,
FCE07C01227B4C8B00920217 /* UIColor+TestHelpers.swift in Sources */,
FCE07C04227B4DB900920217 /* UIView+DropShadowTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -11,7 +11,7 @@ import UIKit
internal extension UIColor {
/// Returns a color with the specified brightness component.
internal func withBrightness(_ value: CGFloat) -> UIColor {
func withBrightness(_ value: CGFloat) -> UIColor {
var hue: CGFloat = 0
var saturation: CGFloat = 0
var alpha: CGFloat = 0
@ -22,7 +22,7 @@ internal extension UIColor {
}
/// The value of the brightness component.
internal var brightness: CGFloat {
var brightness: CGFloat {
var brightness: CGFloat = 0
getHue(nil, saturation: nil, brightness: &brightness, alpha: nil)
return brightness

View File

@ -17,13 +17,13 @@ internal struct ShadowProperties {
internal extension UIView {
internal var dropShadowProperties: ShadowProperties? {
var dropShadowProperties: ShadowProperties? {
guard let shadowColor = layer.shadowColor else { return nil }
return ShadowProperties(color: shadowColor, opacity: layer.shadowOpacity, offset: layer.shadowOffset, radius: layer.shadowRadius)
}
internal func applyDropShadow(color: UIColor, opacity: Float, offset: CGSize, radius: CGFloat) {
self.clipsToBounds = false
func applyDropShadow(color: UIColor, opacity: Float, offset: CGSize, radius: CGFloat) {
clipsToBounds = false
layer.masksToBounds = false
layer.shadowColor = color.cgColor
layer.shadowOpacity = opacity
@ -34,11 +34,11 @@ internal extension UIView {
layer.rasterizationScale = UIScreen.main.scale
}
internal func applyDropShadow(_ properties: ShadowProperties) {
func applyDropShadow(_ properties: ShadowProperties) {
applyDropShadow(color: UIColor(cgColor: properties.color), opacity: properties.opacity, offset: properties.offset, radius: properties.radius)
}
internal func removeDropShadow() {
func removeDropShadow() {
layer.shadowColor = nil
layer.shadowOpacity = 0
}

View File

@ -0,0 +1,66 @@
//
// ChromaControlStylableTests.swift
// ChromaColorPickerTests
//
// Created by Jon Cardasis on 5/2/19.
// Copyright © 2019 Jonathan Cardasis. All rights reserved.
//
import XCTest
@testable import ChromaColorPicker
class ChromaControlStyableTests: XCTestCase {
func testUIViewShadowPropertiesShouldReturnBlackColor() {
// Given
let view = TestView()
// When
let shadowProps = view.shadowProperties(forHeight: 120)
// Then
XCTAssertEqual(shadowProps.color, UIColor.black.cgColor)
}
func testUIViewShadowPropertiesOpacity() {
// Given
let view = TestView()
// When
let shadowProps = view.shadowProperties(forHeight: 120)
// Then
XCTAssertEqual(shadowProps.opacity, 0.35)
}
func testUIViewShadowPropertiesRadius() {
// Given
let view = TestView()
// When
let shadowProps = view.shadowProperties(forHeight: 120)
// Then
XCTAssertEqual(shadowProps.radius, 4)
}
func testUIViewShadowPropertiesOffsetHeightShouldBeOnePercentOfProvidedHeight() {
// Given
let view = TestView()
// When
let shadowProps = view.shadowProperties(forHeight: 1200)
// Then
XCTAssertEqual(shadowProps.offset.width, 0)
XCTAssertEqual(shadowProps.offset.height, 12)
}
}
private class TestView: UIView, ChromaControlStylable {
var borderWidth: CGFloat = 2.0
var borderColor: UIColor = UIColor.green
var showsShadow: Bool = true
func updateShadowIfNeeded() {}
}

View File

@ -155,15 +155,4 @@ class ColorWheelViewTests: XCTestCase {
XCTAssertEqual(actualColorValues.green, expectedColorValues.green, accuracy: 0.005)
XCTAssertEqual(actualColorValues.blue, expectedColorValues.blue, accuracy: 0.005)
}
}
private extension UIColor {
var rgbValues: (red: CGFloat, green: CGFloat, blue: CGFloat) {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
getRed(&red, green: &green, blue: &blue, alpha: nil)
return (red, green, blue)
}
}

View File

@ -0,0 +1,56 @@
//
// UIColor+BrightnessTests.swift
// ChromaColorPickerTests
//
// Created by Jon Cardasis on 5/2/19.
// Copyright © 2019 Jonathan Cardasis. All rights reserved.
//
import XCTest
@testable import ChromaColorPicker
class UIColor_BrightnessTests: XCTestCase {
func testWithBrightnessReturnsNewInstanceWithNewBrightness() {
// Given
let color: UIColor = UIColor(hue: 25, saturation: 0.65, brightness: 0, alpha: 0.73)
let newBrightness: CGFloat = 1.0
// When
let newColor = color.withBrightness(newBrightness)
// Then
let expectedValues = color.hsbaValues
let actualValues = newColor.hsbaValues
XCTAssertNotEqual(color, newColor)
XCTAssertEqual(expectedValues.hue, actualValues.hue)
XCTAssertEqual(expectedValues.saturation, actualValues.saturation)
XCTAssertEqual(actualValues.brightness, newBrightness)
XCTAssertEqual(expectedValues.alpha, actualValues.alpha)
}
func testBrightnessReturnsZeroForBlack() {
// Given
let color: UIColor = .black
// When, Then
XCTAssertEqual(color.brightness, 0)
}
func testBrightnessReturnsOneForWhite() {
// Given
let color: UIColor = .white
// When, Then
XCTAssertEqual(color.brightness, 1)
}
func testBrightnessReturnsCustomColorBrightness() {
// Given
let color: UIColor = UIColor(hue: 25, saturation: 1, brightness: 0.36, alpha: 1)
// When, Then
XCTAssertEqual(color.brightness, 0.36)
}
}

View File

@ -0,0 +1,111 @@
//
// UIView+DropShadowTests.swift
// ChromaColorPickerTests
//
// Created by Jon Cardasis on 5/2/19.
// Copyright © 2019 Jonathan Cardasis. All rights reserved.
//
import XCTest
@testable import ChromaColorPicker
class UIView_DropShadowTests: XCTestCase {
var subject: UIView!
override func setUp() {
subject = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
func testApplyingDropShadowUpdatesLayerProperties() {
// Given
let color: UIColor = .blue
let opacity: Float = 0.35
let offset: CGSize = CGSize(width: 12, height: 10)
let radius: CGFloat = 4.0
// When
subject.applyDropShadow(color: color, opacity: opacity, offset: offset, radius: radius)
// Then
XCTAssertFalse(subject.layer.masksToBounds)
XCTAssertEqual(subject.layer.shadowColor, color.cgColor)
XCTAssertEqual(subject.layer.shadowOpacity, opacity)
XCTAssertEqual(subject.layer.shadowOffset, offset)
XCTAssertEqual(subject.layer.shadowRadius, radius)
}
func testConvenienceMethodApplyDropShadowUpdatesTheSameLayerProperties() {
// Given
let color: UIColor = .blue
let opacity: Float = 0.35
let offset: CGSize = CGSize(width: 12, height: 10)
let radius: CGFloat = 4.0
let shadowProps = ShadowProperties(color: color.cgColor, opacity: opacity, offset: offset, radius: radius)
// When
subject.applyDropShadow(shadowProps)
// Then
XCTAssertFalse(subject.layer.masksToBounds)
XCTAssertEqual(subject.layer.shadowColor, color.cgColor)
XCTAssertEqual(subject.layer.shadowOpacity, opacity)
XCTAssertEqual(subject.layer.shadowOffset, offset)
XCTAssertEqual(subject.layer.shadowRadius, radius)
}
func testViewShouldNotClipToBoundsWhenDropShadowApplied() {
// Given, When
subject.applyDropShadow(defaultShadowProperties)
// Then
XCTAssertFalse(subject.clipsToBounds)
}
func testApplyingDropShadowShouldRasterizeLayer() {
// Given, When
subject.applyDropShadow(defaultShadowProperties)
// Then
XCTAssertTrue(subject.layer.shouldRasterize)
XCTAssertEqual(subject.layer.rasterizationScale, UIScreen.main.scale)
}
func testDropShadowPropertiesReturnsCurrentShadowProps() {
// Given, When
subject.applyDropShadow(defaultShadowProperties)
// Then
XCTAssertEqual(subject.dropShadowProperties!.color, defaultShadowProperties.color)
XCTAssertEqual(subject.dropShadowProperties!.opacity, defaultShadowProperties.opacity)
XCTAssertEqual(subject.dropShadowProperties!.offset, defaultShadowProperties.offset)
XCTAssertEqual(subject.dropShadowProperties!.radius, defaultShadowProperties.radius)
}
func testDropShadowPropertiesReturnsNilWhenNoShadowColor() {
// Given, When
subject.applyDropShadow(defaultShadowProperties)
subject.layer.shadowColor = nil
// Then
XCTAssertNil(subject.dropShadowProperties)
}
func testRemoveDropShadowRemovesVisualShadowProperties() {
// Given
subject.applyDropShadow(defaultShadowProperties)
// When
subject.removeDropShadow()
// Then
XCTAssertNil(subject.layer.shadowColor)
XCTAssertEqual(subject.layer.shadowOpacity, 0)
}
}
private var defaultShadowProperties: ShadowProperties {
return ShadowProperties(color: UIColor.black.cgColor, opacity: 0.5, offset: CGSize(width: 2, height: 4), radius: 4)
}

View File

@ -0,0 +1,30 @@
//
// UIColor+TestHelpers.swift
// ChromaColorPickerTests
//
// Created by Jon Cardasis on 5/2/19.
// Copyright © 2019 Jonathan Cardasis. All rights reserved.
//
import UIKit
extension UIColor {
var rgbValues: (red: CGFloat, green: CGFloat, blue: CGFloat) {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
getRed(&red, green: &green, blue: &blue, alpha: nil)
return (red, green, blue)
}
var hsbaValues: (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) {
var h: CGFloat = 0
var s: CGFloat = 0
var b: CGFloat = 0
var a: CGFloat = 0
getHue(&h, saturation: &s, brightness: &b, alpha: &a)
return (h,s,b,a)
}
}