From 3110804aeb6011935586363da2bb368c51e81351 Mon Sep 17 00:00:00 2001 From: Cameron Cooke Date: Fri, 6 Jan 2023 17:18:29 +0000 Subject: [PATCH] Add support for optional values Also adds support for customising the separator used when generating the test name. --- .../ParameterizedTestCase.swift | 35 ++ .../ParameterizedTestsCase1.swift | 29 +- .../ParameterizedTestsCase2.swift | 30 +- .../ParameterizedTestsCase3.swift | 35 +- .../ParameterizedTestsCase4.swift | 40 +- .../ParameterizedTestsCase5.swift | 45 +- .../ParameterizedTestsCase6.swift | 50 +- .../ParameterizedTestsCase7.swift | 55 +- .../ParameterizedTestsCase8.swift | 60 +- .../ParameterizedTestsCase9.swift | 70 ++- .../XCTest+Extension.swift | 31 +- Tests/ExampleTests/ExampleSnapshotTests.swift | 1 + .../Option+Extensions.swift | 23 + ...ParameterizedTestCase1OptionalsTests.swift | 103 ++++ ...ParameterizedTestCase2OptionalsTests.swift | 112 ++++ ...ParameterizedTestCase3OptionalsTests.swift | 119 ++++ ...ParameterizedTestCase4OptionalsTests.swift | 126 +++++ ...ParameterizedTestCase5OptionalsTests.swift | 133 +++++ ...ParameterizedTestCase6OptionalsTests.swift | 140 +++++ ...ParameterizedTestCase7OptionalsTests.swift | 147 +++++ ...ParameterizedTestCase8OptionalsTests.swift | 154 ++++++ ...ParameterizedTestCase9OptionalsTests.swift | 161 ++++++ .../TestDataWithOptionals.swift | 56 ++ ...sIsCalledForEachCombinationOfValues.1.json | 4 + ...sIsCalledForEachCombinationOfValues.1.json | 6 + ...sIsCalledForEachCombinationOfValues.1.json | 10 + ...sIsCalledForEachCombinationOfValues.1.json | 18 + ...sIsCalledForEachCombinationOfValues.1.json | 34 ++ ...sIsCalledForEachCombinationOfValues.1.json | 66 +++ ...sIsCalledForEachCombinationOfValues.1.json | 130 +++++ ...sIsCalledForEachCombinationOfValues.1.json | 258 +++++++++ ...sIsCalledForEachCombinationOfValues.1.json | 514 ++++++++++++++++++ 32 files changed, 2619 insertions(+), 176 deletions(-) create mode 100644 Sources/ParameterizedTesting/ParameterizedTestCase.swift create mode 100644 Tests/ParameterizedTestingTests/Option+Extensions.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase1OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase2OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase3OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase4OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase5OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase6OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase7OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase8OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/ParameterizedTestCase9OptionalsTests.swift create mode 100644 Tests/ParameterizedTestingTests/TestDataWithOptionals.swift create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase1OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase2OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase3OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase4OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase5OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase6OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase7OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase8OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json create mode 100644 Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase9OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json diff --git a/Sources/ParameterizedTesting/ParameterizedTestCase.swift b/Sources/ParameterizedTesting/ParameterizedTestCase.swift new file mode 100644 index 0000000..ddac134 --- /dev/null +++ b/Sources/ParameterizedTesting/ParameterizedTestCase.swift @@ -0,0 +1,35 @@ +// +// ParameterizedTestCase.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import Foundation +import XCTest + +open class ParameterizedTestCase: XCTestCase { + + // MARK: - Open - + + open class var testNameFieldSeparator: String { + "_" + } + + // MARK: - Internal - + + private var storage: [String: Any] = [:] + + func setValue(_ value: T, forKey key: String) { + storage[key] = value + } + + func getValue(forKey key: String) -> T? { + return storage[key] as? T + } + + static func testName(for values: [Any]) -> String { + values + .map { String(describing: $0) } + .joined(separator: testNameFieldSeparator) + .lowercased() + } +} diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase1.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase1.swift index 418a622..ebd3702 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase1.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase1.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase1: XCTestCase { +open class ParameterizedTestCase1: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -20,8 +20,14 @@ open class ParameterizedTestCase1: XCTestCase { nil } - open class func testName(_ value1: IN1) -> String { - "\(value1)".lowercased() + open class func testName( + _ value1: IN1 + ) -> String { + testName( + for: [ + value1, + ] + ) } open func testAllCombinations(_ value1: IN1, _ expectedResult: OUT?) { @@ -31,11 +37,11 @@ open class ParameterizedTestCase1: XCTestCase { // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -64,16 +70,21 @@ open class ParameterizedTestCase1: XCTestCase { let selector = ParameterizedTestCase1.registerTestMethod( name: testName(value1), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase2.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase2.swift index b66b176..be3bfdb 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase2.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase2.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase2: XCTestCase { +open class ParameterizedTestCase2: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -24,7 +24,12 @@ open class ParameterizedTestCase2: XCTestCase { _ value1: IN1, _ value2: IN2 ) -> String { - "\(value1)_\(value2)".lowercased() + testName( + for: [ + value1, + value2 + ] + ) } open func testAllCombinations(_ value1: IN1, _ value2: IN2, _ expectedResult: OUT?) { @@ -34,15 +39,15 @@ open class ParameterizedTestCase2: XCTestCase { // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -72,17 +77,22 @@ open class ParameterizedTestCase2: XCTestCase { let selector = ParameterizedTestCase2.registerTestMethod( name: testName(value1, value2), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase3.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase3.swift index 663ad91..68c0a1a 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase3.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase3.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase3: XCTestCase { +open class ParameterizedTestCase3: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -25,7 +25,13 @@ open class ParameterizedTestCase3: XCTestCase { _ value2: IN2, _ value3: IN3 ) -> String { - "\(value1)_\(value2)_\(value3)".lowercased() + testName( + for: [ + value1, + value2, + value3 + ] + ) } open func testAllCombinations(_ value1: IN1, _ value2: IN2, _ value3: IN3, _ expectedResult: OUT?) { @@ -35,19 +41,19 @@ open class ParameterizedTestCase3: XCTestCase { // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -78,18 +84,23 @@ open class ParameterizedTestCase3: XCTestCase { let selector = ParameterizedTestCase3.registerTestMethod( name: testName(value1, value2, value3), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase4.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase4.swift index 41aa367..73594dd 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase4.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase4.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase4: XCTestCase { +open class ParameterizedTestCase4: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -26,7 +26,14 @@ open class ParameterizedTestCase4: XCTestCase { _ value3: IN3, _ value4: IN4 ) -> String { - "\(value1)_\(value2)_\(value3)_\(value4)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4 + ] + ) } open func testAllCombinations( @@ -42,23 +49,23 @@ open class ParameterizedTestCase4: XCTestCase { // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -91,19 +98,24 @@ open class ParameterizedTestCase4: XCTestCase { let selector = ParameterizedTestCase4.registerTestMethod( name: testName(value1, value2, value3, value4), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) - test.setValue(value: value4, forKey: &ParameterizedTestCaseKey.value4) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) + test.setValue(value4, forKey: ParameterizedTestCaseKey.value4) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase5.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase5.swift index 34db013..46196a2 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase5.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase5.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase5: XCTestCase { +open class ParameterizedTestCase5: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -27,7 +27,15 @@ open class ParameterizedTestCase5: XCTestCase { _ value4: IN4, _ value5: IN5 ) -> String { - "\(value1)_\(value2)_\(value3)_\(value4)_\(value5)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4, + value5 + ] + ) } open func testAllCombinations( @@ -44,27 +52,27 @@ open class ParameterizedTestCase5: XCTestCase { // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getValue5() -> IN5? { - getValue(forKey: &ParameterizedTestCaseKey.value5) + getValue(forKey: ParameterizedTestCaseKey.value5) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -98,20 +106,25 @@ open class ParameterizedTestCase5: XCTestCase { let selector = ParameterizedTestCase5.registerTestMethod( name: testName(value1, value2, value3, value4, value5), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) - test.setValue(value: value4, forKey: &ParameterizedTestCaseKey.value4) - test.setValue(value: value5, forKey: &ParameterizedTestCaseKey.value5) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) + test.setValue(value4, forKey: ParameterizedTestCaseKey.value4) + test.setValue(value5, forKey: ParameterizedTestCaseKey.value5) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase6.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase6.swift index c712920..940cc3d 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase6.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase6.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase6: XCTestCase { +open class ParameterizedTestCase6: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -28,7 +28,16 @@ open class ParameterizedTestCase6: XCTestCase _ value5: IN5, _ value6: IN6 ) -> String { - "\(value1)_\(value2)_\(value3)_\(value4)_\(value5)_\(value6)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4, + value5, + value6 + ] + ) } open func testAllCombinations( @@ -46,31 +55,31 @@ open class ParameterizedTestCase6: XCTestCase // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getValue5() -> IN5? { - getValue(forKey: &ParameterizedTestCaseKey.value5) + getValue(forKey: ParameterizedTestCaseKey.value5) } func getValue6() -> IN6? { - getValue(forKey: &ParameterizedTestCaseKey.value6) + getValue(forKey: ParameterizedTestCaseKey.value6) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -106,21 +115,26 @@ open class ParameterizedTestCase6: XCTestCase let selector = ParameterizedTestCase6.registerTestMethod( name: testName(value1, value2, value3, value4, value5, value6), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) - test.setValue(value: value4, forKey: &ParameterizedTestCaseKey.value4) - test.setValue(value: value5, forKey: &ParameterizedTestCaseKey.value5) - test.setValue(value: value6, forKey: &ParameterizedTestCaseKey.value6) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) + test.setValue(value4, forKey: ParameterizedTestCaseKey.value4) + test.setValue(value5, forKey: ParameterizedTestCaseKey.value5) + test.setValue(value6, forKey: ParameterizedTestCaseKey.value6) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase7.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase7.swift index 9109d68..d9ce7ac 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase7.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase7.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase7: XCTestCase { +open class ParameterizedTestCase7: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -29,7 +29,17 @@ open class ParameterizedTestCase7: XCTes _ value6: IN6, _ value7: IN7 ) -> String { - "\(value1)_\(value2)_\(value3)_\(value4)_\(value5)_\(value6)_\(value7)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4, + value5, + value6, + value7 + ] + ) } open func testAllCombinations( @@ -48,35 +58,35 @@ open class ParameterizedTestCase7: XCTes // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getValue5() -> IN5? { - getValue(forKey: &ParameterizedTestCaseKey.value5) + getValue(forKey: ParameterizedTestCaseKey.value5) } func getValue6() -> IN6? { - getValue(forKey: &ParameterizedTestCaseKey.value6) + getValue(forKey: ParameterizedTestCaseKey.value6) } func getValue7() -> IN7? { - getValue(forKey: &ParameterizedTestCaseKey.value7) + getValue(forKey: ParameterizedTestCaseKey.value7) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -113,22 +123,27 @@ open class ParameterizedTestCase7: XCTes let selector = ParameterizedTestCase7.registerTestMethod( name: testName(value1, value2, value3, value4, value5, value6, value7), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) - test.setValue(value: value4, forKey: &ParameterizedTestCaseKey.value4) - test.setValue(value: value5, forKey: &ParameterizedTestCaseKey.value5) - test.setValue(value: value6, forKey: &ParameterizedTestCaseKey.value6) - test.setValue(value: value7, forKey: &ParameterizedTestCaseKey.value7) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) + test.setValue(value4, forKey: ParameterizedTestCaseKey.value4) + test.setValue(value5, forKey: ParameterizedTestCaseKey.value5) + test.setValue(value6, forKey: ParameterizedTestCaseKey.value6) + test.setValue(value7, forKey: ParameterizedTestCaseKey.value7) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase8.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase8.swift index 42842b3..b3b5658 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase8.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase8.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase8: XCTestCase { +open class ParameterizedTestCase8: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -30,7 +30,18 @@ open class ParameterizedTestCase8: _ value7: IN7, _ value8: IN8 ) -> String { - "\(value1)_\(value2)_\(value3)_\(value4)_\(value5)_\(value6)_\(value7)_\(value8)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4, + value5, + value6, + value7, + value8 + ] + ) } open func testAllCombinations( @@ -50,39 +61,39 @@ open class ParameterizedTestCase8: // MARK: - Internal - func getValue1() -> IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getValue5() -> IN5? { - getValue(forKey: &ParameterizedTestCaseKey.value5) + getValue(forKey: ParameterizedTestCaseKey.value5) } func getValue6() -> IN6? { - getValue(forKey: &ParameterizedTestCaseKey.value6) + getValue(forKey: ParameterizedTestCaseKey.value6) } func getValue7() -> IN7? { - getValue(forKey: &ParameterizedTestCaseKey.value7) + getValue(forKey: ParameterizedTestCaseKey.value7) } func getValue8() -> IN8? { - getValue(forKey: &ParameterizedTestCaseKey.value8) + getValue(forKey: ParameterizedTestCaseKey.value8) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -121,23 +132,28 @@ open class ParameterizedTestCase8: let selector = ParameterizedTestCase8.registerTestMethod( name: testName(value1, value2, value3, value4, value5, value6, value7, value8), - testMethod: #selector(self.internalHandler) + testMethod: #selector(self.internalHandler), + separator: testNameFieldSeparator ) - let test = subclassType.init(selector: selector) - test.setValue(value: value1, forKey: &ParameterizedTestCaseKey.value1) - test.setValue(value: value2, forKey: &ParameterizedTestCaseKey.value2) - test.setValue(value: value3, forKey: &ParameterizedTestCaseKey.value3) - test.setValue(value: value4, forKey: &ParameterizedTestCaseKey.value4) - test.setValue(value: value5, forKey: &ParameterizedTestCaseKey.value5) - test.setValue(value: value6, forKey: &ParameterizedTestCaseKey.value6) - test.setValue(value: value7, forKey: &ParameterizedTestCaseKey.value7) - test.setValue(value: value8, forKey: &ParameterizedTestCaseKey.value8) + let testCase = subclassType.init(selector: selector) + guard let test = testCase as? ParameterizedTestCase else { + fatalError("Unable to instantiate XCTestCase") + } + + test.setValue(value1, forKey: ParameterizedTestCaseKey.value1) + test.setValue(value2, forKey: ParameterizedTestCaseKey.value2) + test.setValue(value3, forKey: ParameterizedTestCaseKey.value3) + test.setValue(value4, forKey: ParameterizedTestCaseKey.value4) + test.setValue(value5, forKey: ParameterizedTestCaseKey.value5) + test.setValue(value6, forKey: ParameterizedTestCaseKey.value6) + test.setValue(value7, forKey: ParameterizedTestCaseKey.value7) + test.setValue(value8, forKey: ParameterizedTestCaseKey.value8) if let expectedValues { if expectedValues.count == totalCombinations { let expectedValue = expectedValues[counter] - test.setValue(value: expectedValue, forKey: &ParameterizedTestCaseKey.expectedValue) + test.setValue(expectedValue, forKey: ParameterizedTestCaseKey.expectedValue) } else { preconditionFailure( diff --git a/Sources/ParameterizedTesting/ParameterizedTestsCase9.swift b/Sources/ParameterizedTesting/ParameterizedTestsCase9.swift index 8f09cf0..c0b91d3 100644 --- a/Sources/ParameterizedTesting/ParameterizedTestsCase9.swift +++ b/Sources/ParameterizedTesting/ParameterizedTestsCase9.swift @@ -5,7 +5,7 @@ import XCTest -open class ParameterizedTestCase9: XCTestCase { +open class ParameterizedTestCase9: ParameterizedTestCase { // MARK: - Open - open override class var defaultTestSuite: XCTestSuite { @@ -31,7 +31,19 @@ open class ParameterizedTestCase9 String { - "\(value1)_\(value2)_\(value3)_\(value4)_\(value5)_\(value6)_\(value7)_\(value8)_\(value9)".lowercased() + testName( + for: [ + value1, + value2, + value3, + value4, + value5, + value6, + value7, + value8, + value9 + ] + ) } open func testAllCombinations( @@ -52,43 +64,43 @@ open class ParameterizedTestCase9 IN1? { - getValue(forKey: &ParameterizedTestCaseKey.value1) + getValue(forKey: ParameterizedTestCaseKey.value1) } func getValue2() -> IN2? { - getValue(forKey: &ParameterizedTestCaseKey.value2) + getValue(forKey: ParameterizedTestCaseKey.value2) } func getValue3() -> IN3? { - getValue(forKey: &ParameterizedTestCaseKey.value3) + getValue(forKey: ParameterizedTestCaseKey.value3) } func getValue4() -> IN4? { - getValue(forKey: &ParameterizedTestCaseKey.value4) + getValue(forKey: ParameterizedTestCaseKey.value4) } func getValue5() -> IN5? { - getValue(forKey: &ParameterizedTestCaseKey.value5) + getValue(forKey: ParameterizedTestCaseKey.value5) } func getValue6() -> IN6? { - getValue(forKey: &ParameterizedTestCaseKey.value6) + getValue(forKey: ParameterizedTestCaseKey.value6) } func getValue7() -> IN7? { - getValue(forKey: &ParameterizedTestCaseKey.value7) + getValue(forKey: ParameterizedTestCaseKey.value7) } func getValue8() -> IN8? { - getValue(forKey: &ParameterizedTestCaseKey.value8) + getValue(forKey: ParameterizedTestCaseKey.value8) } func getValue9() -> IN9? { - getValue(forKey: &ParameterizedTestCaseKey.value9) + getValue(forKey: ParameterizedTestCaseKey.value9) } func getExpectedValue() -> OUT? { - getValue(forKey: &ParameterizedTestCaseKey.expectedValue) + getValue(forKey: ParameterizedTestCaseKey.expectedValue) } @objc @@ -103,10 +115,6 @@ open class ParameterizedTestCase9 XCTestSuite { @@ -132,24 +140,30 @@ open class ParameterizedTestCase9 Selector { - let selector = makeSelector(with: name) + class func registerTestMethod(name: String, testMethod: Selector, separator: String) -> Selector { + let selector = makeSelector(with: name, separator: separator) if let existingMethod = class_getInstanceMethod(self, selector) { @@ -36,33 +36,10 @@ extension XCTestCase { return selector } - func setValue(value: some Any, forKey key: UnsafeMutablePointer) { - - if let value: AnyObject = getValue(forKey: key) { - objc_removeAssociatedObjects(value) - } - - let object = self as AnyObject - objc_setAssociatedObject( - object, - key, - value, - .OBJC_ASSOCIATION_RETAIN - ) - } - - func getValue(forKey key: UnsafeMutablePointer) -> T? { - let object = self as AnyObject - return objc_getAssociatedObject( - object, - key - ) as? T - } - - private static func makeSelector(with name: String) -> Selector { + private static func makeSelector(with name: String, separator: String) -> Selector { // TODO: Remove special characters and spaces // (technically they will work as we're using selectors but just to be on safe side) - let selector = sel_registerName("test_\(name)") + let selector = sel_registerName("test\(separator)\(name)") return selector } } diff --git a/Tests/ExampleTests/ExampleSnapshotTests.swift b/Tests/ExampleTests/ExampleSnapshotTests.swift index 25d3a5b..a9fd347 100644 --- a/Tests/ExampleTests/ExampleSnapshotTests.swift +++ b/Tests/ExampleTests/ExampleSnapshotTests.swift @@ -34,6 +34,7 @@ final class ExampleSnapshotTests: ParameterizedTestCase3(_ optional: T?) { + appendInterpolation(String(describing: optional)) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase1OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase1OptionalsTests.swift new file mode 100644 index 0000000..66a4e0e --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase1OptionalsTests.swift @@ -0,0 +1,103 @@ +// +// ParameterizedTestCase1OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase1OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 2) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $1 + combinations.append("\($0)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)") + expectedResults.append($1) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase1< + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _ in } + + override class func values() -> ([String?]) { + ( + TestDataWithOptionals.values1 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1 + ) { + expected.append("\($0)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ expectedResult: String? + ) { + handler( + value1, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase2OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase2OptionalsTests.swift new file mode 100644 index 0000000..5ed65fe --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase2OptionalsTests.swift @@ -0,0 +1,112 @@ +// +// ParameterizedTestCase2OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase2OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 4) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $2 + combinations.append("\($0)_\($1)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)") + expectedResults.append($2) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase2< + String?, + Int?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _ in } + + override class func values() -> ( + [String?], + [Int?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2 + ) { + expected.append("\($0)_\($1)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase3OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase3OptionalsTests.swift new file mode 100644 index 0000000..b06d217 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase3OptionalsTests.swift @@ -0,0 +1,119 @@ +// +// ParameterizedTestCase3OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase3OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 8) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $3 + combinations.append("\($0)_\($1)_\($2)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)") + expectedResults.append($3) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase3< + String?, + Int?, + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3 + ) { + expected.append("\($0)_\($1)_\($2)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase4OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase4OptionalsTests.swift new file mode 100644 index 0000000..8eec125 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase4OptionalsTests.swift @@ -0,0 +1,126 @@ +// +// ParameterizedTestCase4OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase4OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 16) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $4 + combinations.append("\($0)_\($1)_\($2)_\($3)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)") + expectedResults.append($4) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase4< + String?, + Int?, + String?, + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase5OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase5OptionalsTests.swift new file mode 100644 index 0000000..d1e6052 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase5OptionalsTests.swift @@ -0,0 +1,133 @@ +// +// ParameterizedTestCase5OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase5OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 32) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $5 + combinations.append("\($0)_\($1)_\($2)_\($3)_\($4)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)_\($4)") + expectedResults.append($5) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase5< + String?, + Int?, + String?, + String?, + Double?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?], + [Double?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)_\($4)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + value5, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase6OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase6OptionalsTests.swift new file mode 100644 index 0000000..00b7417 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase6OptionalsTests.swift @@ -0,0 +1,140 @@ +// +// ParameterizedTestCase6OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase6OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 64) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $6 + combinations.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)") + expectedResults.append($6) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase6< + String?, + Int?, + String?, + String?, + Double?, + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?], + [Double?], + [String?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + value5, + value6, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase7OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase7OptionalsTests.swift new file mode 100644 index 0000000..b4a7664 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase7OptionalsTests.swift @@ -0,0 +1,147 @@ +// +// ParameterizedTestCase7OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase7OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 128) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $7 + combinations.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)") + expectedResults.append($7) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase7< + String?, + Int?, + String?, + String?, + Double?, + String?, + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?], + [Double?], + [String?], + [String?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + value5, + value6, + value7, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase8OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase8OptionalsTests.swift new file mode 100644 index 0000000..401bbb0 --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase8OptionalsTests.swift @@ -0,0 +1,154 @@ +// +// ParameterizedTestCase8OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase8OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 256) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $8 + combinations.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)") + expectedResults.append($8) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase8< + String?, + Int?, + String?, + String?, + Double?, + String?, + String?, + String?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ value8: String?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?], + [Double?], + [String?], + [String?], + [String?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7, + TestDataWithOptionals.values8 + ) + } + + override class func expectedValues() -> [String] { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7, + TestDataWithOptionals.values8 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ value8: String?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + value5, + value6, + value7, + value8, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/ParameterizedTestCase9OptionalsTests.swift b/Tests/ParameterizedTestingTests/ParameterizedTestCase9OptionalsTests.swift new file mode 100644 index 0000000..2111c0f --- /dev/null +++ b/Tests/ParameterizedTestingTests/ParameterizedTestCase9OptionalsTests.swift @@ -0,0 +1,161 @@ +// +// ParameterizedTestCase9OptionalsTests.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import SnapshotTesting +import XCTest +@testable import ParameterizedTesting + +final class ParameterizedTestCase9OptionalsTests: XCTestCase { + + // MARK: - Internal - + + func testTestsAreCreatedForAllCombinations() { + let suite = Tests.defaultTestSuite + let tests = suite.tests + XCTAssertEqual(tests.count, 512) + } + + func testAllCombinationsIsCalledForEachCombinationOfValues() { + var combinations: [String] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + _ = $9 + combinations.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)_\($8)") + } + + test.invokeTest() + } + + assertSnapshot(matching: combinations, as: .json) + } + + func testAllCombinationsIsCalledWithCorrespondingExpectedValues() { + var valueStrings: [String] = [] + var expectedResults: [String?] = [] + + let suite = Tests.defaultTestSuite + suite.tests.forEach { test in + guard let test = test as? Tests else { + XCTFail() + return + } + + test.handler = { + valueStrings.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)_\($8)") + expectedResults.append($9) + } + + test.invokeTest() + } + + XCTAssertEqual(valueStrings, expectedResults) + } +} + +// TestCase under test + +private final class Tests: ParameterizedTestCase9< + String?, + Int?, + String?, + String?, + Double?, + String?, + String?, + String?, + Bool?, + String +> { + var handler: ( + ( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ value8: String?, + _ value9: Bool?, + _ expectedResult: String? + ) -> Void + ) = { _, _, _, _, _, _, _, _, _, _ in } + + override class func values() -> ( + [String?], + [Int?], + [String?], + [String?], + [Double?], + [String?], + [String?], + [String?], + [Bool?] + ) { + ( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7, + TestDataWithOptionals.values8, + TestDataWithOptionals.values9 + ) + } + + override class func expectedValues() -> [String]? { + // Programmatically generate expected results + var expected: [String] = [] + ParameterizedTestHandler.allCombinations( + TestDataWithOptionals.values1, + TestDataWithOptionals.values2, + TestDataWithOptionals.values3, + TestDataWithOptionals.values4, + TestDataWithOptionals.values5, + TestDataWithOptionals.values6, + TestDataWithOptionals.values7, + TestDataWithOptionals.values8, + TestDataWithOptionals.values9 + ) { + expected.append("\($0)_\($1)_\($2)_\($3)_\($4)_\($5)_\($6)_\($7)_\($8)") + } + return expected + } + + override func testAllCombinations( + _ value1: String?, + _ value2: Int?, + _ value3: String?, + _ value4: String?, + _ value5: Double?, + _ value6: String?, + _ value7: String?, + _ value8: String?, + _ value9: Bool?, + _ expectedResult: String? + ) { + handler( + value1, + value2, + value3, + value4, + value5, + value6, + value7, + value8, + value9, + expectedResult + ) + } +} diff --git a/Tests/ParameterizedTestingTests/TestDataWithOptionals.swift b/Tests/ParameterizedTestingTests/TestDataWithOptionals.swift new file mode 100644 index 0000000..b3f31e8 --- /dev/null +++ b/Tests/ParameterizedTestingTests/TestDataWithOptionals.swift @@ -0,0 +1,56 @@ +// +// TestDataWithOptionals.swift +// Copyright © 2023 Cameron Cooke. All rights reserved. +// + +import Foundation +import ParameterizedTesting + +// Test Data + +struct TestDataWithOptionals { + static let values1: [String?] = [ + "raining", + nil, + ] + + static let values2: [Int?] = [ + 12, + nil, + ] + + static let values3: [String?] = [ + "apples", + nil, + ] + + static let values4: [String?] = [ + "red", + nil, + ] + + static let values5: [Double?] = [ + 12.99, + nil, + ] + + static let values6: [String?] = [ + "GB", + nil, + ] + + static let values7: [String?] = [ + "large", + nil, + ] + + static let values8: [String?] = [ + "red", + nil, + ] + + static let values9: [Bool?] = [ + true, + nil, + ] +} diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase1OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase1OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..7a32f0a --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase1OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,4 @@ +[ + "raining", + "null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase2OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase2OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..cecdf55 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase2OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,6 @@ +[ + "raining_12", + "raining_null", + "null_12", + "null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase3OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase3OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..2abea20 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase3OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,10 @@ +[ + "raining_12_apples", + "raining_12_null", + "raining_null_apples", + "raining_null_null", + "null_12_apples", + "null_12_null", + "null_null_apples", + "null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase4OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase4OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..32c6d3f --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase4OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,18 @@ +[ + "raining_12_apples_red", + "raining_12_apples_null", + "raining_12_null_red", + "raining_12_null_null", + "raining_null_apples_red", + "raining_null_apples_null", + "raining_null_null_red", + "raining_null_null_null", + "null_12_apples_red", + "null_12_apples_null", + "null_12_null_red", + "null_12_null_null", + "null_null_apples_red", + "null_null_apples_null", + "null_null_null_red", + "null_null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase5OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase5OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..54b3b35 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase5OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,34 @@ +[ + "raining_12_apples_red_12.99", + "raining_12_apples_red_null", + "raining_12_apples_null_12.99", + "raining_12_apples_null_null", + "raining_12_null_red_12.99", + "raining_12_null_red_null", + "raining_12_null_null_12.99", + "raining_12_null_null_null", + "raining_null_apples_red_12.99", + "raining_null_apples_red_null", + "raining_null_apples_null_12.99", + "raining_null_apples_null_null", + "raining_null_null_red_12.99", + "raining_null_null_red_null", + "raining_null_null_null_12.99", + "raining_null_null_null_null", + "null_12_apples_red_12.99", + "null_12_apples_red_null", + "null_12_apples_null_12.99", + "null_12_apples_null_null", + "null_12_null_red_12.99", + "null_12_null_red_null", + "null_12_null_null_12.99", + "null_12_null_null_null", + "null_null_apples_red_12.99", + "null_null_apples_red_null", + "null_null_apples_null_12.99", + "null_null_apples_null_null", + "null_null_null_red_12.99", + "null_null_null_red_null", + "null_null_null_null_12.99", + "null_null_null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase6OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase6OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..9cf1fdf --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase6OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,66 @@ +[ + "raining_12_apples_red_12.99_GB", + "raining_12_apples_red_12.99_null", + "raining_12_apples_red_null_GB", + "raining_12_apples_red_null_null", + "raining_12_apples_null_12.99_GB", + "raining_12_apples_null_12.99_null", + "raining_12_apples_null_null_GB", + "raining_12_apples_null_null_null", + "raining_12_null_red_12.99_GB", + "raining_12_null_red_12.99_null", + "raining_12_null_red_null_GB", + "raining_12_null_red_null_null", + "raining_12_null_null_12.99_GB", + "raining_12_null_null_12.99_null", + "raining_12_null_null_null_GB", + "raining_12_null_null_null_null", + "raining_null_apples_red_12.99_GB", + "raining_null_apples_red_12.99_null", + "raining_null_apples_red_null_GB", + "raining_null_apples_red_null_null", + "raining_null_apples_null_12.99_GB", + "raining_null_apples_null_12.99_null", + "raining_null_apples_null_null_GB", + "raining_null_apples_null_null_null", + "raining_null_null_red_12.99_GB", + "raining_null_null_red_12.99_null", + "raining_null_null_red_null_GB", + "raining_null_null_red_null_null", + "raining_null_null_null_12.99_GB", + "raining_null_null_null_12.99_null", + "raining_null_null_null_null_GB", + "raining_null_null_null_null_null", + "null_12_apples_red_12.99_GB", + "null_12_apples_red_12.99_null", + "null_12_apples_red_null_GB", + "null_12_apples_red_null_null", + "null_12_apples_null_12.99_GB", + "null_12_apples_null_12.99_null", + "null_12_apples_null_null_GB", + "null_12_apples_null_null_null", + "null_12_null_red_12.99_GB", + "null_12_null_red_12.99_null", + "null_12_null_red_null_GB", + "null_12_null_red_null_null", + "null_12_null_null_12.99_GB", + "null_12_null_null_12.99_null", + "null_12_null_null_null_GB", + "null_12_null_null_null_null", + "null_null_apples_red_12.99_GB", + "null_null_apples_red_12.99_null", + "null_null_apples_red_null_GB", + "null_null_apples_red_null_null", + "null_null_apples_null_12.99_GB", + "null_null_apples_null_12.99_null", + "null_null_apples_null_null_GB", + "null_null_apples_null_null_null", + "null_null_null_red_12.99_GB", + "null_null_null_red_12.99_null", + "null_null_null_red_null_GB", + "null_null_null_red_null_null", + "null_null_null_null_12.99_GB", + "null_null_null_null_12.99_null", + "null_null_null_null_null_GB", + "null_null_null_null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase7OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase7OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..50390a4 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase7OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,130 @@ +[ + "raining_12_apples_red_12.99_GB_large", + "raining_12_apples_red_12.99_GB_null", + "raining_12_apples_red_12.99_null_large", + "raining_12_apples_red_12.99_null_null", + "raining_12_apples_red_null_GB_large", + "raining_12_apples_red_null_GB_null", + "raining_12_apples_red_null_null_large", + "raining_12_apples_red_null_null_null", + "raining_12_apples_null_12.99_GB_large", + "raining_12_apples_null_12.99_GB_null", + "raining_12_apples_null_12.99_null_large", + "raining_12_apples_null_12.99_null_null", + "raining_12_apples_null_null_GB_large", + "raining_12_apples_null_null_GB_null", + "raining_12_apples_null_null_null_large", + "raining_12_apples_null_null_null_null", + "raining_12_null_red_12.99_GB_large", + "raining_12_null_red_12.99_GB_null", + "raining_12_null_red_12.99_null_large", + "raining_12_null_red_12.99_null_null", + "raining_12_null_red_null_GB_large", + "raining_12_null_red_null_GB_null", + "raining_12_null_red_null_null_large", + "raining_12_null_red_null_null_null", + "raining_12_null_null_12.99_GB_large", + "raining_12_null_null_12.99_GB_null", + "raining_12_null_null_12.99_null_large", + "raining_12_null_null_12.99_null_null", + "raining_12_null_null_null_GB_large", + "raining_12_null_null_null_GB_null", + "raining_12_null_null_null_null_large", + "raining_12_null_null_null_null_null", + "raining_null_apples_red_12.99_GB_large", + "raining_null_apples_red_12.99_GB_null", + "raining_null_apples_red_12.99_null_large", + "raining_null_apples_red_12.99_null_null", + "raining_null_apples_red_null_GB_large", + "raining_null_apples_red_null_GB_null", + "raining_null_apples_red_null_null_large", + "raining_null_apples_red_null_null_null", + "raining_null_apples_null_12.99_GB_large", + "raining_null_apples_null_12.99_GB_null", + "raining_null_apples_null_12.99_null_large", + "raining_null_apples_null_12.99_null_null", + "raining_null_apples_null_null_GB_large", + "raining_null_apples_null_null_GB_null", + "raining_null_apples_null_null_null_large", + "raining_null_apples_null_null_null_null", + "raining_null_null_red_12.99_GB_large", + "raining_null_null_red_12.99_GB_null", + "raining_null_null_red_12.99_null_large", + "raining_null_null_red_12.99_null_null", + "raining_null_null_red_null_GB_large", + "raining_null_null_red_null_GB_null", + "raining_null_null_red_null_null_large", + "raining_null_null_red_null_null_null", + "raining_null_null_null_12.99_GB_large", + "raining_null_null_null_12.99_GB_null", + "raining_null_null_null_12.99_null_large", + "raining_null_null_null_12.99_null_null", + "raining_null_null_null_null_GB_large", + "raining_null_null_null_null_GB_null", + "raining_null_null_null_null_null_large", + "raining_null_null_null_null_null_null", + "null_12_apples_red_12.99_GB_large", + "null_12_apples_red_12.99_GB_null", + "null_12_apples_red_12.99_null_large", + "null_12_apples_red_12.99_null_null", + "null_12_apples_red_null_GB_large", + "null_12_apples_red_null_GB_null", + "null_12_apples_red_null_null_large", + "null_12_apples_red_null_null_null", + "null_12_apples_null_12.99_GB_large", + "null_12_apples_null_12.99_GB_null", + "null_12_apples_null_12.99_null_large", + "null_12_apples_null_12.99_null_null", + "null_12_apples_null_null_GB_large", + "null_12_apples_null_null_GB_null", + "null_12_apples_null_null_null_large", + "null_12_apples_null_null_null_null", + "null_12_null_red_12.99_GB_large", + "null_12_null_red_12.99_GB_null", + "null_12_null_red_12.99_null_large", + "null_12_null_red_12.99_null_null", + "null_12_null_red_null_GB_large", + "null_12_null_red_null_GB_null", + "null_12_null_red_null_null_large", + "null_12_null_red_null_null_null", + "null_12_null_null_12.99_GB_large", + "null_12_null_null_12.99_GB_null", + "null_12_null_null_12.99_null_large", + "null_12_null_null_12.99_null_null", + "null_12_null_null_null_GB_large", + "null_12_null_null_null_GB_null", + "null_12_null_null_null_null_large", + "null_12_null_null_null_null_null", + "null_null_apples_red_12.99_GB_large", + "null_null_apples_red_12.99_GB_null", + "null_null_apples_red_12.99_null_large", + "null_null_apples_red_12.99_null_null", + "null_null_apples_red_null_GB_large", + "null_null_apples_red_null_GB_null", + "null_null_apples_red_null_null_large", + "null_null_apples_red_null_null_null", + "null_null_apples_null_12.99_GB_large", + "null_null_apples_null_12.99_GB_null", + "null_null_apples_null_12.99_null_large", + "null_null_apples_null_12.99_null_null", + "null_null_apples_null_null_GB_large", + "null_null_apples_null_null_GB_null", + "null_null_apples_null_null_null_large", + "null_null_apples_null_null_null_null", + "null_null_null_red_12.99_GB_large", + "null_null_null_red_12.99_GB_null", + "null_null_null_red_12.99_null_large", + "null_null_null_red_12.99_null_null", + "null_null_null_red_null_GB_large", + "null_null_null_red_null_GB_null", + "null_null_null_red_null_null_large", + "null_null_null_red_null_null_null", + "null_null_null_null_12.99_GB_large", + "null_null_null_null_12.99_GB_null", + "null_null_null_null_12.99_null_large", + "null_null_null_null_12.99_null_null", + "null_null_null_null_null_GB_large", + "null_null_null_null_null_GB_null", + "null_null_null_null_null_null_large", + "null_null_null_null_null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase8OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase8OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..5489fc2 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase8OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,258 @@ +[ + "raining_12_apples_red_12.99_GB_large_red", + "raining_12_apples_red_12.99_GB_large_null", + "raining_12_apples_red_12.99_GB_null_red", + "raining_12_apples_red_12.99_GB_null_null", + "raining_12_apples_red_12.99_null_large_red", + "raining_12_apples_red_12.99_null_large_null", + "raining_12_apples_red_12.99_null_null_red", + "raining_12_apples_red_12.99_null_null_null", + "raining_12_apples_red_null_GB_large_red", + "raining_12_apples_red_null_GB_large_null", + "raining_12_apples_red_null_GB_null_red", + "raining_12_apples_red_null_GB_null_null", + "raining_12_apples_red_null_null_large_red", + "raining_12_apples_red_null_null_large_null", + "raining_12_apples_red_null_null_null_red", + "raining_12_apples_red_null_null_null_null", + "raining_12_apples_null_12.99_GB_large_red", + "raining_12_apples_null_12.99_GB_large_null", + "raining_12_apples_null_12.99_GB_null_red", + "raining_12_apples_null_12.99_GB_null_null", + "raining_12_apples_null_12.99_null_large_red", + "raining_12_apples_null_12.99_null_large_null", + "raining_12_apples_null_12.99_null_null_red", + "raining_12_apples_null_12.99_null_null_null", + "raining_12_apples_null_null_GB_large_red", + "raining_12_apples_null_null_GB_large_null", + "raining_12_apples_null_null_GB_null_red", + "raining_12_apples_null_null_GB_null_null", + "raining_12_apples_null_null_null_large_red", + "raining_12_apples_null_null_null_large_null", + "raining_12_apples_null_null_null_null_red", + "raining_12_apples_null_null_null_null_null", + "raining_12_null_red_12.99_GB_large_red", + "raining_12_null_red_12.99_GB_large_null", + "raining_12_null_red_12.99_GB_null_red", + "raining_12_null_red_12.99_GB_null_null", + "raining_12_null_red_12.99_null_large_red", + "raining_12_null_red_12.99_null_large_null", + "raining_12_null_red_12.99_null_null_red", + "raining_12_null_red_12.99_null_null_null", + "raining_12_null_red_null_GB_large_red", + "raining_12_null_red_null_GB_large_null", + "raining_12_null_red_null_GB_null_red", + "raining_12_null_red_null_GB_null_null", + "raining_12_null_red_null_null_large_red", + "raining_12_null_red_null_null_large_null", + "raining_12_null_red_null_null_null_red", + "raining_12_null_red_null_null_null_null", + "raining_12_null_null_12.99_GB_large_red", + "raining_12_null_null_12.99_GB_large_null", + "raining_12_null_null_12.99_GB_null_red", + "raining_12_null_null_12.99_GB_null_null", + "raining_12_null_null_12.99_null_large_red", + "raining_12_null_null_12.99_null_large_null", + "raining_12_null_null_12.99_null_null_red", + "raining_12_null_null_12.99_null_null_null", + "raining_12_null_null_null_GB_large_red", + "raining_12_null_null_null_GB_large_null", + "raining_12_null_null_null_GB_null_red", + "raining_12_null_null_null_GB_null_null", + "raining_12_null_null_null_null_large_red", + "raining_12_null_null_null_null_large_null", + "raining_12_null_null_null_null_null_red", + "raining_12_null_null_null_null_null_null", + "raining_null_apples_red_12.99_GB_large_red", + "raining_null_apples_red_12.99_GB_large_null", + "raining_null_apples_red_12.99_GB_null_red", + "raining_null_apples_red_12.99_GB_null_null", + "raining_null_apples_red_12.99_null_large_red", + "raining_null_apples_red_12.99_null_large_null", + "raining_null_apples_red_12.99_null_null_red", + "raining_null_apples_red_12.99_null_null_null", + "raining_null_apples_red_null_GB_large_red", + "raining_null_apples_red_null_GB_large_null", + "raining_null_apples_red_null_GB_null_red", + "raining_null_apples_red_null_GB_null_null", + "raining_null_apples_red_null_null_large_red", + "raining_null_apples_red_null_null_large_null", + "raining_null_apples_red_null_null_null_red", + "raining_null_apples_red_null_null_null_null", + "raining_null_apples_null_12.99_GB_large_red", + "raining_null_apples_null_12.99_GB_large_null", + "raining_null_apples_null_12.99_GB_null_red", + "raining_null_apples_null_12.99_GB_null_null", + "raining_null_apples_null_12.99_null_large_red", + "raining_null_apples_null_12.99_null_large_null", + "raining_null_apples_null_12.99_null_null_red", + "raining_null_apples_null_12.99_null_null_null", + "raining_null_apples_null_null_GB_large_red", + "raining_null_apples_null_null_GB_large_null", + "raining_null_apples_null_null_GB_null_red", + "raining_null_apples_null_null_GB_null_null", + "raining_null_apples_null_null_null_large_red", + "raining_null_apples_null_null_null_large_null", + "raining_null_apples_null_null_null_null_red", + "raining_null_apples_null_null_null_null_null", + "raining_null_null_red_12.99_GB_large_red", + "raining_null_null_red_12.99_GB_large_null", + "raining_null_null_red_12.99_GB_null_red", + "raining_null_null_red_12.99_GB_null_null", + "raining_null_null_red_12.99_null_large_red", + "raining_null_null_red_12.99_null_large_null", + "raining_null_null_red_12.99_null_null_red", + "raining_null_null_red_12.99_null_null_null", + "raining_null_null_red_null_GB_large_red", + "raining_null_null_red_null_GB_large_null", + "raining_null_null_red_null_GB_null_red", + "raining_null_null_red_null_GB_null_null", + "raining_null_null_red_null_null_large_red", + "raining_null_null_red_null_null_large_null", + "raining_null_null_red_null_null_null_red", + "raining_null_null_red_null_null_null_null", + "raining_null_null_null_12.99_GB_large_red", + "raining_null_null_null_12.99_GB_large_null", + "raining_null_null_null_12.99_GB_null_red", + "raining_null_null_null_12.99_GB_null_null", + "raining_null_null_null_12.99_null_large_red", + "raining_null_null_null_12.99_null_large_null", + "raining_null_null_null_12.99_null_null_red", + "raining_null_null_null_12.99_null_null_null", + "raining_null_null_null_null_GB_large_red", + "raining_null_null_null_null_GB_large_null", + "raining_null_null_null_null_GB_null_red", + "raining_null_null_null_null_GB_null_null", + "raining_null_null_null_null_null_large_red", + "raining_null_null_null_null_null_large_null", + "raining_null_null_null_null_null_null_red", + "raining_null_null_null_null_null_null_null", + "null_12_apples_red_12.99_GB_large_red", + "null_12_apples_red_12.99_GB_large_null", + "null_12_apples_red_12.99_GB_null_red", + "null_12_apples_red_12.99_GB_null_null", + "null_12_apples_red_12.99_null_large_red", + "null_12_apples_red_12.99_null_large_null", + "null_12_apples_red_12.99_null_null_red", + "null_12_apples_red_12.99_null_null_null", + "null_12_apples_red_null_GB_large_red", + "null_12_apples_red_null_GB_large_null", + "null_12_apples_red_null_GB_null_red", + "null_12_apples_red_null_GB_null_null", + "null_12_apples_red_null_null_large_red", + "null_12_apples_red_null_null_large_null", + "null_12_apples_red_null_null_null_red", + "null_12_apples_red_null_null_null_null", + "null_12_apples_null_12.99_GB_large_red", + "null_12_apples_null_12.99_GB_large_null", + "null_12_apples_null_12.99_GB_null_red", + "null_12_apples_null_12.99_GB_null_null", + "null_12_apples_null_12.99_null_large_red", + "null_12_apples_null_12.99_null_large_null", + "null_12_apples_null_12.99_null_null_red", + "null_12_apples_null_12.99_null_null_null", + "null_12_apples_null_null_GB_large_red", + "null_12_apples_null_null_GB_large_null", + "null_12_apples_null_null_GB_null_red", + "null_12_apples_null_null_GB_null_null", + "null_12_apples_null_null_null_large_red", + "null_12_apples_null_null_null_large_null", + "null_12_apples_null_null_null_null_red", + "null_12_apples_null_null_null_null_null", + "null_12_null_red_12.99_GB_large_red", + "null_12_null_red_12.99_GB_large_null", + "null_12_null_red_12.99_GB_null_red", + "null_12_null_red_12.99_GB_null_null", + "null_12_null_red_12.99_null_large_red", + "null_12_null_red_12.99_null_large_null", + "null_12_null_red_12.99_null_null_red", + "null_12_null_red_12.99_null_null_null", + "null_12_null_red_null_GB_large_red", + "null_12_null_red_null_GB_large_null", + "null_12_null_red_null_GB_null_red", + "null_12_null_red_null_GB_null_null", + "null_12_null_red_null_null_large_red", + "null_12_null_red_null_null_large_null", + "null_12_null_red_null_null_null_red", + "null_12_null_red_null_null_null_null", + "null_12_null_null_12.99_GB_large_red", + "null_12_null_null_12.99_GB_large_null", + "null_12_null_null_12.99_GB_null_red", + "null_12_null_null_12.99_GB_null_null", + "null_12_null_null_12.99_null_large_red", + "null_12_null_null_12.99_null_large_null", + "null_12_null_null_12.99_null_null_red", + "null_12_null_null_12.99_null_null_null", + "null_12_null_null_null_GB_large_red", + "null_12_null_null_null_GB_large_null", + "null_12_null_null_null_GB_null_red", + "null_12_null_null_null_GB_null_null", + "null_12_null_null_null_null_large_red", + "null_12_null_null_null_null_large_null", + "null_12_null_null_null_null_null_red", + "null_12_null_null_null_null_null_null", + "null_null_apples_red_12.99_GB_large_red", + "null_null_apples_red_12.99_GB_large_null", + "null_null_apples_red_12.99_GB_null_red", + "null_null_apples_red_12.99_GB_null_null", + "null_null_apples_red_12.99_null_large_red", + "null_null_apples_red_12.99_null_large_null", + "null_null_apples_red_12.99_null_null_red", + "null_null_apples_red_12.99_null_null_null", + "null_null_apples_red_null_GB_large_red", + "null_null_apples_red_null_GB_large_null", + "null_null_apples_red_null_GB_null_red", + "null_null_apples_red_null_GB_null_null", + "null_null_apples_red_null_null_large_red", + "null_null_apples_red_null_null_large_null", + "null_null_apples_red_null_null_null_red", + "null_null_apples_red_null_null_null_null", + "null_null_apples_null_12.99_GB_large_red", + "null_null_apples_null_12.99_GB_large_null", + "null_null_apples_null_12.99_GB_null_red", + "null_null_apples_null_12.99_GB_null_null", + "null_null_apples_null_12.99_null_large_red", + "null_null_apples_null_12.99_null_large_null", + "null_null_apples_null_12.99_null_null_red", + "null_null_apples_null_12.99_null_null_null", + "null_null_apples_null_null_GB_large_red", + "null_null_apples_null_null_GB_large_null", + "null_null_apples_null_null_GB_null_red", + "null_null_apples_null_null_GB_null_null", + "null_null_apples_null_null_null_large_red", + "null_null_apples_null_null_null_large_null", + "null_null_apples_null_null_null_null_red", + "null_null_apples_null_null_null_null_null", + "null_null_null_red_12.99_GB_large_red", + "null_null_null_red_12.99_GB_large_null", + "null_null_null_red_12.99_GB_null_red", + "null_null_null_red_12.99_GB_null_null", + "null_null_null_red_12.99_null_large_red", + "null_null_null_red_12.99_null_large_null", + "null_null_null_red_12.99_null_null_red", + "null_null_null_red_12.99_null_null_null", + "null_null_null_red_null_GB_large_red", + "null_null_null_red_null_GB_large_null", + "null_null_null_red_null_GB_null_red", + "null_null_null_red_null_GB_null_null", + "null_null_null_red_null_null_large_red", + "null_null_null_red_null_null_large_null", + "null_null_null_red_null_null_null_red", + "null_null_null_red_null_null_null_null", + "null_null_null_null_12.99_GB_large_red", + "null_null_null_null_12.99_GB_large_null", + "null_null_null_null_12.99_GB_null_red", + "null_null_null_null_12.99_GB_null_null", + "null_null_null_null_12.99_null_large_red", + "null_null_null_null_12.99_null_large_null", + "null_null_null_null_12.99_null_null_red", + "null_null_null_null_12.99_null_null_null", + "null_null_null_null_null_GB_large_red", + "null_null_null_null_null_GB_large_null", + "null_null_null_null_null_GB_null_red", + "null_null_null_null_null_GB_null_null", + "null_null_null_null_null_null_large_red", + "null_null_null_null_null_null_large_null", + "null_null_null_null_null_null_null_red", + "null_null_null_null_null_null_null_null" +] \ No newline at end of file diff --git a/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase9OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase9OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json new file mode 100644 index 0000000..268f175 --- /dev/null +++ b/Tests/ParameterizedTestingTests/__Snapshots__/ParameterizedTestCase9OptionalsTests/testAllCombinationsIsCalledForEachCombinationOfValues.1.json @@ -0,0 +1,514 @@ +[ + "raining_12_apples_red_12.99_GB_large_red_true", + "raining_12_apples_red_12.99_GB_large_red_null", + "raining_12_apples_red_12.99_GB_large_null_true", + "raining_12_apples_red_12.99_GB_large_null_null", + "raining_12_apples_red_12.99_GB_null_red_true", + "raining_12_apples_red_12.99_GB_null_red_null", + "raining_12_apples_red_12.99_GB_null_null_true", + "raining_12_apples_red_12.99_GB_null_null_null", + "raining_12_apples_red_12.99_null_large_red_true", + "raining_12_apples_red_12.99_null_large_red_null", + "raining_12_apples_red_12.99_null_large_null_true", + "raining_12_apples_red_12.99_null_large_null_null", + "raining_12_apples_red_12.99_null_null_red_true", + "raining_12_apples_red_12.99_null_null_red_null", + "raining_12_apples_red_12.99_null_null_null_true", + "raining_12_apples_red_12.99_null_null_null_null", + "raining_12_apples_red_null_GB_large_red_true", + "raining_12_apples_red_null_GB_large_red_null", + "raining_12_apples_red_null_GB_large_null_true", + "raining_12_apples_red_null_GB_large_null_null", + "raining_12_apples_red_null_GB_null_red_true", + "raining_12_apples_red_null_GB_null_red_null", + "raining_12_apples_red_null_GB_null_null_true", + "raining_12_apples_red_null_GB_null_null_null", + "raining_12_apples_red_null_null_large_red_true", + "raining_12_apples_red_null_null_large_red_null", + "raining_12_apples_red_null_null_large_null_true", + "raining_12_apples_red_null_null_large_null_null", + "raining_12_apples_red_null_null_null_red_true", + "raining_12_apples_red_null_null_null_red_null", + "raining_12_apples_red_null_null_null_null_true", + "raining_12_apples_red_null_null_null_null_null", + "raining_12_apples_null_12.99_GB_large_red_true", + "raining_12_apples_null_12.99_GB_large_red_null", + "raining_12_apples_null_12.99_GB_large_null_true", + "raining_12_apples_null_12.99_GB_large_null_null", + "raining_12_apples_null_12.99_GB_null_red_true", + "raining_12_apples_null_12.99_GB_null_red_null", + "raining_12_apples_null_12.99_GB_null_null_true", + "raining_12_apples_null_12.99_GB_null_null_null", + "raining_12_apples_null_12.99_null_large_red_true", + "raining_12_apples_null_12.99_null_large_red_null", + "raining_12_apples_null_12.99_null_large_null_true", + "raining_12_apples_null_12.99_null_large_null_null", + "raining_12_apples_null_12.99_null_null_red_true", + "raining_12_apples_null_12.99_null_null_red_null", + "raining_12_apples_null_12.99_null_null_null_true", + "raining_12_apples_null_12.99_null_null_null_null", + "raining_12_apples_null_null_GB_large_red_true", + "raining_12_apples_null_null_GB_large_red_null", + "raining_12_apples_null_null_GB_large_null_true", + "raining_12_apples_null_null_GB_large_null_null", + "raining_12_apples_null_null_GB_null_red_true", + "raining_12_apples_null_null_GB_null_red_null", + "raining_12_apples_null_null_GB_null_null_true", + "raining_12_apples_null_null_GB_null_null_null", + "raining_12_apples_null_null_null_large_red_true", + "raining_12_apples_null_null_null_large_red_null", + "raining_12_apples_null_null_null_large_null_true", + "raining_12_apples_null_null_null_large_null_null", + "raining_12_apples_null_null_null_null_red_true", + "raining_12_apples_null_null_null_null_red_null", + "raining_12_apples_null_null_null_null_null_true", + "raining_12_apples_null_null_null_null_null_null", + "raining_12_null_red_12.99_GB_large_red_true", + "raining_12_null_red_12.99_GB_large_red_null", + "raining_12_null_red_12.99_GB_large_null_true", + "raining_12_null_red_12.99_GB_large_null_null", + "raining_12_null_red_12.99_GB_null_red_true", + "raining_12_null_red_12.99_GB_null_red_null", + "raining_12_null_red_12.99_GB_null_null_true", + "raining_12_null_red_12.99_GB_null_null_null", + "raining_12_null_red_12.99_null_large_red_true", + "raining_12_null_red_12.99_null_large_red_null", + "raining_12_null_red_12.99_null_large_null_true", + "raining_12_null_red_12.99_null_large_null_null", + "raining_12_null_red_12.99_null_null_red_true", + "raining_12_null_red_12.99_null_null_red_null", + "raining_12_null_red_12.99_null_null_null_true", + "raining_12_null_red_12.99_null_null_null_null", + "raining_12_null_red_null_GB_large_red_true", + "raining_12_null_red_null_GB_large_red_null", + "raining_12_null_red_null_GB_large_null_true", + "raining_12_null_red_null_GB_large_null_null", + "raining_12_null_red_null_GB_null_red_true", + "raining_12_null_red_null_GB_null_red_null", + "raining_12_null_red_null_GB_null_null_true", + "raining_12_null_red_null_GB_null_null_null", + "raining_12_null_red_null_null_large_red_true", + "raining_12_null_red_null_null_large_red_null", + "raining_12_null_red_null_null_large_null_true", + "raining_12_null_red_null_null_large_null_null", + "raining_12_null_red_null_null_null_red_true", + "raining_12_null_red_null_null_null_red_null", + "raining_12_null_red_null_null_null_null_true", + "raining_12_null_red_null_null_null_null_null", + "raining_12_null_null_12.99_GB_large_red_true", + "raining_12_null_null_12.99_GB_large_red_null", + "raining_12_null_null_12.99_GB_large_null_true", + "raining_12_null_null_12.99_GB_large_null_null", + "raining_12_null_null_12.99_GB_null_red_true", + "raining_12_null_null_12.99_GB_null_red_null", + "raining_12_null_null_12.99_GB_null_null_true", + "raining_12_null_null_12.99_GB_null_null_null", + "raining_12_null_null_12.99_null_large_red_true", + "raining_12_null_null_12.99_null_large_red_null", + "raining_12_null_null_12.99_null_large_null_true", + "raining_12_null_null_12.99_null_large_null_null", + "raining_12_null_null_12.99_null_null_red_true", + "raining_12_null_null_12.99_null_null_red_null", + "raining_12_null_null_12.99_null_null_null_true", + "raining_12_null_null_12.99_null_null_null_null", + "raining_12_null_null_null_GB_large_red_true", + "raining_12_null_null_null_GB_large_red_null", + "raining_12_null_null_null_GB_large_null_true", + "raining_12_null_null_null_GB_large_null_null", + "raining_12_null_null_null_GB_null_red_true", + "raining_12_null_null_null_GB_null_red_null", + "raining_12_null_null_null_GB_null_null_true", + "raining_12_null_null_null_GB_null_null_null", + "raining_12_null_null_null_null_large_red_true", + "raining_12_null_null_null_null_large_red_null", + "raining_12_null_null_null_null_large_null_true", + "raining_12_null_null_null_null_large_null_null", + "raining_12_null_null_null_null_null_red_true", + "raining_12_null_null_null_null_null_red_null", + "raining_12_null_null_null_null_null_null_true", + "raining_12_null_null_null_null_null_null_null", + "raining_null_apples_red_12.99_GB_large_red_true", + "raining_null_apples_red_12.99_GB_large_red_null", + "raining_null_apples_red_12.99_GB_large_null_true", + "raining_null_apples_red_12.99_GB_large_null_null", + "raining_null_apples_red_12.99_GB_null_red_true", + "raining_null_apples_red_12.99_GB_null_red_null", + "raining_null_apples_red_12.99_GB_null_null_true", + "raining_null_apples_red_12.99_GB_null_null_null", + "raining_null_apples_red_12.99_null_large_red_true", + "raining_null_apples_red_12.99_null_large_red_null", + "raining_null_apples_red_12.99_null_large_null_true", + "raining_null_apples_red_12.99_null_large_null_null", + "raining_null_apples_red_12.99_null_null_red_true", + "raining_null_apples_red_12.99_null_null_red_null", + "raining_null_apples_red_12.99_null_null_null_true", + "raining_null_apples_red_12.99_null_null_null_null", + "raining_null_apples_red_null_GB_large_red_true", + "raining_null_apples_red_null_GB_large_red_null", + "raining_null_apples_red_null_GB_large_null_true", + "raining_null_apples_red_null_GB_large_null_null", + "raining_null_apples_red_null_GB_null_red_true", + "raining_null_apples_red_null_GB_null_red_null", + "raining_null_apples_red_null_GB_null_null_true", + "raining_null_apples_red_null_GB_null_null_null", + "raining_null_apples_red_null_null_large_red_true", + "raining_null_apples_red_null_null_large_red_null", + "raining_null_apples_red_null_null_large_null_true", + "raining_null_apples_red_null_null_large_null_null", + "raining_null_apples_red_null_null_null_red_true", + "raining_null_apples_red_null_null_null_red_null", + "raining_null_apples_red_null_null_null_null_true", + "raining_null_apples_red_null_null_null_null_null", + "raining_null_apples_null_12.99_GB_large_red_true", + "raining_null_apples_null_12.99_GB_large_red_null", + "raining_null_apples_null_12.99_GB_large_null_true", + "raining_null_apples_null_12.99_GB_large_null_null", + "raining_null_apples_null_12.99_GB_null_red_true", + "raining_null_apples_null_12.99_GB_null_red_null", + "raining_null_apples_null_12.99_GB_null_null_true", + "raining_null_apples_null_12.99_GB_null_null_null", + "raining_null_apples_null_12.99_null_large_red_true", + "raining_null_apples_null_12.99_null_large_red_null", + "raining_null_apples_null_12.99_null_large_null_true", + "raining_null_apples_null_12.99_null_large_null_null", + "raining_null_apples_null_12.99_null_null_red_true", + "raining_null_apples_null_12.99_null_null_red_null", + "raining_null_apples_null_12.99_null_null_null_true", + "raining_null_apples_null_12.99_null_null_null_null", + "raining_null_apples_null_null_GB_large_red_true", + "raining_null_apples_null_null_GB_large_red_null", + "raining_null_apples_null_null_GB_large_null_true", + "raining_null_apples_null_null_GB_large_null_null", + "raining_null_apples_null_null_GB_null_red_true", + "raining_null_apples_null_null_GB_null_red_null", + "raining_null_apples_null_null_GB_null_null_true", + "raining_null_apples_null_null_GB_null_null_null", + "raining_null_apples_null_null_null_large_red_true", + "raining_null_apples_null_null_null_large_red_null", + "raining_null_apples_null_null_null_large_null_true", + "raining_null_apples_null_null_null_large_null_null", + "raining_null_apples_null_null_null_null_red_true", + "raining_null_apples_null_null_null_null_red_null", + "raining_null_apples_null_null_null_null_null_true", + "raining_null_apples_null_null_null_null_null_null", + "raining_null_null_red_12.99_GB_large_red_true", + "raining_null_null_red_12.99_GB_large_red_null", + "raining_null_null_red_12.99_GB_large_null_true", + "raining_null_null_red_12.99_GB_large_null_null", + "raining_null_null_red_12.99_GB_null_red_true", + "raining_null_null_red_12.99_GB_null_red_null", + "raining_null_null_red_12.99_GB_null_null_true", + "raining_null_null_red_12.99_GB_null_null_null", + "raining_null_null_red_12.99_null_large_red_true", + "raining_null_null_red_12.99_null_large_red_null", + "raining_null_null_red_12.99_null_large_null_true", + "raining_null_null_red_12.99_null_large_null_null", + "raining_null_null_red_12.99_null_null_red_true", + "raining_null_null_red_12.99_null_null_red_null", + "raining_null_null_red_12.99_null_null_null_true", + "raining_null_null_red_12.99_null_null_null_null", + "raining_null_null_red_null_GB_large_red_true", + "raining_null_null_red_null_GB_large_red_null", + "raining_null_null_red_null_GB_large_null_true", + "raining_null_null_red_null_GB_large_null_null", + "raining_null_null_red_null_GB_null_red_true", + "raining_null_null_red_null_GB_null_red_null", + "raining_null_null_red_null_GB_null_null_true", + "raining_null_null_red_null_GB_null_null_null", + "raining_null_null_red_null_null_large_red_true", + "raining_null_null_red_null_null_large_red_null", + "raining_null_null_red_null_null_large_null_true", + "raining_null_null_red_null_null_large_null_null", + "raining_null_null_red_null_null_null_red_true", + "raining_null_null_red_null_null_null_red_null", + "raining_null_null_red_null_null_null_null_true", + "raining_null_null_red_null_null_null_null_null", + "raining_null_null_null_12.99_GB_large_red_true", + "raining_null_null_null_12.99_GB_large_red_null", + "raining_null_null_null_12.99_GB_large_null_true", + "raining_null_null_null_12.99_GB_large_null_null", + "raining_null_null_null_12.99_GB_null_red_true", + "raining_null_null_null_12.99_GB_null_red_null", + "raining_null_null_null_12.99_GB_null_null_true", + "raining_null_null_null_12.99_GB_null_null_null", + "raining_null_null_null_12.99_null_large_red_true", + "raining_null_null_null_12.99_null_large_red_null", + "raining_null_null_null_12.99_null_large_null_true", + "raining_null_null_null_12.99_null_large_null_null", + "raining_null_null_null_12.99_null_null_red_true", + "raining_null_null_null_12.99_null_null_red_null", + "raining_null_null_null_12.99_null_null_null_true", + "raining_null_null_null_12.99_null_null_null_null", + "raining_null_null_null_null_GB_large_red_true", + "raining_null_null_null_null_GB_large_red_null", + "raining_null_null_null_null_GB_large_null_true", + "raining_null_null_null_null_GB_large_null_null", + "raining_null_null_null_null_GB_null_red_true", + "raining_null_null_null_null_GB_null_red_null", + "raining_null_null_null_null_GB_null_null_true", + "raining_null_null_null_null_GB_null_null_null", + "raining_null_null_null_null_null_large_red_true", + "raining_null_null_null_null_null_large_red_null", + "raining_null_null_null_null_null_large_null_true", + "raining_null_null_null_null_null_large_null_null", + "raining_null_null_null_null_null_null_red_true", + "raining_null_null_null_null_null_null_red_null", + "raining_null_null_null_null_null_null_null_true", + "raining_null_null_null_null_null_null_null_null", + "null_12_apples_red_12.99_GB_large_red_true", + "null_12_apples_red_12.99_GB_large_red_null", + "null_12_apples_red_12.99_GB_large_null_true", + "null_12_apples_red_12.99_GB_large_null_null", + "null_12_apples_red_12.99_GB_null_red_true", + "null_12_apples_red_12.99_GB_null_red_null", + "null_12_apples_red_12.99_GB_null_null_true", + "null_12_apples_red_12.99_GB_null_null_null", + "null_12_apples_red_12.99_null_large_red_true", + "null_12_apples_red_12.99_null_large_red_null", + "null_12_apples_red_12.99_null_large_null_true", + "null_12_apples_red_12.99_null_large_null_null", + "null_12_apples_red_12.99_null_null_red_true", + "null_12_apples_red_12.99_null_null_red_null", + "null_12_apples_red_12.99_null_null_null_true", + "null_12_apples_red_12.99_null_null_null_null", + "null_12_apples_red_null_GB_large_red_true", + "null_12_apples_red_null_GB_large_red_null", + "null_12_apples_red_null_GB_large_null_true", + "null_12_apples_red_null_GB_large_null_null", + "null_12_apples_red_null_GB_null_red_true", + "null_12_apples_red_null_GB_null_red_null", + "null_12_apples_red_null_GB_null_null_true", + "null_12_apples_red_null_GB_null_null_null", + "null_12_apples_red_null_null_large_red_true", + "null_12_apples_red_null_null_large_red_null", + "null_12_apples_red_null_null_large_null_true", + "null_12_apples_red_null_null_large_null_null", + "null_12_apples_red_null_null_null_red_true", + "null_12_apples_red_null_null_null_red_null", + "null_12_apples_red_null_null_null_null_true", + "null_12_apples_red_null_null_null_null_null", + "null_12_apples_null_12.99_GB_large_red_true", + "null_12_apples_null_12.99_GB_large_red_null", + "null_12_apples_null_12.99_GB_large_null_true", + "null_12_apples_null_12.99_GB_large_null_null", + "null_12_apples_null_12.99_GB_null_red_true", + "null_12_apples_null_12.99_GB_null_red_null", + "null_12_apples_null_12.99_GB_null_null_true", + "null_12_apples_null_12.99_GB_null_null_null", + "null_12_apples_null_12.99_null_large_red_true", + "null_12_apples_null_12.99_null_large_red_null", + "null_12_apples_null_12.99_null_large_null_true", + "null_12_apples_null_12.99_null_large_null_null", + "null_12_apples_null_12.99_null_null_red_true", + "null_12_apples_null_12.99_null_null_red_null", + "null_12_apples_null_12.99_null_null_null_true", + "null_12_apples_null_12.99_null_null_null_null", + "null_12_apples_null_null_GB_large_red_true", + "null_12_apples_null_null_GB_large_red_null", + "null_12_apples_null_null_GB_large_null_true", + "null_12_apples_null_null_GB_large_null_null", + "null_12_apples_null_null_GB_null_red_true", + "null_12_apples_null_null_GB_null_red_null", + "null_12_apples_null_null_GB_null_null_true", + "null_12_apples_null_null_GB_null_null_null", + "null_12_apples_null_null_null_large_red_true", + "null_12_apples_null_null_null_large_red_null", + "null_12_apples_null_null_null_large_null_true", + "null_12_apples_null_null_null_large_null_null", + "null_12_apples_null_null_null_null_red_true", + "null_12_apples_null_null_null_null_red_null", + "null_12_apples_null_null_null_null_null_true", + "null_12_apples_null_null_null_null_null_null", + "null_12_null_red_12.99_GB_large_red_true", + "null_12_null_red_12.99_GB_large_red_null", + "null_12_null_red_12.99_GB_large_null_true", + "null_12_null_red_12.99_GB_large_null_null", + "null_12_null_red_12.99_GB_null_red_true", + "null_12_null_red_12.99_GB_null_red_null", + "null_12_null_red_12.99_GB_null_null_true", + "null_12_null_red_12.99_GB_null_null_null", + "null_12_null_red_12.99_null_large_red_true", + "null_12_null_red_12.99_null_large_red_null", + "null_12_null_red_12.99_null_large_null_true", + "null_12_null_red_12.99_null_large_null_null", + "null_12_null_red_12.99_null_null_red_true", + "null_12_null_red_12.99_null_null_red_null", + "null_12_null_red_12.99_null_null_null_true", + "null_12_null_red_12.99_null_null_null_null", + "null_12_null_red_null_GB_large_red_true", + "null_12_null_red_null_GB_large_red_null", + "null_12_null_red_null_GB_large_null_true", + "null_12_null_red_null_GB_large_null_null", + "null_12_null_red_null_GB_null_red_true", + "null_12_null_red_null_GB_null_red_null", + "null_12_null_red_null_GB_null_null_true", + "null_12_null_red_null_GB_null_null_null", + "null_12_null_red_null_null_large_red_true", + "null_12_null_red_null_null_large_red_null", + "null_12_null_red_null_null_large_null_true", + "null_12_null_red_null_null_large_null_null", + "null_12_null_red_null_null_null_red_true", + "null_12_null_red_null_null_null_red_null", + "null_12_null_red_null_null_null_null_true", + "null_12_null_red_null_null_null_null_null", + "null_12_null_null_12.99_GB_large_red_true", + "null_12_null_null_12.99_GB_large_red_null", + "null_12_null_null_12.99_GB_large_null_true", + "null_12_null_null_12.99_GB_large_null_null", + "null_12_null_null_12.99_GB_null_red_true", + "null_12_null_null_12.99_GB_null_red_null", + "null_12_null_null_12.99_GB_null_null_true", + "null_12_null_null_12.99_GB_null_null_null", + "null_12_null_null_12.99_null_large_red_true", + "null_12_null_null_12.99_null_large_red_null", + "null_12_null_null_12.99_null_large_null_true", + "null_12_null_null_12.99_null_large_null_null", + "null_12_null_null_12.99_null_null_red_true", + "null_12_null_null_12.99_null_null_red_null", + "null_12_null_null_12.99_null_null_null_true", + "null_12_null_null_12.99_null_null_null_null", + "null_12_null_null_null_GB_large_red_true", + "null_12_null_null_null_GB_large_red_null", + "null_12_null_null_null_GB_large_null_true", + "null_12_null_null_null_GB_large_null_null", + "null_12_null_null_null_GB_null_red_true", + "null_12_null_null_null_GB_null_red_null", + "null_12_null_null_null_GB_null_null_true", + "null_12_null_null_null_GB_null_null_null", + "null_12_null_null_null_null_large_red_true", + "null_12_null_null_null_null_large_red_null", + "null_12_null_null_null_null_large_null_true", + "null_12_null_null_null_null_large_null_null", + "null_12_null_null_null_null_null_red_true", + "null_12_null_null_null_null_null_red_null", + "null_12_null_null_null_null_null_null_true", + "null_12_null_null_null_null_null_null_null", + "null_null_apples_red_12.99_GB_large_red_true", + "null_null_apples_red_12.99_GB_large_red_null", + "null_null_apples_red_12.99_GB_large_null_true", + "null_null_apples_red_12.99_GB_large_null_null", + "null_null_apples_red_12.99_GB_null_red_true", + "null_null_apples_red_12.99_GB_null_red_null", + "null_null_apples_red_12.99_GB_null_null_true", + "null_null_apples_red_12.99_GB_null_null_null", + "null_null_apples_red_12.99_null_large_red_true", + "null_null_apples_red_12.99_null_large_red_null", + "null_null_apples_red_12.99_null_large_null_true", + "null_null_apples_red_12.99_null_large_null_null", + "null_null_apples_red_12.99_null_null_red_true", + "null_null_apples_red_12.99_null_null_red_null", + "null_null_apples_red_12.99_null_null_null_true", + "null_null_apples_red_12.99_null_null_null_null", + "null_null_apples_red_null_GB_large_red_true", + "null_null_apples_red_null_GB_large_red_null", + "null_null_apples_red_null_GB_large_null_true", + "null_null_apples_red_null_GB_large_null_null", + "null_null_apples_red_null_GB_null_red_true", + "null_null_apples_red_null_GB_null_red_null", + "null_null_apples_red_null_GB_null_null_true", + "null_null_apples_red_null_GB_null_null_null", + "null_null_apples_red_null_null_large_red_true", + "null_null_apples_red_null_null_large_red_null", + "null_null_apples_red_null_null_large_null_true", + "null_null_apples_red_null_null_large_null_null", + "null_null_apples_red_null_null_null_red_true", + "null_null_apples_red_null_null_null_red_null", + "null_null_apples_red_null_null_null_null_true", + "null_null_apples_red_null_null_null_null_null", + "null_null_apples_null_12.99_GB_large_red_true", + "null_null_apples_null_12.99_GB_large_red_null", + "null_null_apples_null_12.99_GB_large_null_true", + "null_null_apples_null_12.99_GB_large_null_null", + "null_null_apples_null_12.99_GB_null_red_true", + "null_null_apples_null_12.99_GB_null_red_null", + "null_null_apples_null_12.99_GB_null_null_true", + "null_null_apples_null_12.99_GB_null_null_null", + "null_null_apples_null_12.99_null_large_red_true", + "null_null_apples_null_12.99_null_large_red_null", + "null_null_apples_null_12.99_null_large_null_true", + "null_null_apples_null_12.99_null_large_null_null", + "null_null_apples_null_12.99_null_null_red_true", + "null_null_apples_null_12.99_null_null_red_null", + "null_null_apples_null_12.99_null_null_null_true", + "null_null_apples_null_12.99_null_null_null_null", + "null_null_apples_null_null_GB_large_red_true", + "null_null_apples_null_null_GB_large_red_null", + "null_null_apples_null_null_GB_large_null_true", + "null_null_apples_null_null_GB_large_null_null", + "null_null_apples_null_null_GB_null_red_true", + "null_null_apples_null_null_GB_null_red_null", + "null_null_apples_null_null_GB_null_null_true", + "null_null_apples_null_null_GB_null_null_null", + "null_null_apples_null_null_null_large_red_true", + "null_null_apples_null_null_null_large_red_null", + "null_null_apples_null_null_null_large_null_true", + "null_null_apples_null_null_null_large_null_null", + "null_null_apples_null_null_null_null_red_true", + "null_null_apples_null_null_null_null_red_null", + "null_null_apples_null_null_null_null_null_true", + "null_null_apples_null_null_null_null_null_null", + "null_null_null_red_12.99_GB_large_red_true", + "null_null_null_red_12.99_GB_large_red_null", + "null_null_null_red_12.99_GB_large_null_true", + "null_null_null_red_12.99_GB_large_null_null", + "null_null_null_red_12.99_GB_null_red_true", + "null_null_null_red_12.99_GB_null_red_null", + "null_null_null_red_12.99_GB_null_null_true", + "null_null_null_red_12.99_GB_null_null_null", + "null_null_null_red_12.99_null_large_red_true", + "null_null_null_red_12.99_null_large_red_null", + "null_null_null_red_12.99_null_large_null_true", + "null_null_null_red_12.99_null_large_null_null", + "null_null_null_red_12.99_null_null_red_true", + "null_null_null_red_12.99_null_null_red_null", + "null_null_null_red_12.99_null_null_null_true", + "null_null_null_red_12.99_null_null_null_null", + "null_null_null_red_null_GB_large_red_true", + "null_null_null_red_null_GB_large_red_null", + "null_null_null_red_null_GB_large_null_true", + "null_null_null_red_null_GB_large_null_null", + "null_null_null_red_null_GB_null_red_true", + "null_null_null_red_null_GB_null_red_null", + "null_null_null_red_null_GB_null_null_true", + "null_null_null_red_null_GB_null_null_null", + "null_null_null_red_null_null_large_red_true", + "null_null_null_red_null_null_large_red_null", + "null_null_null_red_null_null_large_null_true", + "null_null_null_red_null_null_large_null_null", + "null_null_null_red_null_null_null_red_true", + "null_null_null_red_null_null_null_red_null", + "null_null_null_red_null_null_null_null_true", + "null_null_null_red_null_null_null_null_null", + "null_null_null_null_12.99_GB_large_red_true", + "null_null_null_null_12.99_GB_large_red_null", + "null_null_null_null_12.99_GB_large_null_true", + "null_null_null_null_12.99_GB_large_null_null", + "null_null_null_null_12.99_GB_null_red_true", + "null_null_null_null_12.99_GB_null_red_null", + "null_null_null_null_12.99_GB_null_null_true", + "null_null_null_null_12.99_GB_null_null_null", + "null_null_null_null_12.99_null_large_red_true", + "null_null_null_null_12.99_null_large_red_null", + "null_null_null_null_12.99_null_large_null_true", + "null_null_null_null_12.99_null_large_null_null", + "null_null_null_null_12.99_null_null_red_true", + "null_null_null_null_12.99_null_null_red_null", + "null_null_null_null_12.99_null_null_null_true", + "null_null_null_null_12.99_null_null_null_null", + "null_null_null_null_null_GB_large_red_true", + "null_null_null_null_null_GB_large_red_null", + "null_null_null_null_null_GB_large_null_true", + "null_null_null_null_null_GB_large_null_null", + "null_null_null_null_null_GB_null_red_true", + "null_null_null_null_null_GB_null_red_null", + "null_null_null_null_null_GB_null_null_true", + "null_null_null_null_null_GB_null_null_null", + "null_null_null_null_null_null_large_red_true", + "null_null_null_null_null_null_large_red_null", + "null_null_null_null_null_null_large_null_true", + "null_null_null_null_null_null_large_null_null", + "null_null_null_null_null_null_null_red_true", + "null_null_null_null_null_null_null_red_null", + "null_null_null_null_null_null_null_null_true", + "null_null_null_null_null_null_null_null_null" +] \ No newline at end of file