1
- @testable import Defaults
2
1
import SwiftUI
3
- import XCTest
2
+ import Testing
3
+ @testable import Defaults
4
4
5
- final class MockStorage : DefaultsKeyValueStore {
5
+ private final class MockStorage : DefaultsKeyValueStore {
6
6
private var pairs : [ String : Any ] = [ : ]
7
7
private let queue = DispatchQueue ( label: " a " )
8
8
@@ -51,89 +51,83 @@ final class MockStorage: DefaultsKeyValueStore {
51
51
52
52
@discardableResult
53
53
func synchronize( ) -> Bool {
54
- let pairs = queue. sync {
55
- Array ( self . pairs. keys)
56
- }
54
+ let pairs = queue. sync { Array ( self . pairs. keys) }
57
55
NotificationCenter . default. post ( Notification ( name: NSUbiquitousKeyValueStore . didChangeExternallyNotification, userInfo: [ NSUbiquitousKeyValueStoreChangedKeysKey: pairs] ) )
58
56
return true
59
57
}
60
58
}
61
59
62
60
private let mockStorage = MockStorage ( )
63
61
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 ( ) {
67
67
Defaults . iCloud. isDebug = true
68
68
Defaults . iCloud. syncOnChange = true
69
69
Defaults . iCloud. synchronizer = iCloudSynchronizer ( remoteStorage: mockStorage)
70
70
}
71
71
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 {
81
73
mockStorage. removeAll ( )
82
74
Defaults . iCloud. removeAll ( )
83
- Defaults . removeAll ( )
75
+ Defaults . removeAll ( suite : suite )
84
76
}
85
77
86
78
private func updateMockStorage( key: String , value: some Any , _ date: Date ? = nil ) {
87
79
mockStorage. set ( [ date ?? Date ( ) , value] , forKey: key)
88
80
}
89
81
82
+ @Test
90
83
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 )
93
86
94
87
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 )
97
90
let name_expected = [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " ]
98
91
let quality_expected = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ]
99
92
100
93
for index in 0 ..< name_expected. count {
101
94
Defaults [ name] = name_expected [ index]
102
95
Defaults [ quality] = quality_expected [ index]
103
96
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] )
106
99
}
107
100
108
101
updateMockStorage ( key: quality. name, value: 8.0 )
109
102
updateMockStorage ( key: name. name, value: " 8 " )
110
103
mockStorage. synchronize ( )
111
104
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 " )
114
107
115
108
Defaults [ name] = " 9 "
116
109
Defaults [ quality] = 9.0
117
110
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 )
120
113
121
114
updateMockStorage ( key: quality. name, value: 10 )
122
115
updateMockStorage ( key: name. name, value: " 10 " )
123
116
mockStorage. synchronize ( )
124
117
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 " )
127
120
}
128
121
122
+ @Test
129
123
func testDidChangeExternallyNotification( ) async {
130
124
updateMockStorage ( key: " testDidChangeExternallyNotification_name " , value: " 0 " )
131
125
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 )
134
128
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 )
137
131
let name_expected = [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " ]
138
132
let quality_expected = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ]
139
133
@@ -143,60 +137,63 @@ final class DefaultsICloudTests: XCTestCase {
143
137
mockStorage. synchronize ( )
144
138
}
145
139
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 )
148
142
149
143
Defaults [ name] = " 8 "
150
144
Defaults [ quality] = 8.0
151
145
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 )
154
148
155
149
Defaults [ name] = nil
156
150
Defaults [ quality] = nil
157
151
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 )
160
154
}
161
155
156
+ @Test
162
157
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 )
165
160
let name_expected = [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " ]
166
161
let quality_expected = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ]
167
162
168
163
for index in 0 ..< name_expected. count {
169
164
Defaults [ name] = name_expected [ index]
170
165
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] )
173
168
}
174
169
175
170
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 )
178
173
}
179
174
175
+ @Test
180
176
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 )
183
179
Defaults [ name] = " 1 "
184
180
Defaults [ quality] = 1.0
185
181
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 )
188
184
189
185
Defaults . iCloud. remove ( quality)
190
186
Defaults [ name] = " 2 "
191
187
Defaults [ quality] = 1.0
192
188
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 )
195
191
}
196
192
193
+ @Test
197
194
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 )
200
197
let name_expected = [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " ]
201
198
let quality_expected = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ]
202
199
@@ -205,21 +202,22 @@ final class DefaultsICloudTests: XCTestCase {
205
202
Defaults [ quality] = quality_expected [ index]
206
203
Defaults . iCloud. syncWithoutWaiting ( name, quality, source: . local)
207
204
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] )
210
207
}
211
208
212
209
updateMockStorage ( key: name. name, value: " 8 " )
213
210
updateMockStorage ( key: quality. name, value: 8 )
214
211
Defaults . iCloud. syncWithoutWaiting ( name, quality, source: . remote)
215
212
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 " )
218
215
}
219
216
217
+ @Test
220
218
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 )
223
221
let name_expected = [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " ]
224
222
let quality_expected = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ]
225
223
@@ -228,47 +226,47 @@ final class DefaultsICloudTests: XCTestCase {
228
226
updateMockStorage ( key: quality. name, value: quality_expected [ index] )
229
227
Defaults . iCloud. syncWithoutWaiting ( name, quality, source: . remote)
230
228
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] )
233
231
}
234
232
235
233
Defaults [ name] = " 8 "
236
234
Defaults [ quality] = 8.0
237
235
Defaults . iCloud. syncWithoutWaiting ( name, quality, source: . local)
238
236
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 )
241
239
242
240
Defaults [ name] = nil
243
241
Defaults [ quality] = nil
244
242
Defaults . iCloud. syncWithoutWaiting ( name, quality, source: . local)
245
243
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 )
248
246
}
249
247
248
+ @Test
250
249
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 {
254
253
Defaults . iCloud. add ( name, quantity)
255
254
Defaults . iCloud. syncWithoutWaiting ( )
256
255
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 " )
260
258
Defaults [ name] = " 1 "
261
259
await Defaults . iCloud. waitForSyncCompletion ( )
262
- XCTAssertEqual ( mockStorage. data ( forKey: name. name) , " 1 " )
260
+ #expect ( mockStorage. data ( forKey: name. name) == " 1 " )
263
261
}
264
262
263
+ @Test
265
264
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 )
268
267
269
268
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
273
271
}
274
272
}
0 commit comments