|
6 | 6 | // Copyright © 2016 Sacha Durand Saint Omer. All rights reserved.
|
7 | 7 | //
|
8 | 8 |
|
9 |
| -import XCTest |
| 9 | +import Testing |
| 10 | +import Numerics |
| 11 | +import UIKit |
| 12 | +import Stevia |
10 | 13 |
|
11 |
| -let magicalIphoneXShift = 0.17 |
12 | 14 |
|
13 |
| -@MainActor class CenterTests: XCTestCase { |
| 15 | +@Suite |
| 16 | +@MainActor struct CenterTests { |
14 | 17 |
|
15 |
| - var win: UIWindow! |
16 |
| - var ctrler: UIViewController! |
17 |
| - var v: UIView! |
| 18 | + let win = UIWindow(frame: UIScreen.main.bounds) |
| 19 | + var ctrler = UIViewController() |
| 20 | + var v = UIView() |
18 | 21 |
|
19 |
| - override func setUp() async throws { |
20 |
| -// try await super.setUp() |
21 |
| - win = UIWindow(frame: UIScreen.main.bounds) |
22 |
| - ctrler = UIViewController() |
| 22 | + init() { |
23 | 23 | win.rootViewController = ctrler
|
24 |
| - v = UIView() |
25 |
| - ctrler.view.subviews { v! } |
26 |
| - |
27 |
| - // verify view h as default values |
28 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
29 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
30 |
| - XCTAssertEqual(v.frame.width, 0, accuracy: CGFloat(Float.ulpOfOne)) |
31 |
| - XCTAssertEqual(v.frame.height, 0, accuracy: CGFloat(Float.ulpOfOne)) |
32 |
| - |
| 24 | + ctrler.view.subviews { v } |
33 | 25 | v.size(100)
|
34 | 26 | ctrler.view.layoutIfNeeded()
|
35 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
36 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
37 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
38 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
39 |
| - } |
40 |
| - |
41 |
| - override func tearDown() { |
42 |
| - super.tearDown() |
43 | 27 | }
|
44 | 28 |
|
45 |
| - func testCenterHorizontally() { |
| 29 | + @Test |
| 30 | + func centerHorizontally() { |
46 | 31 | v.centerHorizontally()
|
47 | 32 | ctrler.view.setNeedsLayout()
|
48 | 33 | ctrler.view.layoutIfNeeded()
|
49 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
50 |
| - XCTAssertEqual(v.frame.origin.x, |
51 |
| - ctrler.view.frame.width/2.0 - (v.frame.width/2.0), |
52 |
| - accuracy: CGFloat(magicalIphoneXShift)) |
53 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
54 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 34 | + #expect(v.frame.origin.y == 0) |
| 35 | + #expect(isApproximatelyEqual(v.frame.origin.x, ctrler.view.frame.width/2.0 - (v.frame.width/2.0))) |
| 36 | + #expect(v.frame.width == 100) |
| 37 | + #expect(v.frame.height == 100) |
55 | 38 | }
|
56 | 39 |
|
57 |
| - func testCenterHorizontallyWithOffsetDouble() { |
| 40 | + @Test |
| 41 | + func centerHorizontallyWithOffsetDouble() { |
58 | 42 | v.centerHorizontally(offset: Double(50))
|
59 | 43 | ctrler.view.setNeedsLayout()
|
60 | 44 | ctrler.view.layoutIfNeeded()
|
61 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
62 |
| - XCTAssertEqual(v.frame.origin.x - 50, |
63 |
| - ctrler.view.frame.width/2.0 - (v.frame.width/2.0), |
64 |
| - accuracy: CGFloat(magicalIphoneXShift)) |
65 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
66 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 45 | + #expect(v.frame.origin.y == 0) |
| 46 | + let val = v.frame.origin.x - 50 |
| 47 | + #expect(isApproximatelyEqual(val, ctrler.view.frame.width/2.0 - (v.frame.width/2.0))) |
| 48 | + #expect(v.frame.width == 100) |
| 49 | + #expect(v.frame.height == 100) |
67 | 50 | }
|
68 | 51 |
|
69 |
| - func testCenterHorizontallyWithOffsetCGFloat() { |
| 52 | + @Test |
| 53 | + func centerHorizontallyWithOffsetCGFloat() { |
70 | 54 | v.centerHorizontally(offset: CGFloat(50))
|
71 | 55 | ctrler.view.setNeedsLayout()
|
72 | 56 | ctrler.view.layoutIfNeeded()
|
73 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
74 |
| - XCTAssertEqual(v.frame.origin.x - 50, |
75 |
| - ctrler.view.frame.width/2.0 - (v.frame.width/2.0), |
76 |
| - accuracy: CGFloat(magicalIphoneXShift)) |
77 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
78 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 57 | + #expect(v.frame.origin.y == 0) |
| 58 | + let val = v.frame.origin.x - 50 |
| 59 | + #expect(isApproximatelyEqual(val, (ctrler.view.frame.width/2.0 - (v.frame.width/2.0)))) |
| 60 | + #expect(v.frame.width == 100) |
| 61 | + #expect(v.frame.height == 100) |
79 | 62 | }
|
80 | 63 |
|
81 |
| - func testCenterHorizontallyWithOffsetInt() { |
| 64 | + @Test |
| 65 | + func centerHorizontallyWithOffsetInt() { |
82 | 66 | v.centerHorizontally(offset: Int(50))
|
83 | 67 | ctrler.view.setNeedsLayout()
|
84 | 68 | ctrler.view.layoutIfNeeded()
|
85 |
| - XCTAssertEqual(v.frame.origin.y, 0, accuracy: CGFloat(Float.ulpOfOne)) |
86 |
| - XCTAssertEqual(v.frame.origin.x - 50, |
87 |
| - ctrler.view.frame.width/2.0 - (v.frame.width/2.0), |
88 |
| - accuracy: CGFloat(magicalIphoneXShift)) |
89 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
90 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 69 | + #expect(v.frame.origin.y == 0) |
| 70 | + let val = v.frame.origin.x - 50 |
| 71 | + #expect(isApproximatelyEqual(val, (ctrler.view.frame.width/2.0 - (v.frame.width/2.0)))) |
| 72 | + #expect(v.frame.width == 100) |
| 73 | + #expect(v.frame.height == 100) |
91 | 74 | }
|
92 | 75 |
|
93 |
| - func testCenterVertically() { |
| 76 | + @Test |
| 77 | + func centerVertically() { |
94 | 78 | v.centerVertically()
|
95 | 79 | ctrler.view.setNeedsLayout()
|
96 | 80 | ctrler.view.layoutIfNeeded()
|
97 |
| - XCTAssertEqual(v.frame.origin.y, |
98 |
| - ctrler.view.frame.height/2.0 - (v.frame.height/2.0), |
99 |
| - accuracy: CGFloat(Float.ulpOfOne)) |
100 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
101 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
102 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 81 | + #expect(v.frame.origin.y == ctrler.view.frame.height/2.0 - (v.frame.height/2.0)) |
| 82 | + #expect(v.frame.origin.x == 0) |
| 83 | + #expect(v.frame.width == 100) |
| 84 | + #expect(v.frame.height == 100) |
103 | 85 | }
|
104 | 86 |
|
105 |
| - func testCenterVerticallyWithOffsetDouble() { |
| 87 | + @Test |
| 88 | + func centerVerticallyWithOffsetDouble() { |
106 | 89 | v.centerVertically(offset: Double(50))
|
107 | 90 | ctrler.view.setNeedsLayout()
|
108 | 91 | ctrler.view.layoutIfNeeded()
|
109 |
| - XCTAssertEqual(v.frame.origin.y - 50, |
110 |
| - ctrler.view.frame.height/2.0 - (v.frame.height/2.0), |
111 |
| - accuracy: CGFloat(Float.ulpOfOne)) |
112 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
113 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
114 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 92 | + let val = v.frame.origin.y - 50 |
| 93 | + #expect(isApproximatelyEqual(val, (ctrler.view.frame.height/2.0 - (v.frame.height/2.0)))) |
| 94 | + #expect(v.frame.origin.x == 0) |
| 95 | + #expect(v.frame.width == 100) |
| 96 | + #expect(v.frame.height == 100) |
115 | 97 | }
|
116 | 98 |
|
117 |
| - func testCenterVerticallyWithOffsetCGFloat() { |
| 99 | + @Test |
| 100 | + func centerVerticallyWithOffsetCGFloat() { |
118 | 101 | v.centerVertically(offset: CGFloat(50))
|
119 | 102 | ctrler.view.setNeedsLayout()
|
120 | 103 | ctrler.view.layoutIfNeeded()
|
121 |
| - XCTAssertEqual(v.frame.origin.y - 50, |
122 |
| - ctrler.view.frame.height/2.0 - (v.frame.height/2.0), |
123 |
| - accuracy: CGFloat(Float.ulpOfOne)) |
124 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
125 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
126 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 104 | + let val = v.frame.origin.y - 50 |
| 105 | + #expect(isApproximatelyEqual(val, (ctrler.view.frame.height/2.0 - (v.frame.height/2.0)))) |
| 106 | + #expect(v.frame.origin.x == 0) |
| 107 | + #expect(v.frame.width == 100) |
| 108 | + #expect(v.frame.height == 100) |
127 | 109 | }
|
128 | 110 |
|
129 |
| - func testCenterVerticallyWithOffsetInt() { |
| 111 | + @Test |
| 112 | + func centerVerticallyWithOffsetInt() { |
130 | 113 | v.centerVertically(offset: Int(50))
|
131 | 114 | ctrler.view.setNeedsLayout()
|
132 | 115 | ctrler.view.layoutIfNeeded()
|
133 |
| - XCTAssertEqual(v.frame.origin.y - 50, |
134 |
| - ctrler.view.frame.height/2.0 - (v.frame.height/2.0), |
135 |
| - accuracy: CGFloat(Float.ulpOfOne)) |
136 |
| - XCTAssertEqual(v.frame.origin.x, 0, accuracy: CGFloat(Float.ulpOfOne)) |
137 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
138 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 116 | + |
| 117 | + let val = v.frame.origin.y - 50 |
| 118 | + #expect(isApproximatelyEqual(val, (ctrler.view.frame.height/2.0 - (v.frame.height/2.0)))) |
| 119 | + #expect(v.frame.origin.x == 0) |
| 120 | + #expect(v.frame.width == 100) |
| 121 | + #expect(v.frame.height == 100) |
139 | 122 | }
|
140 | 123 |
|
141 |
| - func testCenterInContainer() { |
| 124 | + @Test |
| 125 | + func centerInContainer() { |
142 | 126 | v.centerInContainer()
|
143 | 127 | ctrler.view.setNeedsLayout()
|
144 | 128 | ctrler.view.layoutIfNeeded()
|
145 |
| - XCTAssertEqual(v.frame.origin.y, |
146 |
| - ctrler.view.frame.height/2.0 - (v.frame.height/2.0), |
147 |
| - accuracy: CGFloat(Float.ulpOfOne)) |
148 |
| - XCTAssertEqual(v.frame.origin.x, |
149 |
| - ctrler.view.frame.width/2.0 - (v.frame.width/2.0), |
150 |
| - accuracy: CGFloat(magicalIphoneXShift)) |
151 |
| - XCTAssertEqual(v.frame.width, 100, accuracy: CGFloat(Float.ulpOfOne)) |
152 |
| - XCTAssertEqual(v.frame.height, 100, accuracy: CGFloat(Float.ulpOfOne)) |
| 129 | + |
| 130 | + #expect(v.frame.origin.y == ctrler.view.frame.height/2.0 - (v.frame.height/2.0)) |
| 131 | + #expect(isApproximatelyEqual(v.frame.origin.x, ctrler.view.frame.width/2.0 - (v.frame.width/2.0))) |
| 132 | + #expect(v.frame.width == 100) |
| 133 | + #expect(v.frame.height == 100) |
| 134 | + #expect(isApproximatelyEqual(v.frame.origin.y, ctrler.view.frame.height/2.0 - (v.frame.height/2.0))) |
| 135 | + #expect(isApproximatelyEqual(v.frame.origin.x, ctrler.view.frame.width/2.0 - (v.frame.width/2.0))) |
| 136 | + #expect(v.frame.height == 100) |
153 | 137 | }
|
154 | 138 | }
|
| 139 | + |
| 140 | +func isApproximatelyEqual(_ a: Double, _ b: Double) -> Bool { |
| 141 | + return a.isApproximatelyEqual(to: b, absoluteTolerance: 0.5) |
| 142 | +} |
0 commit comments