Skip to content

Commit 72264f1

Browse files
committed
Convert tests to Swift Testing
1 parent 4c009d5 commit 72264f1

24 files changed

+1643
-3957
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: macos-14
88
steps:
99
- uses: actions/checkout@v4
10-
- run: sudo xcode-select -switch /Applications/Xcode_15.3.app
10+
- run: sudo xcode-select -switch /Applications/Xcode_16.app
1111
- run: swift test
1212
lint:
1313
runs-on: ubuntu-latest

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:5.10
1+
// swift-tools-version:5.11
22
import PackageDescription
33

44
let package = Package(

Sources/Defaults/Defaults+Extensions.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,13 @@ extension UserDefaults: DefaultsKeyValueStore {}
179179

180180
extension DefaultsLockProtocol {
181181
@discardableResult
182-
func with<R>(_ body: @Sendable () throws -> R) rethrows -> R where R: Sendable {
182+
func with<R, E>(_ body: @Sendable () throws(E) -> R) throws(E) -> R where R: Sendable {
183183
lock()
184+
184185
defer {
185-
self.unlock()
186+
unlock()
186187
}
188+
187189
return try body()
188190
}
189191
}

Sources/Defaults/Defaults+Protocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,5 @@ protocol DefaultsLockProtocol {
169169

170170
func unlock()
171171

172-
func with<R>(_ body: @Sendable () throws -> R) rethrows -> R where R: Sendable
172+
func with<R, E>(_ body: @Sendable () throws(E) -> R) throws(E) -> R where R: Sendable
173173
}
Lines changed: 77 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
@testable import Defaults
21
import SwiftUI
3-
import XCTest
2+
import Testing
3+
@testable import Defaults
44

5-
final class MockStorage: DefaultsKeyValueStore {
5+
private final class MockStorage: DefaultsKeyValueStore {
66
private var pairs: [String: Any] = [:]
77
private let queue = DispatchQueue(label: "a")
88

@@ -51,89 +51,83 @@ final class MockStorage: DefaultsKeyValueStore {
5151

5252
@discardableResult
5353
func synchronize() -> Bool {
54-
let pairs = queue.sync {
55-
Array(self.pairs.keys)
56-
}
54+
let pairs = queue.sync { Array(self.pairs.keys) }
5755
NotificationCenter.default.post(Notification(name: NSUbiquitousKeyValueStore.didChangeExternallyNotification, userInfo: [NSUbiquitousKeyValueStoreChangedKeysKey: pairs]))
5856
return true
5957
}
6058
}
6159

6260
private let mockStorage = MockStorage()
6361

64-
@available(iOS 15, tvOS 15, watchOS 8, visionOS 1.0, *)
65-
final class DefaultsICloudTests: XCTestCase {
66-
override final class func setUp() {
62+
@Suite(.serialized)
63+
final class DefaultsICloudTests {
64+
private let suite = createSuite()
65+
66+
init() {
6767
Defaults.iCloud.isDebug = true
6868
Defaults.iCloud.syncOnChange = true
6969
Defaults.iCloud.synchronizer = iCloudSynchronizer(remoteStorage: mockStorage)
7070
}
7171

72-
override func setUp() {
73-
super.setUp()
74-
mockStorage.removeAll()
75-
Defaults.iCloud.removeAll()
76-
Defaults.removeAll()
77-
}
78-
79-
override func tearDown() {
80-
super.tearDown()
72+
deinit {
8173
mockStorage.removeAll()
8274
Defaults.iCloud.removeAll()
83-
Defaults.removeAll()
75+
Defaults.removeAll(suite: suite)
8476
}
8577

8678
private func updateMockStorage(key: String, value: some Any, _ date: Date? = nil) {
8779
mockStorage.set([date ?? Date(), value], forKey: key)
8880
}
8981

82+
@Test
9083
func testICloudInitialize() async {
91-
let name = Defaults.Key<String>("testICloudInitialize_name", default: "0", iCloud: true)
92-
let quality = Defaults.Key<Double>("testICloudInitialize_quality", default: 0.0, iCloud: true)
84+
let name = Defaults.Key<String>("testICloudInitialize_name", default: "0", suite: suite, iCloud: true)
85+
let quality = Defaults.Key<Double>("testICloudInitialize_quality", default: 0.0, suite: suite, iCloud: true)
9386

9487
await Defaults.iCloud.waitForSyncCompletion()
95-
XCTAssertNil(mockStorage.data(forKey: name.name))
96-
XCTAssertNil(mockStorage.data(forKey: quality.name))
88+
#expect(mockStorage.data(forKey: name.name) == nil)
89+
#expect(mockStorage.data(forKey: quality.name) == nil)
9790
let name_expected = ["1", "2", "3", "4", "5", "6", "7"]
9891
let quality_expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
9992

10093
for index in 0..<name_expected.count {
10194
Defaults[name] = name_expected[index]
10295
Defaults[quality] = quality_expected[index]
10396
await Defaults.iCloud.waitForSyncCompletion()
104-
XCTAssertEqual(mockStorage.data(forKey: name.name), name_expected[index])
105-
XCTAssertEqual(mockStorage.data(forKey: quality.name), quality_expected[index])
97+
#expect(mockStorage.data(forKey: name.name) == name_expected[index])
98+
#expect(mockStorage.data(forKey: quality.name) == quality_expected[index])
10699
}
107100

108101
updateMockStorage(key: quality.name, value: 8.0)
109102
updateMockStorage(key: name.name, value: "8")
110103
mockStorage.synchronize()
111104
await Defaults.iCloud.waitForSyncCompletion()
112-
XCTAssertEqual(Defaults[quality], 8.0)
113-
XCTAssertEqual(Defaults[name], "8")
105+
#expect(Defaults[quality] == 8.0)
106+
#expect(Defaults[name] == "8")
114107

115108
Defaults[name] = "9"
116109
Defaults[quality] = 9.0
117110
await Defaults.iCloud.waitForSyncCompletion()
118-
XCTAssertEqual(mockStorage.data(forKey: name.name), "9")
119-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 9.0)
111+
#expect(mockStorage.data(forKey: name.name) == "9")
112+
#expect(mockStorage.data(forKey: quality.name) == 9.0)
120113

121114
updateMockStorage(key: quality.name, value: 10)
122115
updateMockStorage(key: name.name, value: "10")
123116
mockStorage.synchronize()
124117
await Defaults.iCloud.waitForSyncCompletion()
125-
XCTAssertEqual(Defaults[quality], 10.0)
126-
XCTAssertEqual(Defaults[name], "10")
118+
#expect(Defaults[quality] == 10.0)
119+
#expect(Defaults[name] == "10")
127120
}
128121

122+
@Test
129123
func testDidChangeExternallyNotification() async {
130124
updateMockStorage(key: "testDidChangeExternallyNotification_name", value: "0")
131125
updateMockStorage(key: "testDidChangeExternallyNotification_quality", value: 0.0)
132-
let name = Defaults.Key<String?>("testDidChangeExternallyNotification_name", iCloud: true)
133-
let quality = Defaults.Key<Double?>("testDidChangeExternallyNotification_quality", iCloud: true)
126+
let name = Defaults.Key<String?>("testDidChangeExternallyNotification_name", suite: suite, iCloud: true)
127+
let quality = Defaults.Key<Double?>("testDidChangeExternallyNotification_quality", suite: suite, iCloud: true)
134128
await Defaults.iCloud.waitForSyncCompletion()
135-
XCTAssertEqual(Defaults[name], "0")
136-
XCTAssertEqual(Defaults[quality], 0.0)
129+
#expect(Defaults[name] == "0")
130+
#expect(Defaults[quality] == 0.0)
137131
let name_expected = ["1", "2", "3", "4", "5", "6", "7"]
138132
let quality_expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
139133

@@ -143,60 +137,63 @@ final class DefaultsICloudTests: XCTestCase {
143137
mockStorage.synchronize()
144138
}
145139
await Defaults.iCloud.waitForSyncCompletion()
146-
XCTAssertEqual(Defaults[name], "7")
147-
XCTAssertEqual(Defaults[quality], 7.0)
140+
#expect(Defaults[name] == "7")
141+
#expect(Defaults[quality] == 7.0)
148142

149143
Defaults[name] = "8"
150144
Defaults[quality] = 8.0
151145
await Defaults.iCloud.waitForSyncCompletion()
152-
XCTAssertEqual(mockStorage.data(forKey: name.name), "8")
153-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 8.0)
146+
#expect(mockStorage.data(forKey: name.name) == "8")
147+
#expect(mockStorage.data(forKey: quality.name) == 8.0)
154148

155149
Defaults[name] = nil
156150
Defaults[quality] = nil
157151
await Defaults.iCloud.waitForSyncCompletion()
158-
XCTAssertNil(mockStorage.data(forKey: name.name))
159-
XCTAssertNil(mockStorage.data(forKey: quality.name))
152+
#expect(mockStorage.data(forKey: name.name) == nil)
153+
#expect(mockStorage.data(forKey: quality.name) == nil)
160154
}
161155

156+
@Test
162157
func testICloudInitializeSyncLast() async {
163-
let name = Defaults.Key<String>("testICloudInitializeSyncLast_name", default: "0", iCloud: true)
164-
let quality = Defaults.Key<Double>("testICloudInitializeSyncLast_quality", default: 0.0, iCloud: true)
158+
let name = Defaults.Key<String>("testICloudInitializeSyncLast_name", default: "0", suite: suite, iCloud: true)
159+
let quality = Defaults.Key<Double>("testICloudInitializeSyncLast_quality", default: 0.0, suite: suite, iCloud: true)
165160
let name_expected = ["1", "2", "3", "4", "5", "6", "7"]
166161
let quality_expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
167162

168163
for index in 0..<name_expected.count {
169164
Defaults[name] = name_expected[index]
170165
Defaults[quality] = quality_expected[index]
171-
XCTAssertEqual(Defaults[name], name_expected[index])
172-
XCTAssertEqual(Defaults[quality], quality_expected[index])
166+
#expect(Defaults[name] == name_expected[index])
167+
#expect(Defaults[quality] == quality_expected[index])
173168
}
174169

175170
await Defaults.iCloud.waitForSyncCompletion()
176-
XCTAssertEqual(mockStorage.data(forKey: name.name), "7")
177-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 7.0)
171+
#expect(mockStorage.data(forKey: name.name) == "7")
172+
#expect(mockStorage.data(forKey: quality.name) == 7.0)
178173
}
179174

175+
@Test
180176
func testRemoveKey() async {
181-
let name = Defaults.Key<String>("testRemoveKey_name", default: "0", iCloud: true)
182-
let quality = Defaults.Key<Double>("testRemoveKey_quality", default: 0.0, iCloud: true)
177+
let name = Defaults.Key<String>("testRemoveKey_name", default: "0", suite: suite, iCloud: true)
178+
let quality = Defaults.Key<Double>("testRemoveKey_quality", default: 0.0, suite: suite, iCloud: true)
183179
Defaults[name] = "1"
184180
Defaults[quality] = 1.0
185181
await Defaults.iCloud.waitForSyncCompletion()
186-
XCTAssertEqual(mockStorage.data(forKey: name.name), "1")
187-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 1.0)
182+
#expect(mockStorage.data(forKey: name.name) == "1")
183+
#expect(mockStorage.data(forKey: quality.name) == 1.0)
188184

189185
Defaults.iCloud.remove(quality)
190186
Defaults[name] = "2"
191187
Defaults[quality] = 1.0
192188
await Defaults.iCloud.waitForSyncCompletion()
193-
XCTAssertEqual(mockStorage.data(forKey: name.name), "2")
194-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 1.0)
189+
#expect(mockStorage.data(forKey: name.name) == "2")
190+
#expect(mockStorage.data(forKey: quality.name) == 1.0)
195191
}
196192

193+
@Test
197194
func testSyncKeysFromLocal() async {
198-
let name = Defaults.Key<String>("testSyncKeysFromLocal_name", default: "0")
199-
let quality = Defaults.Key<Double>("testSyncKeysFromLocal_quality", default: 0.0)
195+
let name = Defaults.Key<String>("testSyncKeysFromLocal_name", default: "0", suite: suite)
196+
let quality = Defaults.Key<Double>("testSyncKeysFromLocal_quality", default: 0.0, suite: suite)
200197
let name_expected = ["1", "2", "3", "4", "5", "6", "7"]
201198
let quality_expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
202199

@@ -205,21 +202,22 @@ final class DefaultsICloudTests: XCTestCase {
205202
Defaults[quality] = quality_expected[index]
206203
Defaults.iCloud.syncWithoutWaiting(name, quality, source: .local)
207204
await Defaults.iCloud.waitForSyncCompletion()
208-
XCTAssertEqual(mockStorage.data(forKey: name.name), name_expected[index])
209-
XCTAssertEqual(mockStorage.data(forKey: quality.name), quality_expected[index])
205+
#expect(mockStorage.data(forKey: name.name) == name_expected[index])
206+
#expect(mockStorage.data(forKey: quality.name) == quality_expected[index])
210207
}
211208

212209
updateMockStorage(key: name.name, value: "8")
213210
updateMockStorage(key: quality.name, value: 8)
214211
Defaults.iCloud.syncWithoutWaiting(name, quality, source: .remote)
215212
await Defaults.iCloud.waitForSyncCompletion()
216-
XCTAssertEqual(Defaults[quality], 8.0)
217-
XCTAssertEqual(Defaults[name], "8")
213+
#expect(Defaults[quality] == 8.0)
214+
#expect(Defaults[name] == "8")
218215
}
219216

217+
@Test
220218
func testSyncKeysFromRemote() async {
221-
let name = Defaults.Key<String?>("testSyncKeysFromRemote_name")
222-
let quality = Defaults.Key<Double?>("testSyncKeysFromRemote_quality")
219+
let name = Defaults.Key<String?>("testSyncKeysFromRemote_name", suite: suite)
220+
let quality = Defaults.Key<Double?>("testSyncKeysFromRemote_quality", suite: suite)
223221
let name_expected = ["1", "2", "3", "4", "5", "6", "7"]
224222
let quality_expected = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
225223

@@ -228,47 +226,47 @@ final class DefaultsICloudTests: XCTestCase {
228226
updateMockStorage(key: quality.name, value: quality_expected[index])
229227
Defaults.iCloud.syncWithoutWaiting(name, quality, source: .remote)
230228
await Defaults.iCloud.waitForSyncCompletion()
231-
XCTAssertEqual(Defaults[name], name_expected[index])
232-
XCTAssertEqual(Defaults[quality], quality_expected[index])
229+
#expect(Defaults[name] == name_expected[index])
230+
#expect(Defaults[quality] == quality_expected[index])
233231
}
234232

235233
Defaults[name] = "8"
236234
Defaults[quality] = 8.0
237235
Defaults.iCloud.syncWithoutWaiting(name, quality, source: .local)
238236
await Defaults.iCloud.waitForSyncCompletion()
239-
XCTAssertEqual(mockStorage.data(forKey: name.name), "8")
240-
XCTAssertEqual(mockStorage.data(forKey: quality.name), 8.0)
237+
#expect(mockStorage.data(forKey: name.name) == "8")
238+
#expect(mockStorage.data(forKey: quality.name) == 8.0)
241239

242240
Defaults[name] = nil
243241
Defaults[quality] = nil
244242
Defaults.iCloud.syncWithoutWaiting(name, quality, source: .local)
245243
await Defaults.iCloud.waitForSyncCompletion()
246-
XCTAssertNil(mockStorage.object(forKey: name.name))
247-
XCTAssertNil(mockStorage.object(forKey: quality.name))
244+
#expect(mockStorage.object(forKey: name.name) == nil)
245+
#expect(mockStorage.object(forKey: quality.name) == nil)
248246
}
249247

248+
@Test
250249
func testAddFromDetached() async {
251-
let name = Defaults.Key<String>("testInitAddFromDetached_name", default: "0")
252-
let quantity = Defaults.Key<Bool>("testInitAddFromDetached_quantity", default: false)
253-
let task = Task.detached {
250+
let name = Defaults.Key<String>("testInitAddFromDetached_name", default: "0", suite: suite)
251+
let quantity = Defaults.Key<Bool>("testInitAddFromDetached_quantity", default: false, suite: suite)
252+
await Task.detached {
254253
Defaults.iCloud.add(name, quantity)
255254
Defaults.iCloud.syncWithoutWaiting()
256255
await Defaults.iCloud.waitForSyncCompletion()
257-
}
258-
await task.value
259-
XCTAssertEqual(mockStorage.data(forKey: name.name), "0")
256+
}.value
257+
#expect(mockStorage.data(forKey: name.name) == "0")
260258
Defaults[name] = "1"
261259
await Defaults.iCloud.waitForSyncCompletion()
262-
XCTAssertEqual(mockStorage.data(forKey: name.name), "1")
260+
#expect(mockStorage.data(forKey: name.name) == "1")
263261
}
264262

263+
@Test
265264
func testICloudInitializeFromDetached() async {
266-
let task = Task.detached {
267-
let name = Defaults.Key<String>("testICloudInitializeFromDetached_name", default: "0", iCloud: true)
265+
await Task.detached {
266+
let name = Defaults.Key<String>("testICloudInitializeFromDetached_name", default: "0", suite: self.suite, iCloud: true)
268267

269268
await Defaults.iCloud.waitForSyncCompletion()
270-
XCTAssertNil(mockStorage.data(forKey: name.name))
271-
}
272-
await task.value
269+
#expect(mockStorage.data(forKey: name.name) == nil)
270+
}.value
273271
}
274272
}

0 commit comments

Comments
 (0)