1
1
import SwiftFormatRules
2
2
3
3
final class UseSynthesizedInitializerTests : LintOrFormatRuleTestCase {
4
+ override func setUp( ) {
5
+ self . shouldCheckForUnassertedDiagnostics = true
6
+ }
7
+
4
8
func testMemberwiseInitializerIsDiagnosed( ) {
5
9
let input =
6
10
"""
7
11
public struct Person {
8
12
9
13
public var name: String
10
14
let phoneNumber: String
11
- private let address: String
15
+ internal let address: String
12
16
13
17
init(name: String, phoneNumber: String, address: String) {
14
18
self.name = name
@@ -19,8 +23,28 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
19
23
"""
20
24
21
25
performLint ( UseSynthesizedInitializer . self, input: input)
22
- XCTAssertDiagnosed ( . removeRedundantInitializer)
23
- XCTAssertNotDiagnosed ( . removeRedundantInitializer)
26
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 7 )
27
+ }
28
+
29
+ func testInternalMemberwiseInitializerIsDiagnosed( ) {
30
+ let input =
31
+ """
32
+ public struct Person {
33
+
34
+ public var name: String
35
+ let phoneNumber: String
36
+ internal let address: String
37
+
38
+ internal init(name: String, phoneNumber: String, address: String) {
39
+ self.name = name
40
+ self.address = address
41
+ self.phoneNumber = phoneNumber
42
+ }
43
+ }
44
+ """
45
+
46
+ performLint ( UseSynthesizedInitializer . self, input: input)
47
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 7 )
24
48
}
25
49
26
50
func testMemberwiseInitializerWithDefaultArgumentIsDiagnosed( ) {
@@ -30,7 +54,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
30
54
31
55
public var name: String = " John Doe "
32
56
let phoneNumber: String
33
- private let address: String
57
+ internal let address: String
34
58
35
59
init(name: String = " John Doe " , phoneNumber: String, address: String) {
36
60
self.name = name
@@ -40,9 +64,8 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
40
64
}
41
65
"""
42
66
43
- performLint ( UseSynthesizedInitializer . self, input: input)
44
- XCTAssertDiagnosed ( . removeRedundantInitializer)
45
- XCTAssertNotDiagnosed ( . removeRedundantInitializer)
67
+ performLint ( UseSynthesizedInitializer . self, input: input)
68
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 7 )
46
69
}
47
70
48
71
func testCustomInitializerVoidsSynthesizedInitializerWarning( ) {
@@ -81,7 +104,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
81
104
82
105
public var name: String
83
106
let phoneNumber: String
84
- private let address: String
107
+ let address: String
85
108
86
109
init(name: String = " Jane Doe " , phoneNumber: String, address: String) {
87
110
self.name = name
@@ -102,7 +125,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
102
125
103
126
public var name: String = " John Doe "
104
127
let phoneNumber: String
105
- private let address: String
128
+ let address: String
106
129
107
130
init(name: String = " Jane Doe " , phoneNumber: String, address: String) {
108
131
self.name = name
@@ -125,7 +148,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
125
148
126
149
public var name: String
127
150
var phoneNumber: String = " +15555550101 "
128
- private let address: String
151
+ let address: String
129
152
130
153
init(name: String, phoneNumber: String, address: String) {
131
154
self.name = name
@@ -146,7 +169,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
146
169
147
170
public var name: String
148
171
var phoneNumber: String?
149
- private let address: String
172
+ let address: String
150
173
151
174
init(name: String, phoneNumber: String, address: String) {
152
175
self.name = name
@@ -167,7 +190,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
167
190
168
191
public var name: String
169
192
var phoneNumber: String?
170
- private let address: String
193
+ let address: String
171
194
172
195
init(name: String, phoneNumber: String?, address: String, anotherArg: Int) {
173
196
self.name = name
@@ -188,7 +211,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
188
211
189
212
public var name: String
190
213
var phoneNumber: String?
191
- private let address: String
214
+ let address: String
192
215
193
216
init(name: String, phoneNumber: String?, address: String) {
194
217
self.name = name
@@ -211,7 +234,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
211
234
212
235
public var name: String
213
236
let phoneNumber: String
214
- private let address: String
237
+ let address: String
215
238
216
239
init?(name: String, phoneNumber: String, address: String) {
217
240
self.name = name
@@ -232,7 +255,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
232
255
233
256
public var name: String
234
257
let phoneNumber: String
235
- private let address: String
258
+ let address: String
236
259
237
260
init(name: String, phoneNumber: String, address: String) throws {
238
261
self.name = name
@@ -253,7 +276,7 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
253
276
254
277
public var name: String
255
278
let phoneNumber: String
256
- private let address: String
279
+ let address: String
257
280
258
281
public init(name: String, phoneNumber: String, address: String) {
259
282
self.name = name
@@ -266,4 +289,119 @@ final class UseSynthesizedInitializerTests: LintOrFormatRuleTestCase {
266
289
performLint ( UseSynthesizedInitializer . self, input: input)
267
290
XCTAssertNotDiagnosed ( . removeRedundantInitializer)
268
291
}
292
+
293
+ func testDefaultMemberwiseInitializerIsNotDiagnosed( ) {
294
+ // The synthesized initializer is private when any member is private, so an initializer with
295
+ // default access control (i.e. internal) is not equivalent to the synthesized initializer.
296
+ let input =
297
+ """
298
+ public struct Person {
299
+
300
+ let phoneNumber: String
301
+ private let address: String
302
+
303
+ init(phoneNumber: String, address: String) {
304
+ self.address = address
305
+ self.phoneNumber = phoneNumber
306
+ }
307
+ }
308
+ """
309
+
310
+ performLint ( UseSynthesizedInitializer . self, input: input)
311
+ XCTAssertNotDiagnosed ( . removeRedundantInitializer)
312
+ }
313
+
314
+ func testPrivateMemberwiseInitializerWithPrivateMemberIsDiagnosed( ) {
315
+ // The synthesized initializer is private when any member is private, so a private initializer
316
+ // is equivalent to the synthesized initializer.
317
+ let input =
318
+ """
319
+ public struct Person {
320
+
321
+ let phoneNumber: String
322
+ private let address: String
323
+
324
+ private init(phoneNumber: String, address: String) {
325
+ self.address = address
326
+ self.phoneNumber = phoneNumber
327
+ }
328
+ }
329
+ """
330
+
331
+ performLint ( UseSynthesizedInitializer . self, input: input)
332
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 6 )
333
+ }
334
+
335
+ func testFileprivateMemberwiseInitializerWithFileprivateMemberIsDiagnosed( ) {
336
+ // The synthesized initializer is fileprivate when any member is fileprivate, so a fileprivate
337
+ // initializer is equivalent to the synthesized initializer.
338
+ let input =
339
+ """
340
+ public struct Person {
341
+
342
+ let phoneNumber: String
343
+ fileprivate let address: String
344
+
345
+ fileprivate init(phoneNumber: String, address: String) {
346
+ self.address = address
347
+ self.phoneNumber = phoneNumber
348
+ }
349
+ }
350
+ """
351
+
352
+ performLint ( UseSynthesizedInitializer . self, input: input)
353
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 6 )
354
+ }
355
+
356
+ func testCustomSetterAccessLevel( ) {
357
+ // When a property has a different access level for its setter, the setter's access level
358
+ // doesn't change the access level of the synthesized initializer.
359
+ let input =
360
+ """
361
+ public struct Person {
362
+ let phoneNumber: String
363
+ private(set) let address: String
364
+
365
+ init(phoneNumber: String, address: String) {
366
+ self.address = address
367
+ self.phoneNumber = phoneNumber
368
+ }
369
+ }
370
+
371
+ public struct Person2 {
372
+ fileprivate let phoneNumber: String
373
+ private(set) let address: String
374
+
375
+ fileprivate init(phoneNumber: String, address: String) {
376
+ self.address = address
377
+ self.phoneNumber = phoneNumber
378
+ }
379
+ }
380
+
381
+ public struct Person3 {
382
+ fileprivate(set) let phoneNumber: String
383
+ private(set) let address: String
384
+
385
+ init(phoneNumber: String, address: String) {
386
+ self.address = address
387
+ self.phoneNumber = phoneNumber
388
+ }
389
+ }
390
+
391
+ public struct Person4 {
392
+ private fileprivate(set) let phoneNumber: String
393
+ private(set) let address: String
394
+
395
+ init(phoneNumber: String, address: String) {
396
+ self.address = address
397
+ self.phoneNumber = phoneNumber
398
+ }
399
+ }
400
+ """
401
+
402
+ performLint ( UseSynthesizedInitializer . self, input: input)
403
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 5 )
404
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 15 )
405
+ XCTAssertDiagnosed ( . removeRedundantInitializer, line: 25 )
406
+ }
269
407
}
0 commit comments