@@ -13,29 +13,49 @@ final class ElevationTests: XCTestCase {
1313 func test_init_deliversGivenValues( ) {
1414 let sut = makeSUT ( )
1515
16- XCTAssertEqual ( sut. offset, CGSize ( width: 1 , height: 1 ) )
16+ XCTAssertEqual ( sut. xOffset, 1 )
17+ XCTAssertEqual ( sut. yOffset, 1 )
1718 XCTAssertEqual ( sut. blur, 2 )
1819 XCTAssertEqual ( sut. spread, 3 )
1920 XCTAssertEqual ( sut. color, . red)
20- XCTAssertEqual ( sut. opacity, 5 )
21+ XCTAssertEqual ( sut. opacity, 0. 5)
2122 XCTAssertEqual ( sut. useShadowPath, true )
2223 }
23-
24+
2425 func test_init_defaultValue( ) {
2526 let sut = Elevation (
26- offset: CGSize ( width: 1 , height: 1 ) ,
27+ xOffset: 1 ,
28+ yOffset: 1 ,
2729 blur: 2 ,
2830 spread: 3 ,
2931 color: . red,
3032 opacity: 5
3133 )
32-
34+
3335 XCTAssertEqual ( sut. useShadowPath, true )
3436 }
35-
37+
38+ func test_init_negativeBlur( ) {
39+ let sut = makeSUT ( blur: - 10 )
40+
41+ XCTAssertEqual ( sut. blur, 0 )
42+ }
43+
44+ func test_init_negativeOpacity( ) {
45+ let sut = makeSUT ( opacity: - 1 )
46+
47+ XCTAssertEqual ( sut. opacity, 0 )
48+ }
49+
50+ func test_init_tooLargeOpacity( ) {
51+ let sut = makeSUT ( opacity: 5 )
52+
53+ XCTAssertEqual ( sut. opacity, 1 )
54+ }
55+
3656 func test_apply_doesNotSetShadowPathWhenUseShadowPathIsFalse( ) {
3757 let sut = makeSUT ( useShadowPath: false )
38- let layer = CALayer ( )
58+ let layer = makeLayer ( )
3959
4060 sut. apply ( layer: layer)
4161
@@ -44,54 +64,105 @@ final class ElevationTests: XCTestCase {
4464
4565 func test_apply_setsShadowPathWhenUseShadowPathIsTrue( ) {
4666 let sut = makeSUT ( useShadowPath: true )
47- let layer = CALayer ( )
48-
67+ let layer = makeLayer ( )
68+
4969 sut. apply ( layer: layer)
50-
70+
5171 XCTAssertNotNil ( layer. shadowPath)
5272 }
53-
73+
74+ func test_apply_usesLayerRadiusWhenCornerRadiusIsNil( ) {
75+ let sut = makeSUT ( xOffset: 0 , yOffset: 0 , spread: 0 , useShadowPath: true )
76+ let layer = makeLayer ( cornerRadius: 4 )
77+
78+ sut. apply ( layer: layer)
79+
80+ XCTAssertEqual ( layer. shadowPath, UIBezierPath ( roundedRect: layer. bounds, cornerRadius: 4 ) . cgPath)
81+ }
82+
83+ func test_apply_usesCornerRadiusWhenNotNil( ) {
84+ let sut = makeSUT ( xOffset: 0 , yOffset: 0 , spread: 0 , useShadowPath: true )
85+ let layer = makeLayer ( cornerRadius: 4 )
86+
87+ sut. apply ( layer: layer, cornerRadius: 6 )
88+
89+ XCTAssertEqual ( layer. shadowPath, UIBezierPath ( roundedRect: layer. bounds, cornerRadius: 6 ) . cgPath)
90+ }
91+
92+ func test_apply_combinesRadiusAndSpread( ) {
93+ let spread : CGFloat = 8
94+ let radius : CGFloat = 4
95+ let sut = makeSUT ( xOffset: 0 , yOffset: 0 , spread: spread, useShadowPath: true )
96+ let layer = makeLayer ( cornerRadius: radius)
97+
98+ sut. apply ( layer: layer)
99+
100+ let rect = layer. bounds. insetBy ( dx: - spread, dy: - spread)
101+ XCTAssertEqual ( layer. shadowPath, UIBezierPath ( roundedRect: rect, cornerRadius: radius + spread) . cgPath)
102+ }
103+
104+ func test_apply_floorsRadiusAndSpreadToZero( ) {
105+ let spread : CGFloat = - 8
106+ let radius : CGFloat = 4
107+ let sut = makeSUT ( xOffset: 0 , yOffset: 0 , spread: spread, useShadowPath: true )
108+ let layer = makeLayer ( cornerRadius: radius)
109+
110+ sut. apply ( layer: layer)
111+
112+ let rect = layer. bounds. insetBy ( dx: - spread, dy: - spread)
113+ XCTAssertEqual ( layer. shadowPath, UIBezierPath ( roundedRect: rect, cornerRadius: 0 ) . cgPath)
114+ }
115+
54116 func test_apply_setsShadowPropertiesWhenUseShadowPathIsFalse( ) {
55117 let sut = makeSUT ( useShadowPath: false )
56- let layer = CALayer ( )
118+ let layer = makeLayer ( )
57119
58120 sut. apply ( layer: layer)
59121
60122 XCTAssertEqual ( layer. shadowOffset, CGSize ( width: 1 , height: 1 ) )
61123 XCTAssertEqual ( layer. shadowColor, UIColor . red. cgColor)
62- XCTAssertEqual ( layer. shadowOpacity, 5 )
63- XCTAssertEqual ( layer. shadowRadius, sut. blur / 2 )
124+ XCTAssertEqual ( layer. shadowOpacity, 0. 5)
125+ XCTAssertEqual ( layer. shadowRadius, sut. blur / 2.5 )
64126 }
65127
66128 func test_apply_setsShadowPropertiesWhenUseShadowPathIsTrue( ) {
67129 let sut = makeSUT ( useShadowPath: true )
68- let layer = CALayer ( )
130+ let layer = makeLayer ( )
69131
70132 sut. apply ( layer: layer)
71133
72134 XCTAssertEqual ( layer. shadowOffset, CGSize ( width: 1 , height: 1 ) )
73135 XCTAssertEqual ( layer. shadowColor, UIColor . red. cgColor)
74- XCTAssertEqual ( layer. shadowOpacity, 5 )
75- XCTAssertEqual ( layer. shadowRadius, sut. blur / 2 )
136+ XCTAssertEqual ( layer. shadowOpacity, 0. 5)
137+ XCTAssertEqual ( layer. shadowRadius, sut. blur / 2.5 )
76138 }
77139}
78140
79141private extension ElevationTests {
80142 func makeSUT(
81- offset: CGSize = CGSize ( width: 1 , height: 1 ) ,
143+ xOffset: CGFloat = 1 ,
144+ yOffset: CGFloat = 1 ,
82145 blur: CGFloat = 2 ,
83146 spread: CGFloat = 3 ,
84147 color: UIColor = . red,
85- opacity: Float = 5 ,
148+ opacity: Float = 0. 5,
86149 useShadowPath: Bool = true
87150 ) -> Elevation {
88151 Elevation (
89- offset: offset,
152+ xOffset: xOffset,
153+ yOffset: yOffset,
90154 blur: blur,
91155 spread: spread,
92156 color: color,
93157 opacity: opacity,
94158 useShadowPath: useShadowPath
95159 )
96160 }
161+
162+ func makeLayer( cornerRadius: CGFloat = 0 ) -> CALayer {
163+ let layer = CALayer ( )
164+ layer. bounds = CGRect ( origin: . zero, size: CGSize ( width: 64 , height: 64 ) )
165+ layer. cornerRadius = cornerRadius
166+ return layer
167+ }
97168}
0 commit comments