Skip to content

Commit cac3f18

Browse files
committed
Fixes #1
1 parent 5eba03f commit cac3f18

12 files changed

+472
-446
lines changed

README.md

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,6 @@ In your test target create a new Swift file and subclass one of the `Parameteriz
160160

161161
```swift
162162
final class MySnapshotTests: ParameterizedTestCase2<Weather, CelsiusTemperature, Void> {
163-
override class var defaultTestSuite: XCTestSuite {
164-
customTestSuite(self)
165-
}
166-
167-
// MARK: - Internal -
168163

169164
override class func values() -> ([Weather], [CelsiusTemperature]) {
170165
(
@@ -195,16 +190,6 @@ final class MySnapshotTests: ParameterizedTestCase2<Weather, CelsiusTemperature,
195190

196191
The classes make use of generics, you must define the types of values for each set when defining the class. In the above example, the types of each dataset are defined as `<Weather, CelsiusTemperature, Void>`. The `Void` generic parameter is a placeholder for an expected value which is only needed when creating logic tests. For snapshot tests, it's not needed so here we set it to void.
197192

198-
You must override `defaultTestSuite` by pasting in the following code:
199-
200-
```swift
201-
override class var defaultTestSuite: XCTestSuite {
202-
customTestSuite(self)
203-
}
204-
```
205-
206-
This is needed to work around an issue when creating the run-time tests.
207-
208193
Next just override the `testAllCombinations()` method, this will be autocompleted for you when using Xcode with the parameters already correctly typed. In your method just add the test logic that performs whichever test action you want using the injected values.
209194

210195
### Logic testing
@@ -213,11 +198,6 @@ Another valid use case is logic testing. When writing logic tests you'll probabl
213198

214199
```swift
215200
final class MyLogicTests: ParameterizedTestCase2<Weather, CelsiusTemperature, String> {
216-
override class var defaultTestSuite: XCTestSuite {
217-
customTestSuite(self)
218-
}
219-
220-
// MARK: - Internal -
221201

222202
override class func values() -> ([WeatherData.Weather], [CelsiusTemperature]) {
223203
(

Sources/ParameterizedTesting/ParameterizedTestsCase1.swift

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,8 @@ import XCTest
88
open class ParameterizedTestCase1<IN1, OUT>: XCTestCase {
99
// MARK: - Open -
1010

11-
open class func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
12-
let suite = XCTestSuite(forTestCaseClass: Self.self)
13-
let params1 = values()
14-
15-
var counter = 0
16-
let totalCombinations = params1.count
17-
let expectedValues = expectedValues()
18-
19-
ParameterizedTestHandler.allCombinations(
20-
params1,
21-
{ value1 in
22-
23-
let selector = ParameterizedTestCase1.registerTestMethod(
24-
name: testName(value1),
25-
testMethod: #selector(self.internalHandler)
26-
)
27-
28-
let test = subclassType.init(selector: selector)
29-
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
30-
31-
if let expectedValues {
32-
if expectedValues.count == totalCombinations {
33-
let expectedValue = expectedValues[counter]
34-
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
35-
36-
} else {
37-
preconditionFailure(
38-
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
39-
)
40-
}
41-
}
42-
43-
suite.addTest(test)
44-
counter += 1
45-
}
46-
)
47-
48-
return suite
11+
open override class var defaultTestSuite: XCTestSuite {
12+
customTestSuite(Self.self)
4913
}
5014

5115
open class func values() -> ([IN1]) {
@@ -83,4 +47,46 @@ open class ParameterizedTestCase1<IN1, OUT>: XCTestCase {
8347
let expectedValue = getExpectedValue()
8448
testAllCombinations(value1, expectedValue)
8549
}
50+
51+
// MARK: - Private -
52+
53+
private static func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
54+
let suite = XCTestSuite(forTestCaseWithName: UUID().uuidString)
55+
let params1 = values()
56+
57+
var counter = 0
58+
let totalCombinations = params1.count
59+
let expectedValues = expectedValues()
60+
61+
ParameterizedTestHandler.allCombinations(
62+
params1,
63+
{ value1 in
64+
65+
let selector = ParameterizedTestCase1.registerTestMethod(
66+
name: testName(value1),
67+
testMethod: #selector(self.internalHandler)
68+
)
69+
70+
let test = subclassType.init(selector: selector)
71+
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
72+
73+
if let expectedValues {
74+
if expectedValues.count == totalCombinations {
75+
let expectedValue = expectedValues[counter]
76+
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
77+
78+
} else {
79+
preconditionFailure(
80+
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
81+
)
82+
}
83+
}
84+
85+
suite.addTest(test)
86+
counter += 1
87+
}
88+
)
89+
90+
return suite
91+
}
8692
}

Sources/ParameterizedTesting/ParameterizedTestsCase2.swift

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,46 +8,8 @@ import XCTest
88
open class ParameterizedTestCase2<IN1, IN2, OUT>: XCTestCase {
99
// MARK: - Open -
1010

11-
open class func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
12-
let suite = XCTestSuite(forTestCaseClass: Self.self)
13-
let (params1, params2) = values()
14-
15-
var counter = 0
16-
let totalCombinations = params1.count * params2.count
17-
let expectedValues = expectedValues()
18-
19-
ParameterizedTestHandler.allCombinations(
20-
params1,
21-
params2,
22-
{ value1, value2 in
23-
24-
let selector = ParameterizedTestCase2.registerTestMethod(
25-
name: testName(value1, value2),
26-
testMethod: #selector(self.internalHandler)
27-
)
28-
29-
let test = subclassType.init(selector: selector)
30-
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
31-
test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2)
32-
33-
if let expectedValues {
34-
if expectedValues.count == totalCombinations {
35-
let expectedValue = expectedValues[counter]
36-
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
37-
38-
} else {
39-
preconditionFailure(
40-
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
41-
)
42-
}
43-
}
44-
45-
suite.addTest(test)
46-
counter += 1
47-
}
48-
)
49-
50-
return suite
11+
open override class var defaultTestSuite: XCTestSuite {
12+
customTestSuite(Self.self)
5113
}
5214

5315
open class func values() -> ([IN1], [IN2]) {
@@ -92,4 +54,48 @@ open class ParameterizedTestCase2<IN1, IN2, OUT>: XCTestCase {
9254
let expectedValue = getExpectedValue()
9355
testAllCombinations(value1, value2, expectedValue)
9456
}
57+
58+
// MARK: - Private -
59+
60+
private static func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
61+
let suite = XCTestSuite(forTestCaseWithName: UUID().uuidString)
62+
let (params1, params2) = values()
63+
64+
var counter = 0
65+
let totalCombinations = params1.count * params2.count
66+
let expectedValues = expectedValues()
67+
68+
ParameterizedTestHandler.allCombinations(
69+
params1,
70+
params2,
71+
{ value1, value2 in
72+
73+
let selector = ParameterizedTestCase2.registerTestMethod(
74+
name: testName(value1, value2),
75+
testMethod: #selector(self.internalHandler)
76+
)
77+
78+
let test = subclassType.init(selector: selector)
79+
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
80+
test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2)
81+
82+
if let expectedValues {
83+
if expectedValues.count == totalCombinations {
84+
let expectedValue = expectedValues[counter]
85+
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
86+
87+
} else {
88+
preconditionFailure(
89+
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
90+
)
91+
}
92+
}
93+
94+
suite.addTest(test)
95+
counter += 1
96+
}
97+
)
98+
99+
return suite
100+
}
95101
}

Sources/ParameterizedTesting/ParameterizedTestsCase3.swift

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,48 +8,8 @@ import XCTest
88
open class ParameterizedTestCase3<IN1, IN2, IN3, OUT>: XCTestCase {
99
// MARK: - Open -
1010

11-
open class func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
12-
let suite = XCTestSuite(forTestCaseClass: Self.self)
13-
let (params1, params2, params3) = values()
14-
15-
var counter = 0
16-
let totalCombinations = params1.count * params2.count * params3.count
17-
let expectedValues = expectedValues()
18-
19-
ParameterizedTestHandler.allCombinations(
20-
params1,
21-
params2,
22-
params3,
23-
{ value1, value2, value3 in
24-
25-
let selector = ParameterizedTestCase3.registerTestMethod(
26-
name: testName(value1, value2, value3),
27-
testMethod: #selector(self.internalHandler)
28-
)
29-
30-
let test = subclassType.init(selector: selector)
31-
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
32-
test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2)
33-
test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3)
34-
35-
if let expectedValues {
36-
if expectedValues.count == totalCombinations {
37-
let expectedValue = expectedValues[counter]
38-
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
39-
40-
} else {
41-
preconditionFailure(
42-
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
43-
)
44-
}
45-
}
46-
47-
suite.addTest(test)
48-
counter += 1
49-
}
50-
)
51-
52-
return suite
11+
open override class var defaultTestSuite: XCTestSuite {
12+
customTestSuite(Self.self)
5313
}
5414

5515
open class func values() -> ([IN1], [IN2], [IN3]) {
@@ -99,4 +59,50 @@ open class ParameterizedTestCase3<IN1, IN2, IN3, OUT>: XCTestCase {
9959
let expectedValue = getExpectedValue()
10060
testAllCombinations(value1, value2, value3, expectedValue)
10161
}
62+
63+
// MARK: - Private -
64+
65+
private static func customTestSuite(_ subclassType: (some XCTestCase).Type) -> XCTestSuite {
66+
let suite = XCTestSuite(forTestCaseWithName: UUID().uuidString)
67+
let (params1, params2, params3) = values()
68+
69+
var counter = 0
70+
let totalCombinations = params1.count * params2.count * params3.count
71+
let expectedValues = expectedValues()
72+
73+
ParameterizedTestHandler.allCombinations(
74+
params1,
75+
params2,
76+
params3,
77+
{ value1, value2, value3 in
78+
79+
let selector = ParameterizedTestCase3.registerTestMethod(
80+
name: testName(value1, value2, value3),
81+
testMethod: #selector(self.internalHandler)
82+
)
83+
84+
let test = subclassType.init(selector: selector)
85+
test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1)
86+
test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2)
87+
test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3)
88+
89+
if let expectedValues {
90+
if expectedValues.count == totalCombinations {
91+
let expectedValue = expectedValues[counter]
92+
test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue)
93+
94+
} else {
95+
preconditionFailure(
96+
"The number of expected values (\(expectedValues.count)) does not satisfy the total number of all combinations of values (\(totalCombinations))."
97+
)
98+
}
99+
}
100+
101+
suite.addTest(test)
102+
counter += 1
103+
}
104+
)
105+
106+
return suite
107+
}
102108
}

0 commit comments

Comments
 (0)