From 1ddb74eb14b100074341f22094ab2150636b5877 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Sun, 2 Sep 2018 12:03:02 +0100 Subject: [PATCH 1/7] implement data tables --- Example/Tests/Features/ExampleFeatures.swift | 30 +- .../Tests/Features/NativeDataTableTest.swift | 29 ++ .../NativeFeatures/native_data_table.feature | 55 ++++ .../Tests/StepDefinitions/SanitySteps.swift | 98 ++++++ Pod/Core/DataTable.swift | 45 +++ Pod/Core/MatchedStringRepresentable.swift | 18 -- Pod/Core/StepDefiner.swift | 15 - Pod/Native/NativeDataTable.swift | 289 ++++++++++++++++++ Pod/Native/NativeFeature.swift | 25 +- Pod/Native/ParseState.swift | 68 +++-- 10 files changed, 603 insertions(+), 69 deletions(-) create mode 100644 Example/Tests/Features/NativeDataTableTest.swift create mode 100644 Example/Tests/Features/NativeFeatures/native_data_table.feature create mode 100644 Pod/Core/DataTable.swift create mode 100644 Pod/Native/NativeDataTable.swift diff --git a/Example/Tests/Features/ExampleFeatures.swift b/Example/Tests/Features/ExampleFeatures.swift index 6817762..c801694 100644 --- a/Example/Tests/Features/ExampleFeatures.swift +++ b/Example/Tests/Features/ExampleFeatures.swift @@ -90,10 +90,10 @@ final class ExampleFeatures: XCTestCase { } } - struct Person: CodableMatchedStringRepresentable { + struct Person: CodableMatchedStringRepresentable, Equatable { let name: String let age: Int - let height: Int + let height: Float } func testCustomExampleValues() { @@ -179,4 +179,30 @@ final class ExampleFeatures: XCTestCase { /// in the step Given(MatchStringLiteralStepDefiner.literal) } + + func testArrayDataTable() { + Given("I add the following numbers: \(DataTable([1, 2, 3]))") + Then("I end up with 6") + } + + func testDictionaryDataTable() { + Given("I add the following letters: \(DataTable(["a": 1, "b": 2, "c": 3]))") + Then("I end up with 6") + } + + func testCodableDataTable() { + let persons = [ + Person(name: "Alice", age: 27, height: 170), + Person(name: "Bob", age: 27, height: 170) + ] + Given("I know the following persons: \(DataTable(persons))") + + let personsByName = [ + "Alice": Person(name: "Alice", age: 27, height: 170), + "Bob": Person(name: "Bob", age: 27, height: 170) + ] + Given("I know the following persons by name: \(DataTable(personsByName))") + } + + } diff --git a/Example/Tests/Features/NativeDataTableTest.swift b/Example/Tests/Features/NativeDataTableTest.swift new file mode 100644 index 0000000..824adc6 --- /dev/null +++ b/Example/Tests/Features/NativeDataTableTest.swift @@ -0,0 +1,29 @@ +// +// NativeDataTableTest.swift +// XCTest-Gherkin_Tests +// +// Created by Ilya Puchka on 03/09/2018. +// Copyright © 2018 CocoaPods. All rights reserved. +// + +import XCTest +import XCTest_Gherkin + +final class NativeDataTableTest: NativeTestCase { + + struct Person: CodableMatchedStringRepresentable, Equatable { + let name: String + let age: String + let height: String + } + + override class func path() -> URL? { + let bundle = Bundle(for: self) + return bundle.resourceURL?.appendingPathComponent("NativeFeatures/native_data_table.feature") + } + + override func setUp() { + super.setUp() + print("Default setup method works before each native scenario") + } +} diff --git a/Example/Tests/Features/NativeFeatures/native_data_table.feature b/Example/Tests/Features/NativeFeatures/native_data_table.feature new file mode 100644 index 0000000..2892354 --- /dev/null +++ b/Example/Tests/Features/NativeFeatures/native_data_table.feature @@ -0,0 +1,55 @@ +Feature: Data tables + + Scenario: one dimensional array + Given I have the following array: + | 1 | + | 2 | + | 3 | + + Scenario: two dimensional array + Given I have the following array of arrays: + | 1 | 4 | + | 2 | 5 | + | 3 | 6 | + + Scenarion: table with titles + Given I have the following hash maps: + | firstName | lastName | birthDate | + | Annie M.G. | Schmidt | 1911-03-20 | + | Roald | Dahl | 1916-09-13 | + | Astrid | Lindgren | 1907-11-14 | + + Scenario: hash map + Given I have the following hash map: + | KMSY | Louis Armstrong New Orleans International Airport | + | KSFO | San Francisco International Airport | + | KSEA | Seattle–Tacoma International Airport | + | KJFK | John F. Kennedy International Airport | + + Scenario: one dimensional hash map + Given I have the following hash map list: + | KMSY | 29.993333 | -90.258056 | + | KSFO | 37.618889 | -122.375000 | + | KSEA | 47.448889 | -122.309444 | + | KJFK | 40.639722 | -73.778889 | + + Scenario: two dimensional hash map + Given I have the following hash map hash: + | | lat | lon | + | KMSY | 29.993333 | -90.258056 | + | KSFO | 37.618889 | -122.375000 | + | KSEA | 47.448889 | -122.309444 | + | KJFK | 40.639722 | -73.778889 | + + Scenario: data table with codable values + Given I have the following persons: + | name | age | height | + | Alice | 20 | 170 | + | Bob | 21 | 171 | + + Scenario: data table with hash map of codable values + Given I have the following persons by id: + | | name | age | height | + | 1 | Alice | 20 | 170 | + | 2 | Bob | 21 | 171 | + diff --git a/Example/Tests/StepDefinitions/SanitySteps.swift b/Example/Tests/StepDefinitions/SanitySteps.swift index f6d9830..586b93e 100644 --- a/Example/Tests/StepDefinitions/SanitySteps.swift +++ b/Example/Tests/StepDefinitions/SanitySteps.swift @@ -13,6 +13,7 @@ final class SanitySteps: StepDefiner { private var numberOfExamplesExecutedInOrder = 1 private var backgroundStepsExecuted = false + private var answer = 0 override func defineSteps() { @@ -165,6 +166,103 @@ final class SanitySteps: StepDefiner { step("This is unused step") {} + step("I know the following persons: (.+)") { (match: DataTable<[ExampleFeatures.Person]>) in + XCTAssertTrue(match.values[0].name == "Alice" || match.values[1].name == "Bob") + } + + step("I know the following persons by name: (.+)") { (match: DataTable<[String: ExampleFeatures.Person]>) in + XCTAssertTrue(match.values["Alice"]?.name == "Alice" || match.values["Bob"]?.name == "Bob") + } + + step("I add the following numbers: (.+)") { (match: DataTable<[Int]>) in + self.answer = match.values.reduce(self.answer, +) + } + + step("I add the following letters: (.+)") { (match: DataTable<[String: Int]>) in + self.answer = match.values.values.reduce(self.answer, +) + } + + step("I end up with (\\d+)") { (match: Int) in + XCTAssertEqual(self.answer, match) + self.answer = 0 + } + + step("I have the following array: (.+)") { (match: NativeDataTable) in + XCTAssertEqual(match.values, [1, 2, 3]) + } + + step("I have the following array of arrays: (.+)") { (match: NativeDataTable) in + XCTAssertEqual(match.values, [[1, 4], [2, 5], [3, 6]]) + } + + step("I have the following hash maps: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + [ "firstName": "Annie M.G.","lastName": "Schmidt", "birthDate": "1911-03-20" ], + [ "firstName": "Roald", "lastName": "Dahl", "birthDate": "1916-09-13" ], + [ "firstName": "Astrid", "lastName": "Lindgren", "birthDate": "1907-11-14" ] + ] + ) + } + + step("I have the following hash map: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + "KMSY": "Louis Armstrong New Orleans International Airport", + "KSFO": "San Francisco International Airport", + "KSEA": "Seattle–Tacoma International Airport", + "KJFK": "John F. Kennedy International Airport" + ] + ) + } + + step("I have the following hash map list: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + "KMSY": [29.993333, -90.258056], + "KSFO": [37.618889, -122.375000], + "KSEA": [47.448889, -122.309444], + "KJFK": [40.639722, -73.778889] + ] + ) + } + + step("I have the following hash map hash: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], + "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], + "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], + "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] + ] + ) + } + + step("I have the following persons: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + NativeDataTableTest.Person(name: "Alice", age: "20", height: "170"), + NativeDataTableTest.Person(name: "Bob", age: "21", height: "171") + ] + ) + } + + step("I have the following persons by id: (.+)") { (match: NativeDataTable) in + XCTAssertEqual( + match.values, + [ + "1": NativeDataTableTest.Person(name: "Alice", age: "20", height: "170"), + "2": NativeDataTableTest.Person(name: "Bob", age: "21", height: "171") + ] + ) + } + + } } diff --git a/Pod/Core/DataTable.swift b/Pod/Core/DataTable.swift new file mode 100644 index 0000000..cbe7e03 --- /dev/null +++ b/Pod/Core/DataTable.swift @@ -0,0 +1,45 @@ +// +// DataTable.swift +// XCTest-Gherkin +// +// Created by Ilya Puchka on 02/09/2018. +// + +import Foundation + +public struct DataTable: CodableMatchedStringRepresentable where T: Codable { + public let values: T + + public init(_ values: T) { + self.values = values + } + + public init(from decoder: Decoder) throws { + let values = try decoder.singleValueContainer() + self.values = try values.decode(T.self) + } + + public func encode(to encoder: Encoder) throws { + var values = encoder.singleValueContainer() + try values.encode(self.values) + } + + public init?(fromMatch match: String) { + let decoder = JSONDecoder() + guard let data = match.data(using: .utf8) else { + return nil + } + if let decoded = try? decoder.decode(DataTable.self, from: data) { + self = decoded + } else { + return nil + } + } + +} + +extension DataTable: Equatable where T: Equatable { + public static func ==(lhs: DataTable, rhs: DataTable) -> Bool { + return lhs.values == rhs.values + } +} diff --git a/Pod/Core/MatchedStringRepresentable.swift b/Pod/Core/MatchedStringRepresentable.swift index dc29224..fd242ea 100644 --- a/Pod/Core/MatchedStringRepresentable.swift +++ b/Pod/Core/MatchedStringRepresentable.swift @@ -53,21 +53,3 @@ extension CodableMatchedStringRepresentable { return String(data: encoded, encoding: .utf8)! } } -// For some reason extending array with CodableMatchedStringRepresentable makes `pod lint` to fail -// but this way it works and its sufficient as CodableMatchedStringRepresentable is just a composition of protocols 🤷‍♂️ -extension Array: MatchedStringRepresentable where Element: CodableMatchedStringRepresentable { - public init?(fromMatch match: String) { - let decoder = JSONDecoder() - guard let data = match.data(using: .utf8), - let decoded = try? decoder.decode([Element].self, from: data) else { - return nil - } - self = decoded - } - - public var description: String { - let encoder = JSONEncoder() - let encoded = try! encoder.encode(self) - return String(data: encoded, encoding: .utf8)! - } -} diff --git a/Pod/Core/StepDefiner.swift b/Pod/Core/StepDefiner.swift index 68fd716..3b2c9e7 100644 --- a/Pod/Core/StepDefiner.swift +++ b/Pod/Core/StepDefiner.swift @@ -150,21 +150,6 @@ open class StepDefiner: NSObject, XCTestObservation { } } - /** - Create a new step with an expression that contains one matching group to match collection of `MatchedStringRepresentable` values - - - parameter expression: The expression to match against - - parameter f: The step definition to be run, passing in the first capture group from the expression - */ - open func step(_ expression: String, file: String = #file, line: Int = #line, f: @escaping (T)->()) { - self.test.addStep(expression, options: regexOptions, file: file, line: line) { matches in - precondition(matches.count >= 1, "Expected single match in \"\(expression)\"") - let match = matches[0] - let value = requireToConvert(T(fromMatch: match), match, expression) - f(value) - } - } - /** If you only want to match the first two parameters, this will help make your code nicer diff --git a/Pod/Native/NativeDataTable.swift b/Pod/Native/NativeDataTable.swift new file mode 100644 index 0000000..0d7f148 --- /dev/null +++ b/Pod/Native/NativeDataTable.swift @@ -0,0 +1,289 @@ +// +// DataTable.swift +// XCTest-Gherkin +// +// Created by Ilya Puchka on 02/09/2018. +// + +import Foundation + +extension String: Error {} + +public struct NativeDataTable { + public let values: T + + public init?(fromMatch match: String, transform: ([[String]]) throws -> T) { + guard let data = match.data(using: .utf8), + let string = String(data: data, encoding: .utf8), string.contains("|,|") else { + return nil + } + + var lines = string.components(separatedBy: "|,|") + let first = lines.removeFirst() + "|" + let last = "|" + lines.removeLast() + let middle = lines.map { "|\($0)|" } + let table = ([first] + middle + [last]).map { + Array($0 + .components(separatedBy: "|") + .map { $0.trimmingCharacters(in: .whitespaces) } + .dropFirst().dropLast() + ) + } + + do { + self.values = try transform(table) + } catch { + print(error) + return nil + } + } +} + +extension StepDefiner { + func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable)->(), transform: @escaping ([[String]]) throws -> T) { + self.test.addStep(expression, file: file, line: line) { (matches: [String]) in + guard let match = matches.first else { + XCTFail("Expected single match not found in \"\(expression)\"") + return + } + + guard let dataTable = NativeDataTable(fromMatch: match, transform: transform) else { + XCTFail("Could not convert \"\(match)\" to \(T.self)") + return + } + + f1(dataTable) + } + } +} + +extension StepDefiner { + + /** + Input: + | 1 | + | 2 | + | 3 | + + Result: + [1, 2, 3] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [T] in + let columns = Set(values.map({ $0.count })) + guard columns.count == 1 && columns.first == 1 else { + throw "Table should contain single column" + } + return try values.map { + guard let value = T.init(fromMatch: $0[0]) else { + throw "Failed to convert \($0[0]) to \(T.self)" + } + return value + } + } + } + + // /** + // Input: + // | 1 | 4 | + // | 2 | 5 | + // | 3 | 6 | + // + // Result: + // [[1, 4], [2, 5], [3, 6]] + // */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[T]]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[T]] in + return try values.map { row in + try row.map { (cell) -> T in + guard let value = T.init(fromMatch: cell) else { + throw "Failed to convert \(cell) to \(T.self)" + } + return value + } + } + } + } + + /** + Input: + | firstName | lastName | birthDate | + | Annie M. G. | Schmidt | 1911-03-20 | + | Roald | Dahl | 1916-09-13 | + | Astrid | Lindgren | 1907-11-14 | + + Result: + [ + [ "firstName": "Annie M.G", "lastName": "Schmidt", "birthDate": "1911-03-20" ], + [ "firstName": "Roald", "lastName": "Dahl", "birthDate": "1916-09-13" ], + [ "firstName": "Astrid", "lastName": "Lindgren", "birthDate": "1907-11-14" ] + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[String: T]]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[String: T]] in + var values = values + let titles = values.removeFirst() + return try values.reduce(into: [[String: T]]()) { values, row in + let value = try row.enumerated().reduce(into: [String: T]()) { (values, cell) in + let title = titles[cell.offset] + guard let value = T.init(fromMatch: cell.element) else { + throw "Failed to convert \(cell.element) to \(T.self)" + } + values[title] = value + } + values.append(value) + } + } + } + + /** + Input: + | KMSY | Louis Armstrong New Orleans International Airport | + | KSFO | San Francisco International Airport | + | KSEA | Seattle–Tacoma International Airport | + | KJFK | John F. Kennedy International Airport | + + Result: + [ + "KMSY": "Louis Armstrong New Orleans International Airport", + "KSFO": "San Francisco International Airport", + "KSEA": "Seattle–Tacoma International Airport", + "KJFK": "John F. Kennedy International Airport" + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: T]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: T] in + let columns = Set(values.map({ $0.count })) + guard columns.count == 1 && columns.first == 2 else { + throw "Table should contain two columns" + } + return try values.reduce(into: [String: T]()) { (values, row) in + guard let value = T.init(fromMatch: row[1]) else { + throw "Failed to convert \(row[1]) to \(T.self)" + } + values[row[0]] = value + } + } + } + + /** + Input: + | KMSY | 29.993333 | -90.258056 | + | KSFO | 37.618889 | -122.375000 | + | KSEA | 47.448889 | -122.309444 | + | KJFK | 40.639722 | -73.778889 | + + Result: + [ + "KMSY": ["29.993333", "-90.258056"], + "KSFO": ["37.618889", "-122.375000"], + "KSEA": ["47.448889", "-122.309444"], + "KJFK": ["40.639722", "-73.778889"] + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [T]]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: [T]] in + return try values.reduce(into: [String: [T]]()) { (values, row) in + values[row[0]] = try row.dropFirst().map { cell in + guard let value = T.init(fromMatch: cell) else { + throw "Failed to convert \(cell) to \(T.self)" + } + return value + } + } + } + } + + /** + Input: + | | lat | lon | + | KMSY | 29.993333 | -90.258056 | + | KSFO | 37.618889 | -122.375000 | + | KSEA | 47.448889 | -122.309444 | + | KJFK | 40.639722 | -73.778889 | + + Result: + [ + "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], + "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], + "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], + "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [String: T]]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: [String: T]] in + var values = values + let titles = Array(values.removeFirst().dropFirst()) + return try values.reduce(into: [String: [String: T]]()) { (values, row) in + values[row[0]] = try Array(row.dropFirst()).enumerated().reduce(into: [String: T](), { (values, cell) in + let title = titles[cell.offset] + guard let value = T.init(fromMatch: cell.element) else { + throw "Failed to convert \(cell.element) to \(T.self)" + } + values[title] = value + }) + } + } + } + + // TODO: implement custom decoder that will decode string cell values to expected types instead of failing + // This currently only works if all properties are strings + /** + Input: + | name | age | height | + | Alice | 20 | 170 | + | Bob | 21 | 171 | + + Output: + [ + Person(name: "Alice", age: "20", height: "170"), + Person(name: "Bob", age: "21", height: "171") + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [T] in + var values = values + let titles = values.removeFirst() + return try values.reduce(into: [T]()) { values, row in + let value = row.enumerated().reduce(into: [String: String]()) { (values, cell) in + let title = titles[cell.offset] + values[title] = cell.element + } + let data = try JSONEncoder().encode(value) + let decoded = try JSONDecoder().decode(T.self, from: data) + values.append(decoded) + } + } + } + + // TODO: implement custom decoder that will decode string cell values to expected types instead of failing + // This currently only works if all properties are strings + /** + Input: + | | name | age | height | + | 1 | Alice | 20 | 170 | + | 2 | Bob | 21 | 171 | + + Output: + [ + "1": Person(name: "Alice", age: "20", height: "170"), + "2": Person(name: "Bob", age: "21", height: "171") + ] + */ + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: T]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: T] in + var values = values + let titles = Array(values.removeFirst().dropFirst()) + return try values.reduce(into: [String: T]()) { (values, row) in + let value = Array(row.dropFirst()).enumerated().reduce(into: [String: String](), { (values, cell) in + let title = titles[cell.offset] + values[title] = cell.element + }) + let data = try JSONEncoder().encode(value) + let decoded = try JSONDecoder().decode(T.self, from: data) + values[row[0]] = decoded + } + } + } + +} diff --git a/Pod/Native/NativeFeature.swift b/Pod/Native/NativeFeature.swift index dae4de0..69f9696 100644 --- a/Pod/Native/NativeFeature.swift +++ b/Pod/Native/NativeFeature.swift @@ -95,11 +95,27 @@ extension NativeFeature { Language.current.keywords.When, Language.current.keywords.Then, Language.current.keywords.And: - state.steps.append(.init(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) + + if let dataTableLines = state.dataTableLines { + let lastStep = state.steps.removeLast() + state.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") + state.steps.append(.init(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) + state.dataTableLines = nil + } else { + state.steps.append(.init(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) + } + case Language.current.keywords.Examples: state.exampleLines = [] case Language.current.keywords.ExampleLine: - state.exampleLines.append((lineIndex+1, lineSuffix)) + + if state.exampleLines != nil { + state.exampleLines?.append( (lineIndex+1, line) ) + } else { + state.dataTableLines = state.dataTableLines ?? [] + state.dataTableLines?.append(line) + } + default: break } @@ -110,6 +126,11 @@ extension NativeFeature { // If we hit the end of the file, we need to make sure we have dealt with // the last scenarios + if let dataTableLines = state.dataTableLines { + let lastStep = state.steps.removeLast() + state.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") + state.dataTableLines = nil + } if let newScenarios = state.scenarios(at: scenarios.count) { let description = state.description.joined(separator: "\n") newScenarios.forEach { $0.scenarioDescription = description } diff --git a/Pod/Native/ParseState.swift b/Pod/Native/ParseState.swift index a44b1ce..8cc85ee 100644 --- a/Pod/Native/ParseState.swift +++ b/Pod/Native/ParseState.swift @@ -12,9 +12,9 @@ private let whitespace = CharacterSet.whitespaces class ParseState { var name: String? - var description: [String] = [] - var steps: [StepDescription] - var exampleLines: [(lineNumber: Int, line: String)] + var steps: [String] + var exampleLines: [(lineNumber: Int, line: String)]? + var dataTableLines: [String]? var parsingBackground: Bool convenience init() { @@ -24,41 +24,40 @@ class ParseState { required init(name: String?, parsingBackground: Bool = false) { self.name = name steps = [] - exampleLines = [] self.parsingBackground = parsingBackground } private var examples: [NativeExample] { - get { - if self.exampleLines.count < 2 { return [] } - - var examples: [NativeExample] = [] - - // The first line is the titles - let titles = self.exampleLines.first!.line.components(separatedBy: "|").map { $0.trimmingCharacters(in: whitespace) } + guard let exampleLines = exampleLines else { return [] } + if exampleLines.count < 2 { return [] } + + var examples: [NativeExample] = [] + + // The first line is the titles + let titles = exampleLines.first!.line + .components(separatedBy: "|") + .map { $0.trimmingCharacters(in: whitespace) } + .dropFirst().dropLast() + + // The other lines are the examples themselves + exampleLines.dropFirst().forEach { rawLine in + let line = rawLine.line + .components(separatedBy: "|") + .map { $0.trimmingCharacters(in: whitespace) } + .dropFirst().dropLast() - // The other lines are the examples themselves - self.exampleLines.dropFirst().forEach { rawLine in - let line = rawLine.line.components(separatedBy: "|").map { $0.trimmingCharacters(in: whitespace) } - - var pairs: [String: String] = Dictionary() - - (0.. n ? line[n] : "" - if title != "" && value != "" { - pairs[title] = value - } - } - - examples.append( (rawLine.lineNumber, pairs ) ) + var pairs: [String: String] = Dictionary() + + // Get the title and value for this column + titles.indices.forEach { + pairs[titles[$0]] = line[$0] } - - return examples + examples.append((rawLine.lineNumber, pairs)) } + + return examples } - + func background() -> NativeBackground? { guard parsingBackground, let name = self.name, self.steps.count > 0 else { return nil } @@ -73,6 +72,10 @@ class ParseState { // If we have no examples then we have one scenario. // Otherwise we need to make more than one scenario. if self.examples.isEmpty { + if let dataTableLines = self.dataTableLines { + let lastStep = self.steps.removeLast() + self.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") + } scenarios.append(NativeScenario(name, steps: self.steps, index: index)) } else { scenarios.append(NativeScenarioOutline(name, steps: self.steps, examples: self.examples, index: index)) @@ -80,8 +83,9 @@ class ParseState { self.name = nil self.steps = [] - self.exampleLines = [] - + self.exampleLines = nil + self.dataTableLines = nil + return scenarios } } From d62ec71a9f8ba296ffe1c43d41beeabc0eb225f6 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Tue, 4 Sep 2018 23:33:27 +0100 Subject: [PATCH 2/7] support custom type in native data tables --- .../Tests/Features/NativeDataTableTest.swift | 3 +- .../NativeFeatures/native_data_table.feature | 12 ++-- .../Tests/StepDefinitions/SanitySteps.swift | 8 +-- Pod/Core/MatchedStringRepresentable.swift | 6 +- Pod/Native/NativeDataTable.swift | 63 ++++++++++++------- 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/Example/Tests/Features/NativeDataTableTest.swift b/Example/Tests/Features/NativeDataTableTest.swift index 824adc6..095d9f0 100644 --- a/Example/Tests/Features/NativeDataTableTest.swift +++ b/Example/Tests/Features/NativeDataTableTest.swift @@ -14,7 +14,8 @@ final class NativeDataTableTest: NativeTestCase { struct Person: CodableMatchedStringRepresentable, Equatable { let name: String let age: String - let height: String + let height: Int + let fulltime: Bool } override class func path() -> URL? { diff --git a/Example/Tests/Features/NativeFeatures/native_data_table.feature b/Example/Tests/Features/NativeFeatures/native_data_table.feature index 2892354..455cee3 100644 --- a/Example/Tests/Features/NativeFeatures/native_data_table.feature +++ b/Example/Tests/Features/NativeFeatures/native_data_table.feature @@ -43,13 +43,13 @@ Feature: Data tables Scenario: data table with codable values Given I have the following persons: - | name | age | height | - | Alice | 20 | 170 | - | Bob | 21 | 171 | + | name | age | height | fulltime | + | Alice | "20" | 170 | true | + | Bob | "21" | 171 | false | Scenario: data table with hash map of codable values Given I have the following persons by id: - | | name | age | height | - | 1 | Alice | 20 | 170 | - | 2 | Bob | 21 | 171 | + | | name | age | height | fulltime | + | 1 | Alice | "20" | 170 | Y | + | 2 | Bob | '21' | 171 | N | diff --git a/Example/Tests/StepDefinitions/SanitySteps.swift b/Example/Tests/StepDefinitions/SanitySteps.swift index 586b93e..2151bc6 100644 --- a/Example/Tests/StepDefinitions/SanitySteps.swift +++ b/Example/Tests/StepDefinitions/SanitySteps.swift @@ -246,8 +246,8 @@ final class SanitySteps: StepDefiner { XCTAssertEqual( match.values, [ - NativeDataTableTest.Person(name: "Alice", age: "20", height: "170"), - NativeDataTableTest.Person(name: "Bob", age: "21", height: "171") + NativeDataTableTest.Person(name: "Alice", age: "20", height: 170, fulltime: true), + NativeDataTableTest.Person(name: "Bob", age: "21", height: 171, fulltime: false) ] ) } @@ -256,8 +256,8 @@ final class SanitySteps: StepDefiner { XCTAssertEqual( match.values, [ - "1": NativeDataTableTest.Person(name: "Alice", age: "20", height: "170"), - "2": NativeDataTableTest.Person(name: "Bob", age: "21", height: "171") + 1: NativeDataTableTest.Person(name: "Alice", age: "20", height: 170, fulltime: true), + 2: NativeDataTableTest.Person(name: "Bob", age: "21", height: 171, fulltime: false) ] ) } diff --git a/Pod/Core/MatchedStringRepresentable.swift b/Pod/Core/MatchedStringRepresentable.swift index fd242ea..320de42 100644 --- a/Pod/Core/MatchedStringRepresentable.swift +++ b/Pod/Core/MatchedStringRepresentable.swift @@ -25,7 +25,11 @@ extension Double: MatchedStringRepresentable { } extension Bool: MatchedStringRepresentable { public init?(fromMatch match: String) { - self.init(match.lowercased()) + switch match.lowercased() { + case "true", "yes", "y": self = true + case "false", "no", "n": self = false + default: return nil + } } } diff --git a/Pod/Native/NativeDataTable.swift b/Pod/Native/NativeDataTable.swift index 0d7f148..55e2191 100644 --- a/Pod/Native/NativeDataTable.swift +++ b/Pod/Native/NativeDataTable.swift @@ -9,7 +9,7 @@ import Foundation extension String: Error {} -public struct NativeDataTable { +public struct NativeDataTable { public let values: T public init?(fromMatch match: String, transform: ([[String]]) throws -> T) { @@ -40,7 +40,7 @@ public struct NativeDataTable { } extension StepDefiner { - func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable)->(), transform: @escaping ([[String]]) throws -> T) { + func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable)->(), transform: @escaping ([[String]]) throws -> T) { self.test.addStep(expression, file: file, line: line) { (matches: [String]) in guard let match = matches.first else { XCTFail("Expected single match not found in \"\(expression)\"") @@ -75,7 +75,7 @@ extension StepDefiner { throw "Table should contain single column" } return try values.map { - guard let value = T.init(fromMatch: $0[0]) else { + guard let value = T(fromMatch: $0[0]) else { throw "Failed to convert \($0[0]) to \(T.self)" } return value @@ -96,7 +96,7 @@ extension StepDefiner { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[T]] in return try values.map { row in try row.map { (cell) -> T in - guard let value = T.init(fromMatch: cell) else { + guard let value = T(fromMatch: cell) else { throw "Failed to convert \(cell) to \(T.self)" } return value @@ -126,7 +126,7 @@ extension StepDefiner { return try values.reduce(into: [[String: T]]()) { values, row in let value = try row.enumerated().reduce(into: [String: T]()) { (values, cell) in let title = titles[cell.offset] - guard let value = T.init(fromMatch: cell.element) else { + guard let value = T(fromMatch: cell.element) else { throw "Failed to convert \(cell.element) to \(T.self)" } values[title] = value @@ -158,7 +158,7 @@ extension StepDefiner { throw "Table should contain two columns" } return try values.reduce(into: [String: T]()) { (values, row) in - guard let value = T.init(fromMatch: row[1]) else { + guard let value = T(fromMatch: row[1]) else { throw "Failed to convert \(row[1]) to \(T.self)" } values[row[0]] = value @@ -185,7 +185,7 @@ extension StepDefiner { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: [T]] in return try values.reduce(into: [String: [T]]()) { (values, row) in values[row[0]] = try row.dropFirst().map { cell in - guard let value = T.init(fromMatch: cell) else { + guard let value = T(fromMatch: cell) else { throw "Failed to convert \(cell) to \(T.self)" } return value @@ -217,7 +217,7 @@ extension StepDefiner { return try values.reduce(into: [String: [String: T]]()) { (values, row) in values[row[0]] = try Array(row.dropFirst()).enumerated().reduce(into: [String: T](), { (values, cell) in let title = titles[cell.offset] - guard let value = T.init(fromMatch: cell.element) else { + guard let value = T(fromMatch: cell.element) else { throw "Failed to convert \(cell.element) to \(T.self)" } values[title] = value @@ -236,8 +236,8 @@ extension StepDefiner { Output: [ - Person(name: "Alice", age: "20", height: "170"), - Person(name: "Bob", age: "21", height: "171") + Person(name: "Alice", age: 20, height: 170), + Person(name: "Bob", age: 21, height: 171) ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { @@ -245,11 +245,11 @@ extension StepDefiner { var values = values let titles = values.removeFirst() return try values.reduce(into: [T]()) { values, row in - let value = row.enumerated().reduce(into: [String: String]()) { (values, cell) in + let value = row.enumerated().reduce(into: [String: Any]()) { (values, cell) in let title = titles[cell.offset] - values[title] = cell.element + values[title] = cell.element.cellValue } - let data = try JSONEncoder().encode(value) + let data = try JSONSerialization.data(withJSONObject: value, options: []) let decoded = try JSONDecoder().decode(T.self, from: data) values.append(decoded) } @@ -266,24 +266,43 @@ extension StepDefiner { Output: [ - "1": Person(name: "Alice", age: "20", height: "170"), - "2": Person(name: "Bob", age: "21", height: "171") + 1: Person(name: "Alice", age: 20, height: 170), + 2: Person(name: "Bob", age: 21, height: 171) ] */ - open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: T]>)->()) { - self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: T] in + open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[U: T]>)->()) { + self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [U: T] in var values = values let titles = Array(values.removeFirst().dropFirst()) - return try values.reduce(into: [String: T]()) { (values, row) in - let value = Array(row.dropFirst()).enumerated().reduce(into: [String: String](), { (values, cell) in + return try values.reduce(into: [U: T]()) { (values, row) in + guard let key = U(fromMatch: row[0]) else { + throw "Failed to convert \(row[0]) to \(U.self)" + } + let value = Array(row.dropFirst()).enumerated().reduce(into: [String: Any](), { (values, cell) in let title = titles[cell.offset] - values[title] = cell.element + values[title] = cell.element.cellValue }) - let data = try JSONEncoder().encode(value) + let data = try JSONSerialization.data(withJSONObject: value, options: []) let decoded = try JSONDecoder().decode(T.self, from: data) - values[row[0]] = decoded + values[key] = decoded } } } } + +private extension String { + var cellValue: Any { + if (hasPrefix("\"") && hasSuffix("\"")) || (hasPrefix("'") && hasSuffix("'")) { + return String(self.dropFirst().dropLast()) + } else if let float = Double(fromMatch: self) { + return float + } else if let bool = Bool(fromMatch: self) { + return bool + } else { + return self + } + } + +} + From 1b220efff9d5271ea5178d894afe96bee624009f Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Mon, 17 Dec 2018 13:16:07 +0000 Subject: [PATCH 3/7] solve build issues after merge, run `pod install` --- Example/Podfile.lock | 6 +- .../XCTest-Gherkin.podspec.json | 4 +- Example/Pods/Manifest.lock | 6 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 594 +++++++++--------- .../XCTest-Gherkin/Info.plist | 2 +- .../XCTest-Gherkin.xcodeproj/project.pbxproj | 4 + Pod/Native/NativeDataTable.swift | 4 +- Pod/Native/NativeFeature.swift | 22 +- Pod/Native/ParseState.swift | 12 +- 9 files changed, 339 insertions(+), 315 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index bf6c1ec..f6523c1 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,7 +1,7 @@ PODS: - SwiftLint (0.23.0) - - XCTest-Gherkin/Core (0.16.0) - - XCTest-Gherkin/Native (0.16.0): + - XCTest-Gherkin/Core (0.18.0) + - XCTest-Gherkin/Native (0.18.0): - XCTest-Gherkin/Core DEPENDENCIES: @@ -18,7 +18,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: SwiftLint: 6ddf7d305644c2239cb768a11d97cce804816691 - XCTest-Gherkin: c85a2efe41928da4cef5ddbcac55f5009d02dc30 + XCTest-Gherkin: 36f4c87978447d1e8cd3ee36d242b9b5f7f524fd PODFILE CHECKSUM: 040d56cac22fe93f01093a8f0021b445faf03233 diff --git a/Example/Pods/Local Podspecs/XCTest-Gherkin.podspec.json b/Example/Pods/Local Podspecs/XCTest-Gherkin.podspec.json index 21ffbc2..10aa6f7 100644 --- a/Example/Pods/Local Podspecs/XCTest-Gherkin.podspec.json +++ b/Example/Pods/Local Podspecs/XCTest-Gherkin.podspec.json @@ -1,6 +1,6 @@ { "name": "XCTest-Gherkin", - "version": "0.16.0", + "version": "0.18.0", "summary": "Gherkin style tests", "description": "Adds Gherkin syntax to XCTestCase", "homepage": "https://github.com/net-a-porter-mobile/XCTest-Gherkin", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/net-a-porter-mobile/XCTest-Gherkin.git", - "tag": "0.16.0" + "tag": "0.18.0" }, "platforms": { "ios": "8.0", diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index bf6c1ec..f6523c1 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,7 +1,7 @@ PODS: - SwiftLint (0.23.0) - - XCTest-Gherkin/Core (0.16.0) - - XCTest-Gherkin/Native (0.16.0): + - XCTest-Gherkin/Core (0.18.0) + - XCTest-Gherkin/Native (0.18.0): - XCTest-Gherkin/Core DEPENDENCIES: @@ -18,7 +18,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: SwiftLint: 6ddf7d305644c2239cb768a11d97cce804816691 - XCTest-Gherkin: c85a2efe41928da4cef5ddbcac55f5009d02dc30 + XCTest-Gherkin: 36f4c87978447d1e8cd3ee36d242b9b5f7f524fd PODFILE CHECKSUM: 040d56cac22fe93f01093a8f0021b445faf03233 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index e548859..cea0b81 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,43 +7,45 @@ objects = { /* Begin PBXBuildFile section */ - 070728E4F9E12A8F5AC74FE88791097F /* NativeTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7055194B025DA60CBB112BCF5C10417C /* NativeTestCase.swift */; }; + 08E39C8442AB7929656B3FE6315DE032 /* StringGherkinExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B6EA0EF1164DEA51D6AD0C897C2A2AD /* StringGherkinExtension.swift */; }; + 0EB30C60420681E3FF835956F01400A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */; }; 2010AEC04DF5AEFDD0A8EBBBC3913986 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5504248CED3C59378D70C22CA0C76766 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m */; }; - 2B6800DBE65B576490C7B846127AB837 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */; }; - 2BD95CBEB42EB9C44019C508C401441B /* XCTestCase+Gherkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = D91D68B970113F017BB0F0E3DE9DB352 /* XCTestCase+Gherkin.swift */; }; - 315BE998E195CCA11DCD2243FFCF1704 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98CCA7A2F93870772A0A576A62AA7D63 /* Language.swift */; }; - 41466543B32E675B8AC9554D79F1F846 /* XCTest_Gherkin.h in Headers */ = {isa = PBXBuildFile; fileRef = 89B2CAFF6F550CF6A250CFF7A99877B5 /* XCTest_Gherkin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4566FA0FD3D08F08495083231B6F2D72 /* NativeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D5B52889A65F13B811F9DAEC29A50F7 /* NativeExample.swift */; }; - 4E1068B10B78ABD30745F080B72CC1C1 /* NativeFeatureParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E74788C21A5DC400A30EB1F2D7CE4A6 /* NativeFeatureParser.swift */; }; - 5C7A4B99A39E75EA1C6C5B742E62EE07 /* MatchedStringRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25E0CCD5E772D03AE8BFB171B64CCE /* MatchedStringRepresentable.swift */; }; - 6322352721614A9400D63127 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6322352621614A9400D63127 /* Background.swift */; }; - 692AAEAD63479E716E948301BA66E45B /* UnusedStepsTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D777736D2B2AFEB5A473031253DA7D7 /* UnusedStepsTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6D8B9DA0027052FCD7EAD00BC2A7F14A /* LevenshteinDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF68A40A4DEDC09C721E57869BA6D0EC /* LevenshteinDistance.swift */; }; - 71EDAC12BDC51DE69BDBA359EACA42D6 /* StringGherkinExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D5FA114A5DB063EDE2A802AB80A18FA /* StringGherkinExtension.swift */; }; - 7542FA1F4B876974D18C9906A51DAD74 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */; }; - 7675D7C0411E1DE29AD43F7E45F16E84 /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BA86C9EF53A0FC4FCC910058EDC456B /* Step.swift */; }; - 76BB5C142660AE495A779F91645E103B /* PageObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EDC5D0A7C4BE0CCC3815035792C0EAA /* PageObject.swift */; }; - 772F3BBA7D7CE90BE1A92139D913E9DA /* StepDefiner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9374342A7A7FD955329B4A91E67A23EF /* StepDefiner.swift */; }; - 81AC15E326092A760A96EC74DC29B21F /* ClassHelperMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5BAA90BB2ED28754B443DF64FE4D1A5 /* ClassHelperMethods.swift */; }; - 822615EA5D270209F3B6C66F1983B475 /* NativeRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C50F526CA21C28D7229D6A39BBBADA /* NativeRunner.swift */; }; - 86467290EE20CC6FE2AAF628CA268C01 /* ParseState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4E41A26324B68406DDEEE942CD004A1 /* ParseState.swift */; }; + 21CFF364CFABB6DAA41B94E7AE27C92E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FE887C3930818A0B7A8E28E7D81F69C /* XCTest.framework */; }; + 2C9C47B6FEFFB9F65BBFEA3C85051A28 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */; }; + 3018D7ADC5D9921777EF3ADD6117326F /* ClassHelperMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DAF580FCCD433D39D437C55CE55B290 /* ClassHelperMethods.swift */; }; + 332BDC714C96E192AF7721CBEC800E5B /* NativeDataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B404894231AFCD02776800C186F75F53 /* NativeDataTable.swift */; }; + 3856EAE35BD4B79F1443EEB5996DBA79 /* NativeRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0FF824E967B00ABE5A9D28F6B82F4C6 /* NativeRunner.swift */; }; + 41466543B32E675B8AC9554D79F1F846 /* XCTest_Gherkin.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A5EFCF504B789E4F73B5796494C8B0E /* XCTest_Gherkin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50548D01E082226576518A8BBCAE8CA9 /* NativeTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACA268A6BFEA4C311745BCBFA4639A1 /* NativeTestCase.swift */; }; + 530AB4D57F5ABFA426B4307F0E0B097E /* UnusedStepsTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 23A38BB8833E36E6CC61C360B591DF09 /* UnusedStepsTracker.m */; }; + 5686FD332AC73FAF9D0A9BD5E7A4EDE8 /* StepDefiner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F0C552D25F344527956029B911CF87B /* StepDefiner.swift */; }; + 5DC8C8A15700EC78858E4E79F15845FD /* NativeFeatureParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6D41B63188732681BDDB5CEC2CF4A6 /* NativeFeatureParser.swift */; }; + 669E25645F209826D5B5F6499D26B7E0 /* DataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46661FD3AD8513702F7370D655484CA1 /* DataTable.swift */; }; + 692AAEAD63479E716E948301BA66E45B /* UnusedStepsTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 700334085F70DA9C408C9E69EEC4033F /* UnusedStepsTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69F734B9956450980302307BA4A6D3BE /* XCTestCase+Gherkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76FD34358FAC5E09E498252F2B215DA /* XCTestCase+Gherkin.swift */; }; + 88595F2955F45CB59AA1936599C274CF /* NativeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C43D2FBB061B6E122D2AFC5875B8760 /* NativeExample.swift */; }; + 88FF81A30571FFFB6D06D5B579D7AB25 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5CD853E6113988C4C0105BA4D670AE /* Example.swift */; }; 8CD6693AE66D257DAB439AC87F0F049C /* Pods-XCTest-Gherkin_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3BAAF7443E70C13CEE52DCED45CC20 /* Pods-XCTest-Gherkin_Example-dummy.m */; }; - 8CF6BFBA95D7454D0E5938A81C36EDD0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */; }; - BB5D2E87379A60E78548CCB9E13A011F /* NativeFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54676D21A5668A9A5E405E4743D2AC2A /* NativeFeature.swift */; }; - BFBFEA516DE2F3FA5821D3CFE6880CB2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */; }; - C3E75284F9810B7CC5F4A9DAD4914852 /* XCTest-Gherkin-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 656684E1258F48495112CEA3E3DBE23F /* XCTest-Gherkin-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C6C446A38C1675DE80D8DCEC7F7BC7A2 /* gherkin-languages.json in Resources */ = {isa = PBXBuildFile; fileRef = 4256C5F5CF63299C2C2EDEF989FB3ACF /* gherkin-languages.json */; }; - C6E13AB8B282AA4390A68322CA2A04D6 /* XCGNativeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 16841AD7DBBC6DA9F0FBA9CCCBEB285C /* XCGNativeInitializer.m */; }; - C783BC66C521AFE4353835D3580EC415 /* XCGNativeInitializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4731F57AED051BC96259DCDB76B08309 /* XCGNativeInitializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9A496D9BE2D83949C2C45022EA0C142 /* NativeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B18573781F626D02400E72594C148D6 /* NativeScenario.swift */; }; + 9309042A395675BD3D120F2977087A25 /* PageObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E8C34E164E26986506CA6CD6FF027C /* PageObject.swift */; }; + 952B40D52E06B44621A3DDC4EBC91829 /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9C5DE0F2F3B944B8A4229F1F5B535C4 /* Step.swift */; }; + 995D7794A4CE7EDCC9F9E02E37235918 /* MatchedStringRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C597B3EEE234BBC27E48F0A01F2753E /* MatchedStringRepresentable.swift */; }; + B777661D9ED1ED3364F6296C15F26151 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = B92FA7E45DCDC36ECAA5783D09FC6CF4 /* Background.swift */; }; + BC6705988E727DDF6DB21E3F44CEF9C6 /* NativeFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A7615E156C61521110889A5844D5C4 /* NativeFeature.swift */; }; + BCB0EB59F7083B5C30A51601FC16F5F0 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC48E8B6D945DB1A846F0798B48D6721 /* Language.swift */; }; + C3E75284F9810B7CC5F4A9DAD4914852 /* XCTest-Gherkin-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 563B83C647D40FF3C9CC0E25B1F79274 /* XCTest-Gherkin-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C6C446A38C1675DE80D8DCEC7F7BC7A2 /* gherkin-languages.json in Resources */ = {isa = PBXBuildFile; fileRef = 222A3AE26D2BEAC91C93F4AA78CCEE2B /* gherkin-languages.json */; }; + C783BC66C521AFE4353835D3580EC415 /* XCGNativeInitializer.h in Headers */ = {isa = PBXBuildFile; fileRef = E8DDE332465406FE22D43B49A8395CFA /* XCGNativeInitializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0EE5A4D90C644F775F3D5E51405E1FF /* ParseState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A419A8868AD429A72E2C4FF2B70E0E39 /* ParseState.swift */; }; D2D0D02993491ED21C351739EF624EA7 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D131BF4F406FF00CF56FC86E1A54D43 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m */; }; - D3000A2994F07B0AEB602CF8CB26A169 /* UnusedStepsTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 0102799758155203DC659643A5FB69CE /* UnusedStepsTracker.m */; }; + D44C72EACB92EA1234389DFC0C6B16EE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */; }; + E042D7872C7DA9A991979F2E3CBEAD9D /* XCGNativeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCB3071A255AB963089833C7F817E645 /* XCGNativeInitializer.m */; }; E0D9BC84A5FB1C0694E9E69E123227B2 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 622F8FD1EA4AE7DF9F918C398505DCFB /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; E38DED3CFD2935ED0C5FEBD734459676 /* Pods-XCTest-Gherkin_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6232423939AE10C2D585626D06C2E73F /* Pods-XCTest-Gherkin_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E98F376581E114B01B22D13ABBE93087 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFB5E6052F1177B003857CA403D2E30 /* Example.swift */; }; + E64FB56A327A2FC7D8BCB8EF7ECE16D6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */; }; E9EB7C601CE536E91BDE46056A545BDD /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F6240B366BBDD38ACD9F7015FB6F59F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F715A81D4C8957162CBEBFE47D475333 /* XCTest-Gherkin-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AA4C73FA1DBCD45272BCB28893591EF /* XCTest-Gherkin-dummy.m */; }; - F99C5ABF6590DF8536022AB462E1B30C /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80C82283F763D9ABC7DD3BB91787CA8D /* XCTest.framework */; }; + EF78CC2E5AC25E9F6F07735396BE90C6 /* NativeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = E668916CE5004B5059240D565C996319 /* NativeScenario.swift */; }; + F9DEC98C482439AC9157A978814765BB /* XCTest-Gherkin-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 40EF4EBEADDFA8A98DB6E90B397FC030 /* XCTest-Gherkin-dummy.m */; }; + FBA9AFEA4827BD2A015A10998DD14AB4 /* LevenshteinDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E85711D1B133E55D974A6802806E55E /* LevenshteinDistance.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -71,76 +73,78 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 009C015931E34FEEEFFB616BD02E58E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0102799758155203DC659643A5FB69CE /* UnusedStepsTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UnusedStepsTracker.m; path = Pod/Core/UnusedStepsTracker.m; sourceTree = ""; }; 02DED36F4F2128F299FC1210E93E55C5 /* Pods-XCTest-Gherkin_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example.release.xcconfig"; sourceTree = ""; }; 089764E5C9920FF1472FF5CDA8EF2833 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-frameworks.sh"; sourceTree = ""; }; 0A6DB05208FB19CD3399B2F5F7E07937 /* Pods_XCTest_Gherkin_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example.framework; path = "Pods-XCTest-Gherkin_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 0C7E221CE3B57EF7145BF7F82BBC9555 /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 0CF2D5010B98634391D430BD81939A76 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-resources.sh"; sourceTree = ""; }; + 0F0C552D25F344527956029B911CF87B /* StepDefiner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepDefiner.swift; path = Pod/Core/StepDefiner.swift; sourceTree = ""; }; 125A874CE1018421996F5D81E661C2F0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 14C50F526CA21C28D7229D6A39BBBADA /* NativeRunner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeRunner.swift; path = Pod/Native/NativeRunner.swift; sourceTree = ""; }; - 16784442ECA3247DB3E211E613BBD44C /* XCTest-Gherkin-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-prefix.pch"; sourceTree = ""; }; - 16841AD7DBBC6DA9F0FBA9CCCBEB285C /* XCGNativeInitializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XCGNativeInitializer.m; path = Pod/Native/XCGNativeInitializer.m; sourceTree = ""; }; - 1E6AEBD40066292D0D8634156FC60623 /* XCTest-Gherkin.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "XCTest-Gherkin.xcconfig"; sourceTree = ""; }; + 1E85711D1B133E55D974A6802806E55E /* LevenshteinDistance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LevenshteinDistance.swift; path = Pod/Core/LevenshteinDistance.swift; sourceTree = ""; }; 1F0A2A0548ADB5A044519216603FA84F /* Pods-XCTest-Gherkin_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-acknowledgements.plist"; sourceTree = ""; }; 1F3BAAF7443E70C13CEE52DCED45CC20 /* Pods-XCTest-Gherkin_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-dummy.m"; sourceTree = ""; }; 2119CFF49E7053D7F3AB50A497101F1D /* Pods-XCTest-Gherkin_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-frameworks.sh"; sourceTree = ""; }; + 222A3AE26D2BEAC91C93F4AA78CCEE2B /* gherkin-languages.json */ = {isa = PBXFileReference; includeInIndex = 1; name = "gherkin-languages.json"; path = "Pod/Native/gherkin-languages.json"; sourceTree = ""; }; + 23A38BB8833E36E6CC61C360B591DF09 /* UnusedStepsTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UnusedStepsTracker.m; path = Pod/Core/UnusedStepsTracker.m; sourceTree = ""; }; 2600AAA46B30972EFE846CC8A750ACC3 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.plist"; sourceTree = ""; }; - 29A94183ACD5E130F71635752BA5918F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - 2B18573781F626D02400E72594C148D6 /* NativeScenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeScenario.swift; path = Pod/Native/NativeScenario.swift; sourceTree = ""; }; + 2757A812581F09D802A5E8C4B24A7BAF /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2F6240B366BBDD38ACD9F7015FB6F59F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h"; sourceTree = ""; }; + 2FE887C3930818A0B7A8E28E7D81F69C /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 30A7615E156C61521110889A5844D5C4 /* NativeFeature.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeature.swift; path = Pod/Native/NativeFeature.swift; sourceTree = ""; }; 34288C6294AE41198DA3C43BB1AD8DFB /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.release.xcconfig"; sourceTree = ""; }; - 3AA4C73FA1DBCD45272BCB28893591EF /* XCTest-Gherkin-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTest-Gherkin-dummy.m"; sourceTree = ""; }; + 3B46A48708A7BE25F2A223349E947D3A /* XCTest-Gherkin.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = "XCTest-Gherkin.podspec"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 3D131BF4F406FF00CF56FC86E1A54D43 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m"; sourceTree = ""; }; 3DBDDB66A5B624EEFF4FEE53053BE074 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example.debug.xcconfig"; sourceTree = ""; }; - 3E74788C21A5DC400A30EB1F2D7CE4A6 /* NativeFeatureParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeatureParser.swift; path = Pod/Native/NativeFeatureParser.swift; sourceTree = ""; }; - 4256C5F5CF63299C2C2EDEF989FB3ACF /* gherkin-languages.json */ = {isa = PBXFileReference; includeInIndex = 1; name = "gherkin-languages.json"; path = "Pod/Native/gherkin-languages.json"; sourceTree = ""; }; + 40EF4EBEADDFA8A98DB6E90B397FC030 /* XCTest-Gherkin-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTest-Gherkin-dummy.m"; sourceTree = ""; }; 42897CCA4CE29EEDE8CFCAD0DE723FB8 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig"; sourceTree = ""; }; - 44454F024DF153F85FAB802C596A4CE1 /* XCTest-Gherkin.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "XCTest-Gherkin.modulemap"; sourceTree = ""; }; - 4731F57AED051BC96259DCDB76B08309 /* XCGNativeInitializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCGNativeInitializer.h; path = Pod/Native/XCGNativeInitializer.h; sourceTree = ""; }; - 4D5FA114A5DB063EDE2A802AB80A18FA /* StringGherkinExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringGherkinExtension.swift; path = Pod/Core/StringGherkinExtension.swift; sourceTree = ""; }; - 4DD651DCF1A92A1AB904A130D1354D5B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; - 4EDC5D0A7C4BE0CCC3815035792C0EAA /* PageObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageObject.swift; path = Pod/Core/PageObject.swift; sourceTree = ""; }; - 54676D21A5668A9A5E405E4743D2AC2A /* NativeFeature.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeature.swift; path = Pod/Native/NativeFeature.swift; sourceTree = ""; }; + 46661FD3AD8513702F7370D655484CA1 /* DataTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTable.swift; path = Pod/Core/DataTable.swift; sourceTree = ""; }; 5504248CED3C59378D70C22CA0C76766 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m"; sourceTree = ""; }; + 563B83C647D40FF3C9CC0E25B1F79274 /* XCTest-Gherkin-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-umbrella.h"; sourceTree = ""; }; 58B7E59C2C681D81559D737D1770B2B2 /* Pods-XCTest-Gherkin_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-resources.sh"; sourceTree = ""; }; 5A4F1E747F3D34241E67BD66BF0E2867 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap"; sourceTree = ""; }; 5A84E8A5366675565111C35754A0E5AE /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.markdown"; sourceTree = ""; }; 5AE1BD3783C6AA2606C8A425B9506121 /* XCTest_Gherkin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XCTest_Gherkin.framework; path = "XCTest-Gherkin.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5C597B3EEE234BBC27E48F0A01F2753E /* MatchedStringRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchedStringRepresentable.swift; path = Pod/Core/MatchedStringRepresentable.swift; sourceTree = ""; }; 622F8FD1EA4AE7DF9F918C398505DCFB /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h"; sourceTree = ""; }; 6232423939AE10C2D585626D06C2E73F /* Pods-XCTest-Gherkin_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-umbrella.h"; sourceTree = ""; }; - 6322352621614A9400D63127 /* Background.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Background.swift; path = Pod/Core/Background.swift; sourceTree = ""; }; - 656684E1258F48495112CEA3E3DBE23F /* XCTest-Gherkin-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-umbrella.h"; sourceTree = ""; }; + 67B5B9BD3F077426AF1DF53C752A6D6E /* XCTest-Gherkin.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "XCTest-Gherkin.xcconfig"; sourceTree = ""; }; 69CE1899B308AF4FC5FB355FEA99BDED /* Pods-XCTest-Gherkin_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XCTest-Gherkin_Example-acknowledgements.markdown"; sourceTree = ""; }; - 6BA86C9EF53A0FC4FCC910058EDC456B /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Step.swift; path = Pod/Core/Step.swift; sourceTree = ""; }; - 6D777736D2B2AFEB5A473031253DA7D7 /* UnusedStepsTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UnusedStepsTracker.h; path = Pod/Core/UnusedStepsTracker.h; sourceTree = ""; }; - 7055194B025DA60CBB112BCF5C10417C /* NativeTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeTestCase.swift; path = Pod/Native/NativeTestCase.swift; sourceTree = ""; }; + 6B6EA0EF1164DEA51D6AD0C897C2A2AD /* StringGherkinExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringGherkinExtension.swift; path = Pod/Core/StringGherkinExtension.swift; sourceTree = ""; }; + 6DAF580FCCD433D39D437C55CE55B290 /* ClassHelperMethods.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClassHelperMethods.swift; path = Pod/Core/ClassHelperMethods.swift; sourceTree = ""; }; + 700334085F70DA9C408C9E69EEC4033F /* UnusedStepsTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UnusedStepsTracker.h; path = Pod/Core/UnusedStepsTracker.h; sourceTree = ""; }; 705CFB75E8BA7139E5305FB28D85106C /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 709FB33234408A54B32C404431E31658 /* Pods-XCTest-Gherkin_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example.modulemap"; sourceTree = ""; }; - 70DF796A27F9B8F02FB6B2BEE949E635 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 76DDBAF78070AC992759C406CD01FD52 /* XCTest-Gherkin.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = "XCTest-Gherkin.podspec"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 7D5B52889A65F13B811F9DAEC29A50F7 /* NativeExample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeExample.swift; path = Pod/Native/NativeExample.swift; sourceTree = ""; }; - 80C82283F763D9ABC7DD3BB91787CA8D /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 89B2CAFF6F550CF6A250CFF7A99877B5 /* XCTest_Gherkin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCTest_Gherkin.h; path = Pod/Native/XCTest_Gherkin.h; sourceTree = ""; }; + 8A5EFCF504B789E4F73B5796494C8B0E /* XCTest_Gherkin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCTest_Gherkin.h; path = Pod/Native/XCTest_Gherkin.h; sourceTree = ""; }; + 8C43D2FBB061B6E122D2AFC5875B8760 /* NativeExample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeExample.swift; path = Pod/Native/NativeExample.swift; sourceTree = ""; }; 8DC3CA25E53614A56139D35CB7B08F73 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.plist"; sourceTree = ""; }; - 9374342A7A7FD955329B4A91E67A23EF /* StepDefiner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepDefiner.swift; path = Pod/Core/StepDefiner.swift; sourceTree = ""; }; 937F8C79D82C3D4478315339D80189C7 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-frameworks.sh"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 98CCA7A2F93870772A0A576A62AA7D63 /* Language.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Language.swift; path = Pod/Native/Language.swift; sourceTree = ""; }; + 9ACA268A6BFEA4C311745BCBFA4639A1 /* NativeTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeTestCase.swift; path = Pod/Native/NativeTestCase.swift; sourceTree = ""; }; + 9BAEE01A520701A253A339354EC13C0F /* XCTest-Gherkin-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-prefix.pch"; sourceTree = ""; }; + A1E8C34E164E26986506CA6CD6FF027C /* PageObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageObject.swift; path = Pod/Core/PageObject.swift; sourceTree = ""; }; + A419A8868AD429A72E2C4FF2B70E0E39 /* ParseState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParseState.swift; path = Pod/Native/ParseState.swift; sourceTree = ""; }; A65F660E68E914DA69E3F2E7917771B7 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig"; sourceTree = ""; }; - BBFB5E6052F1177B003857CA403D2E30 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Pod/Core/Example.swift; sourceTree = ""; }; - BD25E0CCD5E772D03AE8BFB171B64CCE /* MatchedStringRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchedStringRepresentable.swift; path = Pod/Core/MatchedStringRepresentable.swift; sourceTree = ""; }; + B404894231AFCD02776800C186F75F53 /* NativeDataTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeDataTable.swift; path = Pod/Native/NativeDataTable.swift; sourceTree = ""; }; + B92FA7E45DCDC36ECAA5783D09FC6CF4 /* Background.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Background.swift; path = Pod/Core/Background.swift; sourceTree = ""; }; + BCB3071A255AB963089833C7F817E645 /* XCGNativeInitializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XCGNativeInitializer.m; path = Pod/Native/XCGNativeInitializer.m; sourceTree = ""; }; + C3BC97B9BFE65B23CDC2DF5A163FDD4B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; C6B18CBA5206666F6C6E823548F72E2B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D4E41A26324B68406DDEEE942CD004A1 /* ParseState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParseState.swift; path = Pod/Native/ParseState.swift; sourceTree = ""; }; + CC48E8B6D945DB1A846F0798B48D6721 /* Language.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Language.swift; path = Pod/Native/Language.swift; sourceTree = ""; }; D8CE3E12DBD605C0D9051155B396395E /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.markdown"; sourceTree = ""; }; - D91D68B970113F017BB0F0E3DE9DB352 /* XCTestCase+Gherkin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "XCTestCase+Gherkin.swift"; path = "Pod/Core/XCTestCase+Gherkin.swift"; sourceTree = ""; }; - DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - DF68A40A4DEDC09C721E57869BA6D0EC /* LevenshteinDistance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LevenshteinDistance.swift; path = Pod/Core/LevenshteinDistance.swift; sourceTree = ""; }; - E5BAA90BB2ED28754B443DF64FE4D1A5 /* ClassHelperMethods.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClassHelperMethods.swift; path = Pod/Core/ClassHelperMethods.swift; sourceTree = ""; }; + DB5CD853E6113988C4C0105BA4D670AE /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Pod/Core/Example.swift; sourceTree = ""; }; + DDA18B1CFC36290167312E5514D8F378 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + E668916CE5004B5059240D565C996319 /* NativeScenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeScenario.swift; path = Pod/Native/NativeScenario.swift; sourceTree = ""; }; E67BEA7B0EC50823F28C05CC38B71F83 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; sourceTree = ""; }; + E8DDE332465406FE22D43B49A8395CFA /* XCGNativeInitializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCGNativeInitializer.h; path = Pod/Native/XCGNativeInitializer.h; sourceTree = ""; }; + E9C5DE0F2F3B944B8A4229F1F5B535C4 /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Step.swift; path = Pod/Core/Step.swift; sourceTree = ""; }; + EA6D41B63188732681BDDB5CEC2CF4A6 /* NativeFeatureParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeatureParser.swift; path = Pod/Native/NativeFeatureParser.swift; sourceTree = ""; }; EEC081B6FD75A859731B5655F980AD0B /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig"; sourceTree = ""; }; + F0FF824E967B00ABE5A9D28F6B82F4C6 /* NativeRunner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeRunner.swift; path = Pod/Native/NativeRunner.swift; sourceTree = ""; }; + F76FD34358FAC5E09E498252F2B215DA /* XCTestCase+Gherkin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "XCTestCase+Gherkin.swift"; path = "Pod/Core/XCTestCase+Gherkin.swift"; sourceTree = ""; }; F8E06E3F5F472AC5F65AAFAD51D243A9 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-resources.sh"; sourceTree = ""; }; + FAFFA7B701DDFCB89B309D4F382CFD64 /* XCTest-Gherkin.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "XCTest-Gherkin.modulemap"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -148,7 +152,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BFBFEA516DE2F3FA5821D3CFE6880CB2 /* Foundation.framework in Frameworks */, + D44C72EACB92EA1234389DFC0C6B16EE /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -156,8 +160,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2B6800DBE65B576490C7B846127AB837 /* Foundation.framework in Frameworks */, - F99C5ABF6590DF8536022AB462E1B30C /* XCTest.framework in Frameworks */, + 0EB30C60420681E3FF835956F01400A7 /* Foundation.framework in Frameworks */, + 21CFF364CFABB6DAA41B94E7AE27C92E /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -165,7 +169,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7542FA1F4B876974D18C9906A51DAD74 /* Foundation.framework in Frameworks */, + E64FB56A327A2FC7D8BCB8EF7ECE16D6 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -173,13 +177,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8CF6BFBA95D7454D0E5938A81C36EDD0 /* Foundation.framework in Frameworks */, + 2C9C47B6FEFFB9F65BBFEA3C85051A28 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 06C3E32EC7F643EBD6E2322EFE078820 /* Pod */ = { + isa = PBXGroup; + children = ( + C3BC97B9BFE65B23CDC2DF5A163FDD4B /* LICENSE */, + DDA18B1CFC36290167312E5514D8F378 /* README.md */, + 3B46A48708A7BE25F2A223349E947D3A /* XCTest-Gherkin.podspec */, + ); + name = Pod; + sourceTree = ""; + }; 09E7D359A77ABD5F14B6C60EB052AB77 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests */ = { isa = PBXGroup; children = ( @@ -216,13 +230,24 @@ path = "Target Support Files/Pods-XCTest-Gherkin_Example"; sourceTree = ""; }; - 1E85F0F44277212282918D8D5DDB3588 /* iOS */ = { + 3294198A47588E813D4B89A7F2D6C7C6 /* Native */ = { isa = PBXGroup; children = ( - DDD0F5DAA0AC84C5E3ADE087C20B50BA /* Foundation.framework */, - 80C82283F763D9ABC7DD3BB91787CA8D /* XCTest.framework */, + CC48E8B6D945DB1A846F0798B48D6721 /* Language.swift */, + B404894231AFCD02776800C186F75F53 /* NativeDataTable.swift */, + 8C43D2FBB061B6E122D2AFC5875B8760 /* NativeExample.swift */, + 30A7615E156C61521110889A5844D5C4 /* NativeFeature.swift */, + EA6D41B63188732681BDDB5CEC2CF4A6 /* NativeFeatureParser.swift */, + F0FF824E967B00ABE5A9D28F6B82F4C6 /* NativeRunner.swift */, + E668916CE5004B5059240D565C996319 /* NativeScenario.swift */, + 9ACA268A6BFEA4C311745BCBFA4639A1 /* NativeTestCase.swift */, + A419A8868AD429A72E2C4FF2B70E0E39 /* ParseState.swift */, + E8DDE332465406FE22D43B49A8395CFA /* XCGNativeInitializer.h */, + BCB3071A255AB963089833C7F817E645 /* XCGNativeInitializer.m */, + 8A5EFCF504B789E4F73B5796494C8B0E /* XCTest_Gherkin.h */, + 4D5E648811A2CE532C3AB92929DCC05C /* Resources */, ); - name = iOS; + name = Native; sourceTree = ""; }; 32A23E08346748F1793F899C5FF672C1 /* SwiftLint */ = { @@ -233,22 +258,56 @@ path = SwiftLint; sourceTree = ""; }; + 4195F33867DE5028B6A9BC8A852A9C03 /* Core */ = { + isa = PBXGroup; + children = ( + B92FA7E45DCDC36ECAA5783D09FC6CF4 /* Background.swift */, + 6DAF580FCCD433D39D437C55CE55B290 /* ClassHelperMethods.swift */, + 46661FD3AD8513702F7370D655484CA1 /* DataTable.swift */, + DB5CD853E6113988C4C0105BA4D670AE /* Example.swift */, + 1E85711D1B133E55D974A6802806E55E /* LevenshteinDistance.swift */, + 5C597B3EEE234BBC27E48F0A01F2753E /* MatchedStringRepresentable.swift */, + A1E8C34E164E26986506CA6CD6FF027C /* PageObject.swift */, + E9C5DE0F2F3B944B8A4229F1F5B535C4 /* Step.swift */, + 0F0C552D25F344527956029B911CF87B /* StepDefiner.swift */, + 6B6EA0EF1164DEA51D6AD0C897C2A2AD /* StringGherkinExtension.swift */, + 700334085F70DA9C408C9E69EEC4033F /* UnusedStepsTracker.h */, + 23A38BB8833E36E6CC61C360B591DF09 /* UnusedStepsTracker.m */, + F76FD34358FAC5E09E498252F2B215DA /* XCTestCase+Gherkin.swift */, + ); + name = Core; + sourceTree = ""; + }; 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { isa = PBXGroup; children = ( - 1E85F0F44277212282918D8D5DDB3588 /* iOS */, + DA95CB2A265418BD1B13AF21F6D87DE4 /* iOS */, ); name = Frameworks; sourceTree = ""; }; - 710BC3F34CA2AA0A9DC749119A737C6C /* Resources */ = { + 4D5E648811A2CE532C3AB92929DCC05C /* Resources */ = { isa = PBXGroup; children = ( - 4256C5F5CF63299C2C2EDEF989FB3ACF /* gherkin-languages.json */, + 222A3AE26D2BEAC91C93F4AA78CCEE2B /* gherkin-languages.json */, ); name = Resources; sourceTree = ""; }; + 71B7F385812029D668F7DCC66673B0D7 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2757A812581F09D802A5E8C4B24A7BAF /* Info.plist */, + FAFFA7B701DDFCB89B309D4F382CFD64 /* XCTest-Gherkin.modulemap */, + 67B5B9BD3F077426AF1DF53C752A6D6E /* XCTest-Gherkin.xcconfig */, + 40EF4EBEADDFA8A98DB6E90B397FC030 /* XCTest-Gherkin-dummy.m */, + 9BAEE01A520701A253A339354EC13C0F /* XCTest-Gherkin-prefix.pch */, + 563B83C647D40FF3C9CC0E25B1F79274 /* XCTest-Gherkin-umbrella.h */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/XCTest-Gherkin"; + sourceTree = ""; + }; 79C4D753EEBBF24188A239CD3C3ADF93 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests */ = { isa = PBXGroup; children = ( @@ -290,37 +349,16 @@ ); sourceTree = ""; }; - 92AC966A641BDF25A30524DC98F4BD80 /* Support Files */ = { - isa = PBXGroup; - children = ( - 70DF796A27F9B8F02FB6B2BEE949E635 /* Info.plist */, - 44454F024DF153F85FAB802C596A4CE1 /* XCTest-Gherkin.modulemap */, - 1E6AEBD40066292D0D8634156FC60623 /* XCTest-Gherkin.xcconfig */, - 3AA4C73FA1DBCD45272BCB28893591EF /* XCTest-Gherkin-dummy.m */, - 16784442ECA3247DB3E211E613BBD44C /* XCTest-Gherkin-prefix.pch */, - 656684E1258F48495112CEA3E3DBE23F /* XCTest-Gherkin-umbrella.h */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/XCTest-Gherkin"; - sourceTree = ""; - }; - 95A041253C60D5E5892A970E87A1271A /* Native */ = { + 7F459B976398C0FC850E02A80E3AC82C /* XCTest-Gherkin */ = { isa = PBXGroup; children = ( - 98CCA7A2F93870772A0A576A62AA7D63 /* Language.swift */, - 7D5B52889A65F13B811F9DAEC29A50F7 /* NativeExample.swift */, - 54676D21A5668A9A5E405E4743D2AC2A /* NativeFeature.swift */, - 3E74788C21A5DC400A30EB1F2D7CE4A6 /* NativeFeatureParser.swift */, - 14C50F526CA21C28D7229D6A39BBBADA /* NativeRunner.swift */, - 2B18573781F626D02400E72594C148D6 /* NativeScenario.swift */, - 7055194B025DA60CBB112BCF5C10417C /* NativeTestCase.swift */, - D4E41A26324B68406DDEEE942CD004A1 /* ParseState.swift */, - 4731F57AED051BC96259DCDB76B08309 /* XCGNativeInitializer.h */, - 16841AD7DBBC6DA9F0FBA9CCCBEB285C /* XCGNativeInitializer.m */, - 89B2CAFF6F550CF6A250CFF7A99877B5 /* XCTest_Gherkin.h */, - 710BC3F34CA2AA0A9DC749119A737C6C /* Resources */, + 4195F33867DE5028B6A9BC8A852A9C03 /* Core */, + 3294198A47588E813D4B89A7F2D6C7C6 /* Native */, + 06C3E32EC7F643EBD6E2322EFE078820 /* Pod */, + 71B7F385812029D668F7DCC66673B0D7 /* Support Files */, ); - name = Native; + name = "XCTest-Gherkin"; + path = ../..; sourceTree = ""; }; 9758CC519AE2C57A9659FFC01AAD26F9 /* Pods */ = { @@ -331,16 +369,6 @@ name = Pods; sourceTree = ""; }; - BC2E48FFF5554563E30AAD6F81EDE7D5 /* Pod */ = { - isa = PBXGroup; - children = ( - 4DD651DCF1A92A1AB904A130D1354D5B /* LICENSE */, - 29A94183ACD5E130F71635752BA5918F /* README.md */, - 76DDBAF78070AC992759C406CD01FD52 /* XCTest-Gherkin.podspec */, - ); - name = Pod; - sourceTree = ""; - }; D05B9E066A1BA62CD8D81865B1220309 /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -351,41 +379,19 @@ name = "Targets Support Files"; sourceTree = ""; }; - DC6F9E087A29D2642655860B43E613D2 /* Core */ = { - isa = PBXGroup; - children = ( - E5BAA90BB2ED28754B443DF64FE4D1A5 /* ClassHelperMethods.swift */, - BBFB5E6052F1177B003857CA403D2E30 /* Example.swift */, - DF68A40A4DEDC09C721E57869BA6D0EC /* LevenshteinDistance.swift */, - BD25E0CCD5E772D03AE8BFB171B64CCE /* MatchedStringRepresentable.swift */, - 4EDC5D0A7C4BE0CCC3815035792C0EAA /* PageObject.swift */, - 6BA86C9EF53A0FC4FCC910058EDC456B /* Step.swift */, - 9374342A7A7FD955329B4A91E67A23EF /* StepDefiner.swift */, - 4D5FA114A5DB063EDE2A802AB80A18FA /* StringGherkinExtension.swift */, - 6D777736D2B2AFEB5A473031253DA7D7 /* UnusedStepsTracker.h */, - 0102799758155203DC659643A5FB69CE /* UnusedStepsTracker.m */, - D91D68B970113F017BB0F0E3DE9DB352 /* XCTestCase+Gherkin.swift */, - 6322352621614A9400D63127 /* Background.swift */, - ); - name = Core; - sourceTree = ""; - }; - F4E056E7DE7D3841D44D30F155BA4ADC /* XCTest-Gherkin */ = { + DA95CB2A265418BD1B13AF21F6D87DE4 /* iOS */ = { isa = PBXGroup; children = ( - DC6F9E087A29D2642655860B43E613D2 /* Core */, - 95A041253C60D5E5892A970E87A1271A /* Native */, - BC2E48FFF5554563E30AAD6F81EDE7D5 /* Pod */, - 92AC966A641BDF25A30524DC98F4BD80 /* Support Files */, + 0053906DC63793F7F0D6BAA7879F1832 /* Foundation.framework */, + 2FE887C3930818A0B7A8E28E7D81F69C /* XCTest.framework */, ); - name = "XCTest-Gherkin"; - path = ../..; + name = iOS; sourceTree = ""; }; FA9C1AE4CBA08A36CC0DEEBAC1425945 /* Development Pods */ = { isa = PBXGroup; children = ( - F4E056E7DE7D3841D44D30F155BA4ADC /* XCTest-Gherkin */, + 7F459B976398C0FC850E02A80E3AC82C /* XCTest-Gherkin */, ); name = "Development Pods"; sourceTree = ""; @@ -493,7 +499,7 @@ buildConfigurationList = 60EC3104C749AD34A69223F44A737A0D /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */; buildPhases = ( E676D893D1FFBF3951600D833B2B8233 /* Headers */, - 01FE4D1D0799D6C747CCEAD163EEE49C /* Sources */, + F15DAA480572B644852333BE39A02245 /* Sources */, 1DCA06F5C9509B071EC167B1F94D7DA6 /* Frameworks */, A3252188B919099ACB9B797F07814613 /* Resources */, ); @@ -568,34 +574,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 01FE4D1D0799D6C747CCEAD163EEE49C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81AC15E326092A760A96EC74DC29B21F /* ClassHelperMethods.swift in Sources */, - E98F376581E114B01B22D13ABBE93087 /* Example.swift in Sources */, - 315BE998E195CCA11DCD2243FFCF1704 /* Language.swift in Sources */, - 6D8B9DA0027052FCD7EAD00BC2A7F14A /* LevenshteinDistance.swift in Sources */, - 5C7A4B99A39E75EA1C6C5B742E62EE07 /* MatchedStringRepresentable.swift in Sources */, - 4566FA0FD3D08F08495083231B6F2D72 /* NativeExample.swift in Sources */, - BB5D2E87379A60E78548CCB9E13A011F /* NativeFeature.swift in Sources */, - 4E1068B10B78ABD30745F080B72CC1C1 /* NativeFeatureParser.swift in Sources */, - 6322352721614A9400D63127 /* Background.swift in Sources */, - 822615EA5D270209F3B6C66F1983B475 /* NativeRunner.swift in Sources */, - C9A496D9BE2D83949C2C45022EA0C142 /* NativeScenario.swift in Sources */, - 070728E4F9E12A8F5AC74FE88791097F /* NativeTestCase.swift in Sources */, - 76BB5C142660AE495A779F91645E103B /* PageObject.swift in Sources */, - 86467290EE20CC6FE2AAF628CA268C01 /* ParseState.swift in Sources */, - 7675D7C0411E1DE29AD43F7E45F16E84 /* Step.swift in Sources */, - 772F3BBA7D7CE90BE1A92139D913E9DA /* StepDefiner.swift in Sources */, - 71EDAC12BDC51DE69BDBA359EACA42D6 /* StringGherkinExtension.swift in Sources */, - D3000A2994F07B0AEB602CF8CB26A169 /* UnusedStepsTracker.m in Sources */, - C6E13AB8B282AA4390A68322CA2A04D6 /* XCGNativeInitializer.m in Sources */, - F715A81D4C8957162CBEBFE47D475333 /* XCTest-Gherkin-dummy.m in Sources */, - 2BD95CBEB42EB9C44019C508C401441B /* XCTestCase+Gherkin.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 21DA2CDE797B7BBBF568AEEA064A1596 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -620,6 +598,36 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F15DAA480572B644852333BE39A02245 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B777661D9ED1ED3364F6296C15F26151 /* Background.swift in Sources */, + 3018D7ADC5D9921777EF3ADD6117326F /* ClassHelperMethods.swift in Sources */, + 669E25645F209826D5B5F6499D26B7E0 /* DataTable.swift in Sources */, + 88FF81A30571FFFB6D06D5B579D7AB25 /* Example.swift in Sources */, + BCB0EB59F7083B5C30A51601FC16F5F0 /* Language.swift in Sources */, + FBA9AFEA4827BD2A015A10998DD14AB4 /* LevenshteinDistance.swift in Sources */, + 995D7794A4CE7EDCC9F9E02E37235918 /* MatchedStringRepresentable.swift in Sources */, + 332BDC714C96E192AF7721CBEC800E5B /* NativeDataTable.swift in Sources */, + 88595F2955F45CB59AA1936599C274CF /* NativeExample.swift in Sources */, + BC6705988E727DDF6DB21E3F44CEF9C6 /* NativeFeature.swift in Sources */, + 5DC8C8A15700EC78858E4E79F15845FD /* NativeFeatureParser.swift in Sources */, + 3856EAE35BD4B79F1443EEB5996DBA79 /* NativeRunner.swift in Sources */, + EF78CC2E5AC25E9F6F07735396BE90C6 /* NativeScenario.swift in Sources */, + 50548D01E082226576518A8BBCAE8CA9 /* NativeTestCase.swift in Sources */, + 9309042A395675BD3D120F2977087A25 /* PageObject.swift in Sources */, + D0EE5A4D90C644F775F3D5E51405E1FF /* ParseState.swift in Sources */, + 952B40D52E06B44621A3DDC4EBC91829 /* Step.swift in Sources */, + 5686FD332AC73FAF9D0A9BD5E7A4EDE8 /* StepDefiner.swift in Sources */, + 08E39C8442AB7929656B3FE6315DE032 /* StringGherkinExtension.swift in Sources */, + 530AB4D57F5ABFA426B4307F0E0B097E /* UnusedStepsTracker.m in Sources */, + E042D7872C7DA9A991979F2E3CBEAD9D /* XCGNativeInitializer.m in Sources */, + F9DEC98C482439AC9157A978814765BB /* XCTest-Gherkin-dummy.m in Sources */, + 69F734B9956450980302307BA4A6D3BE /* XCTestCase+Gherkin.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -644,11 +652,10 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0CCEA6FC1C2FA7099B9D51B78ECEAAA1 /* Release */ = { + 12E6DCF26A07BCD48891077F622A9C92 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 02DED36F4F2128F299FC1210E93E55C5 /* Pods-XCTest-Gherkin_Example.release.xcconfig */; + baseConfigurationReference = 67B5B9BD3F077426AF1DF53C752A6D6E /* XCTest-Gherkin.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -658,21 +665,18 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XCTest-Gherkin/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin.modulemap"; + PRODUCT_MODULE_NAME = XCTest_Gherkin; + PRODUCT_NAME = XCTest_Gherkin; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.1; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -680,9 +684,9 @@ }; name = Release; }; - 1838113FCDE13B4E3B403C24DDF6050A /* Debug */ = { + 1DC9DC8AA9E4D87D5C316FEEBB008AD6 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A65F660E68E914DA69E3F2E7917771B7 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig */; + baseConfigurationReference = 42897CCA4CE29EEDE8CFCAD0DE723FB8 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; @@ -694,12 +698,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -707,17 +711,15 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 6EC04AF91664DD989AE299C77264DEC2 /* Debug */ = { + 31CFBD58E6F6C129391CCFD2AFBD911D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3DBDDB66A5B624EEFF4FEE53053BE074 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */; + baseConfigurationReference = A65F660E68E914DA69E3F2E7917771B7 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; @@ -729,12 +731,12 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -742,18 +744,17 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 70E644CA1DDF52BF35E7A97DE121BFFB /* Release */ = { + 3E1316811A22895E77A6792E1219EBE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1E6AEBD40066292D0D8634156FC60623 /* XCTest-Gherkin.xcconfig */; + baseConfigurationReference = 02DED36F4F2128F299FC1210E93E55C5 /* Pods-XCTest-Gherkin_Example.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -763,20 +764,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XCTest-Gherkin/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin.modulemap"; - PRODUCT_MODULE_NAME = XCTest_Gherkin; - PRODUCT_NAME = XCTest_Gherkin; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.1; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -784,7 +784,7 @@ }; name = Release; }; - 73ABC2D18F03827B7773405E7F2AD926 /* Debug */ = { + 6C6EACA84DA9A4D8A1E4E2501D3848D0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -844,11 +844,13 @@ PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; SYMROOT = "${SRCROOT}/../build"; }; name = Debug; }; - 75C726CF6797E3A42E29B8DF373A05B7 /* Release */ = { + 967D5FDC95B31B77F5965B4DDC974544 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 34288C6294AE41198DA3C43BB1AD8DFB /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.release.xcconfig */; buildSettings = { @@ -875,8 +877,6 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -884,9 +884,76 @@ }; name = Release; }; - 90914ACFA72A4F3BF7642F6A5B00D173 /* Debug */ = { + A6E19A2259C155B25BDE22C5B665160D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEC081B6FD75A859731B5655F980AD0B /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + CD5B98DA9D234191C2F1AE22CE568F18 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3DBDDB66A5B624EEFF4FEE53053BE074 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D0358BAB0B7432D63A302DF8A8B47B9F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1E6AEBD40066292D0D8634156FC60623 /* XCTest-Gherkin.xcconfig */; + baseConfigurationReference = 67B5B9BD3F077426AF1DF53C752A6D6E /* XCTest-Gherkin.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -908,7 +975,6 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 4.1; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -916,7 +982,7 @@ }; name = Debug; }; - 9B6B989AABD96BB9DECB1784EA5E2534 /* Release */ = { + D9B851E8D67D359282551F91AF242887 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -971,89 +1037,21 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - D6FA5D642807B0A0603F21D7C5C55581 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = EEC081B6FD75A859731B5655F980AD0B /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + SWIFT_VERSION = 4.2; + SYMROOT = "${SRCROOT}/../build"; }; name = Release; }; - F6D5F5B3745338959B6687946AC85CF1 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 42897CCA4CE29EEDE8CFCAD0DE723FB8 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 73ABC2D18F03827B7773405E7F2AD926 /* Debug */, - 9B6B989AABD96BB9DECB1784EA5E2534 /* Release */, + 6C6EACA84DA9A4D8A1E4E2501D3848D0 /* Debug */, + D9B851E8D67D359282551F91AF242887 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1061,8 +1059,8 @@ 4B0AA095D3E5994CBDD907580966F5C6 /* Build configuration list for PBXNativeTarget "Pods-XCTest-Gherkin_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6EC04AF91664DD989AE299C77264DEC2 /* Debug */, - 0CCEA6FC1C2FA7099B9D51B78ECEAAA1 /* Release */, + CD5B98DA9D234191C2F1AE22CE568F18 /* Debug */, + 3E1316811A22895E77A6792E1219EBE5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1070,8 +1068,8 @@ 60EC3104C749AD34A69223F44A737A0D /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */ = { isa = XCConfigurationList; buildConfigurations = ( - 90914ACFA72A4F3BF7642F6A5B00D173 /* Debug */, - 70E644CA1DDF52BF35E7A97DE121BFFB /* Release */, + D0358BAB0B7432D63A302DF8A8B47B9F /* Debug */, + 12E6DCF26A07BCD48891077F622A9C92 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1079,8 +1077,8 @@ 65B1E911DD30B0B40BE64239E6A89B88 /* Build configuration list for PBXNativeTarget "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( - F6D5F5B3745338959B6687946AC85CF1 /* Debug */, - 75C726CF6797E3A42E29B8DF373A05B7 /* Release */, + 1DC9DC8AA9E4D87D5C316FEEBB008AD6 /* Debug */, + 967D5FDC95B31B77F5965B4DDC974544 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1088,8 +1086,8 @@ D0B5481E37AF1AC02ACBBC8FC23048B3 /* Build configuration list for PBXNativeTarget "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1838113FCDE13B4E3B403C24DDF6050A /* Debug */, - D6FA5D642807B0A0603F21D7C5C55581 /* Release */, + 31CFBD58E6F6C129391CCFD2AFBD911D /* Debug */, + A6E19A2259C155B25BDE22C5B665160D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/XCTest-Gherkin/Info.plist b/Example/Pods/Target Support Files/XCTest-Gherkin/Info.plist index 243fbe5..fe9ca91 100644 --- a/Example/Pods/Target Support Files/XCTest-Gherkin/Info.plist +++ b/Example/Pods/Target Support Files/XCTest-Gherkin/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.16.0 + 0.18.0 CFBundleSignature ???? CFBundleVersion diff --git a/Example/XCTest-Gherkin.xcodeproj/project.pbxproj b/Example/XCTest-Gherkin.xcodeproj/project.pbxproj index d5f8d1a..e140985 100644 --- a/Example/XCTest-Gherkin.xcodeproj/project.pbxproj +++ b/Example/XCTest-Gherkin.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 9B9DF95F1DDB3A4500EDBDDF /* ExampleNativeRunnerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B9DF95E1DDB3A4500EDBDDF /* ExampleNativeRunnerTest.swift */; }; A055C1B120F8DC5B00539791 /* MultipleTestRunTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A055C1AE20F8D68800539791 /* MultipleTestRunTests.swift */; }; AE7D6C386C4DAF0C1292DE0B /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B23A6E26B52E88BC1F182097 /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework */; }; + B5772A4F21C7D006005A1EB4 /* NativeDataTableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5772A4E21C7D006005A1EB4 /* NativeDataTableTest.swift */; }; B5F7CFB921320DDF001643BD /* ExampleNativeLocalisationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F7CFB821320DDF001643BD /* ExampleNativeLocalisationTest.swift */; }; B5FC01A7213A0A66006B5A48 /* NativeFeatureParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC01A6213A0A65006B5A48 /* NativeFeatureParserTests.swift */; }; B5FC01AF213AB45F006B5A48 /* BackgroundTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5FC01AE213AB45F006B5A48 /* BackgroundTests.swift */; }; @@ -79,6 +80,7 @@ AD8DF65B966910B5E42CBECB /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; B23A6E26B52E88BC1F182097 /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3AC2FD70988184EBE408E62 /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5772A4E21C7D006005A1EB4 /* NativeDataTableTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NativeDataTableTest.swift; sourceTree = ""; }; B5F7CFB821320DDF001643BD /* ExampleNativeLocalisationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleNativeLocalisationTest.swift; sourceTree = ""; }; B5FC01A6213A0A65006B5A48 /* NativeFeatureParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeFeatureParserTests.swift; sourceTree = ""; }; B5FC01AE213AB45F006B5A48 /* BackgroundTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundTests.swift; sourceTree = ""; }; @@ -263,6 +265,7 @@ E54130971BEBE06600E92975 /* NativeFeatures */, E5805BFE1BEA939000D3ECD5 /* ExampleFeatures.swift */, E54130991BEBE11B00E92975 /* ExampleNativeTest.swift */, + B5772A4E21C7D006005A1EB4 /* NativeDataTableTest.swift */, 5782122A1E974A570048D25F /* NativeScenarioTest.swift */, E8C172631D25197C006A99DF /* ExampleNativeFeatureTest.swift */, 578212281E94B1610048D25F /* ExampleNativeOrderTest.swift */, @@ -592,6 +595,7 @@ 5782122B1E974A570048D25F /* NativeScenarioTest.swift in Sources */, E5805C031BEA93E900D3ECD5 /* SanitySteps.swift in Sources */, B5F7CFB921320DDF001643BD /* ExampleNativeLocalisationTest.swift in Sources */, + B5772A4F21C7D006005A1EB4 /* NativeDataTableTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Pod/Native/NativeDataTable.swift b/Pod/Native/NativeDataTable.swift index 55e2191..456d5db 100644 --- a/Pod/Native/NativeDataTable.swift +++ b/Pod/Native/NativeDataTable.swift @@ -41,8 +41,8 @@ public struct NativeDataTable { extension StepDefiner { func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable)->(), transform: @escaping ([[String]]) throws -> T) { - self.test.addStep(expression, file: file, line: line) { (matches: [String]) in - guard let match = matches.first else { + self.test.addStep(expression, options: [], file: file, line: line) { (matches: StepMatches) in + guard let match = matches.allMatches.first else { XCTFail("Expected single match not found in \"\(expression)\"") return } diff --git a/Pod/Native/NativeFeature.swift b/Pod/Native/NativeFeature.swift index 69f9696..437a56f 100644 --- a/Pod/Native/NativeFeature.swift +++ b/Pod/Native/NativeFeature.swift @@ -98,11 +98,18 @@ extension NativeFeature { if let dataTableLines = state.dataTableLines { let lastStep = state.steps.removeLast() - state.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") - state.steps.append(.init(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) + state.steps.append( + StepDescription( + keyword: lastStep.keyword, + expression: lastStep.expression + " \(dataTableLines.joined(separator: ","))", + file: path, + line: lineNumber + ) + ) + state.steps.append(StepDescription(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) state.dataTableLines = nil } else { - state.steps.append(.init(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) + state.steps.append(StepDescription(keyword: linePrefix, expression: lineSuffix, file: path, line: lineNumber)) } case Language.current.keywords.Examples: @@ -128,7 +135,14 @@ extension NativeFeature { // the last scenarios if let dataTableLines = state.dataTableLines { let lastStep = state.steps.removeLast() - state.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") + state.steps.append( + StepDescription( + keyword: lastStep.keyword, + expression: lastStep.expression + " \(dataTableLines.joined(separator: ","))", + file: path, + line: lineNumber + ) + ) state.dataTableLines = nil } if let newScenarios = state.scenarios(at: scenarios.count) { diff --git a/Pod/Native/ParseState.swift b/Pod/Native/ParseState.swift index 8cc85ee..92ff587 100644 --- a/Pod/Native/ParseState.swift +++ b/Pod/Native/ParseState.swift @@ -12,7 +12,8 @@ private let whitespace = CharacterSet.whitespaces class ParseState { var name: String? - var steps: [String] + var description: [String] = [] + var steps: [StepDescription] var exampleLines: [(lineNumber: Int, line: String)]? var dataTableLines: [String]? var parsingBackground: Bool @@ -74,7 +75,14 @@ class ParseState { if self.examples.isEmpty { if let dataTableLines = self.dataTableLines { let lastStep = self.steps.removeLast() - self.steps.append(lastStep + " \(dataTableLines.joined(separator: ","))") + self.steps.append( + StepDescription( + keyword: lastStep.keyword, + expression: lastStep.expression + " \(dataTableLines.joined(separator: ","))", + file: lastStep.file, + line: lastStep.line + ) + ) } scenarios.append(NativeScenario(name, steps: self.steps, index: index)) } else { From c8d0ceac58940d42343f3d4b82240827c4d2788c Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Mon, 17 Dec 2018 13:16:26 +0000 Subject: [PATCH 4/7] pass in data table values in a trailing closure of a step invocation --- Example/Tests/Features/ExampleFeatures.swift | 35 ++++++------ Pod/Core/XCTestCase+Gherkin.swift | 35 ++++++++++-- Pod/Native/NativeDataTable.swift | 56 ++++++++++---------- 3 files changed, 80 insertions(+), 46 deletions(-) diff --git a/Example/Tests/Features/ExampleFeatures.swift b/Example/Tests/Features/ExampleFeatures.swift index c801694..853b2c8 100644 --- a/Example/Tests/Features/ExampleFeatures.swift +++ b/Example/Tests/Features/ExampleFeatures.swift @@ -175,34 +175,39 @@ final class ExampleFeatures: XCTestCase { } func testMatchingStringLiterals() { - /// Test that calling Given when defining the step using `step(exactly:...` will work, and won't be horribly confused by regular expression characters - /// in the step + // Test that calling Given when defining the step using `step(exactly:...` will work, + // and won't be horribly confused by regular expression characters in the step Given(MatchStringLiteralStepDefiner.literal) } func testArrayDataTable() { - Given("I add the following numbers: \(DataTable([1, 2, 3]))") + Given("I add the following numbers:") { + [1, 2, 3] + } Then("I end up with 6") } func testDictionaryDataTable() { - Given("I add the following letters: \(DataTable(["a": 1, "b": 2, "c": 3]))") + Given("I add the following letters:") { + ["a": 1, "b": 2, "c": 3] + } Then("I end up with 6") } func testCodableDataTable() { - let persons = [ - Person(name: "Alice", age: 27, height: 170), - Person(name: "Bob", age: 27, height: 170) - ] - Given("I know the following persons: \(DataTable(persons))") + Given("I know the following persons:") { + [ + Person(name: "Alice", age: 27, height: 170), + Person(name: "Bob", age: 27, height: 170) + ] + } - let personsByName = [ - "Alice": Person(name: "Alice", age: 27, height: 170), - "Bob": Person(name: "Bob", age: 27, height: 170) - ] - Given("I know the following persons by name: \(DataTable(personsByName))") + Given("I know the following persons by name:") { + [ + "Alice": Person(name: "Alice", age: 27, height: 170), + "Bob": Person(name: "Bob", age: 27, height: 170) + ] + } } - } diff --git a/Pod/Core/XCTestCase+Gherkin.swift b/Pod/Core/XCTestCase+Gherkin.swift index 445137b..6f1a14c 100644 --- a/Pod/Core/XCTestCase+Gherkin.swift +++ b/Pod/Core/XCTestCase+Gherkin.swift @@ -165,27 +165,56 @@ public extension XCTestCase { func Given(_ expression: String, file: String = #file, line: Int = #line) { self.performStep(expression, keyword: "Given", file: file, line: line) } - + + /** + Run the step matching the specified expression followed by a data table + */ + func Given(_ expression: String, file: String = #file, line: Int = #line, dataTable values: () -> T) { + self.performStep(expression + " \(DataTable(values()))", keyword: "Given", file: file, line: line) + } + /** Run the step matching the specified expression */ func When(_ expression: String, file: String = #file, line: Int = #line) { self.performStep(expression, keyword: "When", file: file, line: line) } - + + /** + Run the step matching the specified expression followed by a data table + */ + func When(_ expression: String, file: String = #file, line: Int = #line, dataTable values: () -> T) { + self.performStep(expression + " \(DataTable(values()))", keyword: "When", file: file, line: line) + } + /** Run the step matching the specified expression */ func Then(_ expression: String, file: String = #file, line: Int = #line) { self.performStep(expression, keyword: "Then", file: file, line: line) } - + + /** + Run the step matching the specified expression followed by a data table + */ + func Then(_ expression: String, file: String = #file, line: Int = #line, dataTable values: () -> T) { + self.performStep(expression + " \(DataTable(values()))", keyword: "Then", file: file, line: line) + } + /** Run the step matching the specified expression */ func And(_ expression: String, file: String = #file, line: Int = #line) { self.performStep(expression, keyword: "And", file: file, line: line) } + + /** + Run the step matching the specified expression followed by a data table + */ + func And(_ expression: String, file: String = #file, line: Int = #line, dataTable values: () -> T) { + self.performStep(expression + " \(DataTable(values()))", keyword: "And", file: file, line: line) + } + } private var automaticScreenshotsBehaviour: AutomaticScreenshotsBehaviour = .none diff --git a/Pod/Native/NativeDataTable.swift b/Pod/Native/NativeDataTable.swift index 456d5db..7f93418 100644 --- a/Pod/Native/NativeDataTable.swift +++ b/Pod/Native/NativeDataTable.swift @@ -83,15 +83,15 @@ extension StepDefiner { } } - // /** - // Input: - // | 1 | 4 | - // | 2 | 5 | - // | 3 | 6 | - // - // Result: - // [[1, 4], [2, 5], [3, 6]] - // */ + /** + Input: + | 1 | 4 | + | 2 | 5 | + | 3 | 6 | + + Result: + [[1, 4], [2, 5], [3, 6]] + */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[T]]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[T]] in return try values.map { row in @@ -114,9 +114,9 @@ extension StepDefiner { Result: [ - [ "firstName": "Annie M.G", "lastName": "Schmidt", "birthDate": "1911-03-20" ], - [ "firstName": "Roald", "lastName": "Dahl", "birthDate": "1916-09-13" ], - [ "firstName": "Astrid", "lastName": "Lindgren", "birthDate": "1907-11-14" ] + [ "firstName": "Annie M.G", "lastName": "Schmidt", "birthDate": "1911-03-20" ], + [ "firstName": "Roald", "lastName": "Dahl", "birthDate": "1916-09-13" ], + [ "firstName": "Astrid", "lastName": "Lindgren", "birthDate": "1907-11-14" ] ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[String: T]]>)->()) { @@ -145,10 +145,10 @@ extension StepDefiner { Result: [ - "KMSY": "Louis Armstrong New Orleans International Airport", - "KSFO": "San Francisco International Airport", - "KSEA": "Seattle–Tacoma International Airport", - "KJFK": "John F. Kennedy International Airport" + "KMSY": "Louis Armstrong New Orleans International Airport", + "KSFO": "San Francisco International Airport", + "KSEA": "Seattle–Tacoma International Airport", + "KJFK": "John F. Kennedy International Airport" ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: T]>)->()) { @@ -175,10 +175,10 @@ extension StepDefiner { Result: [ - "KMSY": ["29.993333", "-90.258056"], - "KSFO": ["37.618889", "-122.375000"], - "KSEA": ["47.448889", "-122.309444"], - "KJFK": ["40.639722", "-73.778889"] + "KMSY": ["29.993333", "-90.258056"], + "KSFO": ["37.618889", "-122.375000"], + "KSEA": ["47.448889", "-122.309444"], + "KJFK": ["40.639722", "-73.778889"] ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [T]]>)->()) { @@ -204,10 +204,10 @@ extension StepDefiner { Result: [ - "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], - "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], - "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], - "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] + "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], + "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], + "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], + "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [String: T]]>)->()) { @@ -236,8 +236,8 @@ extension StepDefiner { Output: [ - Person(name: "Alice", age: 20, height: 170), - Person(name: "Bob", age: 21, height: 171) + Person(name: "Alice", age: 20, height: 170), + Person(name: "Bob", age: 21, height: 171) ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { @@ -266,8 +266,8 @@ extension StepDefiner { Output: [ - 1: Person(name: "Alice", age: 20, height: 170), - 2: Person(name: "Bob", age: 21, height: 171) + 1: Person(name: "Alice", age: 20, height: 170), + 2: Person(name: "Bob", age: 21, height: 171) ] */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[U: T]>)->()) { From 7e63e12c733ee93ed736b52a31dcad4c3fa63777 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Sat, 15 Jun 2019 11:41:13 +0100 Subject: [PATCH 5/7] revert project file changes --- Example/Pods/Pods.xcodeproj/project.pbxproj | 420 ++++++++++---------- 1 file changed, 210 insertions(+), 210 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 6234e11..afa9c41 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -20,44 +20,44 @@ /* Begin PBXBuildFile section */ 0207E4323AD68B2444CCEB8F9F2545A1 /* Pods-XCTest-Gherkin_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC5D567508972573AA010D06DD6E808B /* Pods-XCTest-Gherkin_Example-dummy.m */; }; + 0256218128D2B06458F9595AC2C6E53B /* NativeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 575C032990D9BD294CF1CD79522292FE /* NativeExample.swift */; }; 0552F8D9EEE99F608BD971A3A3B13888 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E8DA7B77652BB0715BEB8D6BB42C276 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0C86590892DB6AA5B2B3E941ABF4CDB7 /* NativeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B5668CBFCE886A09005361FE438996C /* NativeScenario.swift */; }; - 19BE9B56041DE30FF5E36C72AEBA4A2F /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60E3FDB928A3FEBD2B20ECA41B6AC5CF /* Background.swift */; }; - 1ACC008BBF006788004E3A2C92530C21 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154868FF61699A97D66C3EC546277536 /* Example.swift */; }; - 1FA776438190AAF31EF3F737656002A6 /* PageObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33DE81EE6FB41BA2549079B2E92E8461 /* PageObject.swift */; }; - 20E81359614C269B4549374BB3B74C59 /* LevenshteinDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67B9B69AD5ABD440239ED4675E66478 /* LevenshteinDistance.swift */; }; + 07A72B799536470FE9A9F109CCD27312 /* NativeTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294F8F4B09FDC0152A82DB5E005D2B61 /* NativeTestCase.swift */; }; + 0DC4D7E4A5848701D03313269FF2CB33 /* ParseState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9CBEB85AE5155385060E67C92B493FB /* ParseState.swift */; }; + 203C3E3EFC893673731EDE7A47C7B259 /* XCTest_Gherkin.h in Headers */ = {isa = PBXBuildFile; fileRef = 49105070F0498D30A45FE88D28850123 /* XCTest_Gherkin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21E56923BF3AE784E46EFDCAE7CF5CE4 /* XCGNativeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4837FA7777EC05F0F52972D7F9304275 /* XCGNativeInitializer.m */; }; 24F876FC58186FF4D4B788360911CFD8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; - 278809491FB36D6329348B65689E0EE2 /* XCTest-Gherkin-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 46BFB17A0F0A2755B96FDA232789C9FE /* XCTest-Gherkin-dummy.m */; }; - 29612A4A52F85D45CBC904D2309A591E /* StringGherkinExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018E424D4BA0E5CDDFC3EA31BFE8FBE8 /* StringGherkinExtension.swift */; }; 2B1AF20480552C8524F8F6EA03C52AFD /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E4C429074D92B4CBC3748F4F670A195 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m */; }; - 2E44FFB415ECDED3166FD5E53958E0DF /* NativeTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF23961B7C04758BBB52FEEA9AC7963 /* NativeTestCase.swift */; }; - 2F39F029AAA3335819777FEB715A89C2 /* XCTest-Gherkin-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A72F157FFB6870643B2BAF4197CD49DE /* XCTest-Gherkin-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 328D1D3EC6B16B75D2696DE2013C512D /* DataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9924EB00CDF1E368068D9F88B6B5C114 /* DataTable.swift */; }; - 34BAE5570E1D2B47AB97385D6DB4E2F3 /* MatchedStringRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4B78AD63D88F45E05BAD88B3A95EB3 /* MatchedStringRepresentable.swift */; }; + 357E63DD6985EB2790E8C610DD251881 /* StringGherkinExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B897187778BE61C0237B94CFAB351909 /* StringGherkinExtension.swift */; }; + 3AFE600DF775CE27BFD1038F65830A8C /* XCGNativeInitializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 613D3FAA75F3A769D58636E7A763BF9A /* XCGNativeInitializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3C9076F814C1736B19CF8FDD49B580FA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; + 3D65C3F1226794B0A0E05F7F3B624DAC /* PageObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3B30F9A4E48603BEB67C978E8EEA7B9 /* PageObject.swift */; }; 3DAE1BED643E936B8A27025E95A54B5A /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D3595CA063040284DDAD344A7F6592F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m */; }; + 57016AD8FF80351FA2CD5F47C2E84B4B /* XCTestCase+Gherkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9022EBF590D7CCE34875CB4005179E47 /* XCTestCase+Gherkin.swift */; }; 5D2463A18F78956988C993F3A8235BB0 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 463A282C0F1A22465E5514AFFF7FF32A /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5D9ADD73938168ACDF5FE31217190E74 /* UnusedStepsTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 0174ABF0F1719DF797263BC7966672ED /* UnusedStepsTracker.m */; }; - 734B73B04C83F6F88F95B5C6ED677A83 /* XCGNativeInitializer.h in Headers */ = {isa = PBXBuildFile; fileRef = B63F217EA15203423E5A5EAFB0F01184 /* XCGNativeInitializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CEA0864DA0594ED736AED40BD56F4F2 /* StepDefiner.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2E40063A96B412D7E8F77764C3DFDEE /* StepDefiner.swift */; }; + 5F4EA5BFFCF3A7E1573A093700F861BF /* UnusedStepsTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A019A5A6229C2D52D360505F7D722A6 /* UnusedStepsTracker.m */; }; + 6310EB4422B5021F003E9C4F /* NativeDataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6310EB4322B5021F003E9C4F /* NativeDataTable.swift */; }; + 6310EB4622B50229003E9C4F /* DataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6310EB4522B50229003E9C4F /* DataTable.swift */; }; + 63A4D4EC2E81C3AC0B6F9912FB0C49CF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; + 65DA43C4E99916AAFC7721F639DCA19A /* NativeRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7910B4901AC8EC350A2B5D6D7A9BAEB1 /* NativeRunner.swift */; }; + 6B15018CFA0A19AFD2B971ECE9B6DABD /* NativeScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080A944EC5CEF73D1272EF6DA97856FE /* NativeScenario.swift */; }; + 7A27DA2C7DBFD35FA90CE1BD5F3C41A0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */; }; 7F783D8AD0FC6C3D3406FC2DF5BA496E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; + 8210CE883DAF84FEAB6497C6F58C0CA2 /* UnusedStepsTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 5185B248F7AFDBF10C19743161198EF6 /* UnusedStepsTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8839440DAC94B0E004CA39C8C3C5AEA3 /* Pods-XCTest-Gherkin_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C164DF15CA7EF1133642FE653F9D6EC /* Pods-XCTest-Gherkin_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 91EABA3BA4F1CFB0A6177481CC4D9F16 /* NativeFeatureParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A23B0A82A90792349EAF329FD4FFBD /* NativeFeatureParser.swift */; }; - 981394A2991F19E2F83AC47080C6FF38 /* ParseState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B5FD2D876F8D7D597F9D7ACCC45EC34 /* ParseState.swift */; }; - A767816705F7877D348CE2A8E1A64FFA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */; }; - AEEBC391C54F1C563ED6514CDF8BA3FB /* XCTest_Gherkin.h in Headers */ = {isa = PBXBuildFile; fileRef = 1110B012E8FFF79DE2CB7BDB7F32EB87 /* XCTest_Gherkin.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD5978AB9450FA03B4005717E19EE850 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */; }; - CA73B93B5A34AAF9A576C1C05A7AD2FB /* XCGNativeInitializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 82E403E4F9E3E818FE1AF9A95668FC2F /* XCGNativeInitializer.m */; }; - CC9B95BC33D50724B9189DFED6A118D5 /* NativeExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE46FE0EDC0BEA5317BA51B161AB339B /* NativeExample.swift */; }; - D0B4E0E1990AACD62F27B5F07F65BE69 /* UnusedStepsTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 244530C113248A71273E29120D26929A /* UnusedStepsTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D608C199BB481F483417E446CBC9D118 /* NativeRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8206B1907E2F037B7B8D566E24C851A6 /* NativeRunner.swift */; }; - DF2E3951DF91247F0516C2B24D65A838 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDB59F45F1B332EAC5FE4A40F65033B /* Language.swift */; }; - E027BA1571B57B9436888119EF933F9C /* gherkin-languages.json in Resources */ = {isa = PBXBuildFile; fileRef = B6174F7CA7BEFF6F61D8798113EEC950 /* gherkin-languages.json */; }; - E5C8245B0867B5F03C34DD228032FFB6 /* NativeFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = E96B87D45C6490C367EC5A90A4334EBA /* NativeFeature.swift */; }; - F32D65F4839A7506D4F0418F8E8BB482 /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E63B758A2389E6BB80101A200F849CC /* Step.swift */; }; - F3B12DF743A57AD7673BE571AB8D26B4 /* ClassHelperMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = E01164EA7ACA140A8E643F2AF1AEC4C4 /* ClassHelperMethods.swift */; }; - F97873320657D631880AF0A466ED4948 /* NativeDataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D242C17AC22EA5C54D11E380A0D4063A /* NativeDataTable.swift */; }; - FE62D421C88862D5E682ED7D1FD1BF71 /* XCTestCase+Gherkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 871DD8ED9925D2FB7B18FB1C34B9F76B /* XCTestCase+Gherkin.swift */; }; + 8C60BAEF186803B8DECE0354C4171A6E /* XCTest-Gherkin-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 771E9D810835CF92834D30564A396FDF /* XCTest-Gherkin-dummy.m */; }; + 95B802F947431FF622D6F3F240EC3A4C /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A931BFE367A1475795A673AB8A3E494 /* Example.swift */; }; + 9789CCD7D38E2977E322C5BA6E276823 /* NativeFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE892E1794340EB70513FABCF43D3B0C /* NativeFeature.swift */; }; + A2AC8EA28B682B2C562117E40C9C47F0 /* XCTest-Gherkin-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4394E53E71AE65CAE4B3F216551732EF /* XCTest-Gherkin-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A78DA6B4DEDFC6FBAF7F02B8C2F251C2 /* NativeFeatureParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA65A109413868C92FA9CF6C8BE0C3CD /* NativeFeatureParser.swift */; }; + B75F90135C50BE5D613CFF7D700BB6CF /* StepDefiner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B38C6528E8CB6A475C1F7A9CCEBF3192 /* StepDefiner.swift */; }; + C23A37D3EF7DE9293E41F71AADA5AEF3 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587019597B6911C340A329F161C42396 /* Background.swift */; }; + D3377C0C63C7447756BD2D0E557CC060 /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2AE81503F9B7E164C1B9E7F4C62EA88 /* Language.swift */; }; + D800407E310BA29E037B62442B779B47 /* ClassHelperMethods.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4238BC9890C0489CA1A9C8A9B84D94D /* ClassHelperMethods.swift */; }; + D82E39679FB22F2A3F7D98249FD5464D /* MatchedStringRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CE594742A62F026E955AE028A1CEED /* MatchedStringRepresentable.swift */; }; + EFC87BAF516F4B4B840BD4DF10EC0596 /* gherkin-languages.json in Resources */ = {isa = PBXBuildFile; fileRef = 4A6FDEBC2CC4EFE432370954FE3F1D05 /* gherkin-languages.json */; }; + F1B6E151B7394D8F00FA135FFF11C5BF /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580137C27C28614EC4CD6E13D08CA766 /* Step.swift */; }; + F31E80D9E59C268C916EF31EB2ECCDF5 /* LevenshteinDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC376A5FADAF684813ACCC94BF3D189D /* LevenshteinDistance.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -107,71 +107,71 @@ /* Begin PBXFileReference section */ 005E230E78132885DEE86478433DF48B /* Pods-XCTest-Gherkin_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-Info.plist"; sourceTree = ""; }; - 0174ABF0F1719DF797263BC7966672ED /* UnusedStepsTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UnusedStepsTracker.m; path = Pod/Core/UnusedStepsTracker.m; sourceTree = ""; }; - 018E424D4BA0E5CDDFC3EA31BFE8FBE8 /* StringGherkinExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringGherkinExtension.swift; path = Pod/Core/StringGherkinExtension.swift; sourceTree = ""; }; 033A36A29482FD32230FE0CA177F9BD3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 0B5FD2D876F8D7D597F9D7ACCC45EC34 /* ParseState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParseState.swift; path = Pod/Native/ParseState.swift; sourceTree = ""; }; - 1110B012E8FFF79DE2CB7BDB7F32EB87 /* XCTest_Gherkin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCTest_Gherkin.h; path = Pod/Native/XCTest_Gherkin.h; sourceTree = ""; }; + 03CE594742A62F026E955AE028A1CEED /* MatchedStringRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchedStringRepresentable.swift; path = Pod/Core/MatchedStringRepresentable.swift; sourceTree = ""; }; + 080A944EC5CEF73D1272EF6DA97856FE /* NativeScenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeScenario.swift; path = Pod/Native/NativeScenario.swift; sourceTree = ""; }; 125F5BB8ABD6323FE41CE693ED2F50F6 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example.debug.xcconfig"; sourceTree = ""; }; - 154868FF61699A97D66C3EC546277536 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Pod/Core/Example.swift; sourceTree = ""; }; + 1387D20472512553908AD3610728426F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 1A931BFE367A1475795A673AB8A3E494 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Pod/Core/Example.swift; sourceTree = ""; }; 1E4C429074D92B4CBC3748F4F670A195 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-dummy.m"; sourceTree = ""; }; 2178498BBFF352FAC7A5853FD99C81CC /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-frameworks.sh"; sourceTree = ""; }; - 244530C113248A71273E29120D26929A /* UnusedStepsTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UnusedStepsTracker.h; path = Pod/Core/UnusedStepsTracker.h; sourceTree = ""; }; 244D49694F43F95DD7CA19C81B7DF679 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.release.xcconfig"; sourceTree = ""; }; + 294F8F4B09FDC0152A82DB5E005D2B61 /* NativeTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeTestCase.swift; path = Pod/Native/NativeTestCase.swift; sourceTree = ""; }; 2A715DDDC12F4FA3D11F3D60B7ECA413 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.debug.xcconfig"; sourceTree = ""; }; - 2B5668CBFCE886A09005361FE438996C /* NativeScenario.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeScenario.swift; path = Pod/Native/NativeScenario.swift; sourceTree = ""; }; 2C061463250766C9C05995AB8EE63E66 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 2C44B2A9A168E3D2FFA4E7D025756B4E /* XCTest-Gherkin-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-prefix.pch"; sourceTree = ""; }; 2D0EAF53440A7D8DD0DEA2BDA39C97F1 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.modulemap"; sourceTree = ""; }; - 33DE81EE6FB41BA2549079B2E92E8461 /* PageObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageObject.swift; path = Pod/Core/PageObject.swift; sourceTree = ""; }; 343B11956F0E9864560A586000BFB2B3 /* XCTest_Gherkin.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = XCTest_Gherkin.framework; path = "XCTest-Gherkin.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3856D2CD458A5D83C29C22BB0D8F2BA4 /* XCTest-Gherkin-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-prefix.pch"; sourceTree = ""; }; 38D6652892603A73D57934F8A617D7BD /* Pods-XCTest-Gherkin_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-frameworks.sh"; sourceTree = ""; }; 3E8DA7B77652BB0715BEB8D6BB42C276 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-umbrella.h"; sourceTree = ""; }; + 4394E53E71AE65CAE4B3F216551732EF /* XCTest-Gherkin-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-umbrella.h"; sourceTree = ""; }; 463A282C0F1A22465E5514AFFF7FF32A /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-umbrella.h"; sourceTree = ""; }; - 46BFB17A0F0A2755B96FDA232789C9FE /* XCTest-Gherkin-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTest-Gherkin-dummy.m"; sourceTree = ""; }; + 46D87524386370C0D6BF93CD58762851 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 4837FA7777EC05F0F52972D7F9304275 /* XCGNativeInitializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XCGNativeInitializer.m; path = Pod/Native/XCGNativeInitializer.m; sourceTree = ""; }; + 49105070F0498D30A45FE88D28850123 /* XCTest_Gherkin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCTest_Gherkin.h; path = Pod/Native/XCTest_Gherkin.h; sourceTree = ""; }; + 4A6FDEBC2CC4EFE432370954FE3F1D05 /* gherkin-languages.json */ = {isa = PBXFileReference; includeInIndex = 1; name = "gherkin-languages.json"; path = "Pod/Native/gherkin-languages.json"; sourceTree = ""; }; 4F622AD9CDD62FD20F230045733BEB34 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.debug.xcconfig"; sourceTree = ""; }; - 50FAE5706B8E8A2BE6E148D6D9DAD2D5 /* XCTest-Gherkin-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "XCTest-Gherkin-Info.plist"; sourceTree = ""; }; - 5B4B78AD63D88F45E05BAD88B3A95EB3 /* MatchedStringRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchedStringRepresentable.swift; path = Pod/Core/MatchedStringRepresentable.swift; sourceTree = ""; }; + 5185B248F7AFDBF10C19743161198EF6 /* UnusedStepsTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UnusedStepsTracker.h; path = Pod/Core/UnusedStepsTracker.h; sourceTree = ""; }; + 575C032990D9BD294CF1CD79522292FE /* NativeExample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeExample.swift; path = Pod/Native/NativeExample.swift; sourceTree = ""; }; + 580137C27C28614EC4CD6E13D08CA766 /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Step.swift; path = Pod/Core/Step.swift; sourceTree = ""; }; + 587019597B6911C340A329F161C42396 /* Background.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Background.swift; path = Pod/Core/Background.swift; sourceTree = ""; }; 5C164DF15CA7EF1133642FE653F9D6EC /* Pods-XCTest-Gherkin_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-XCTest-Gherkin_Example-umbrella.h"; sourceTree = ""; }; - 60E3FDB928A3FEBD2B20ECA41B6AC5CF /* Background.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Background.swift; path = Pod/Core/Background.swift; sourceTree = ""; }; - 62F8923D99668A57AFD4E854ABB38D49 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 613D3FAA75F3A769D58636E7A763BF9A /* XCGNativeInitializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCGNativeInitializer.h; path = Pod/Native/XCGNativeInitializer.h; sourceTree = ""; }; + 6310EB4322B5021F003E9C4F /* NativeDataTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NativeDataTable.swift; path = Pod/Native/NativeDataTable.swift; sourceTree = ""; }; + 6310EB4522B50229003E9C4F /* DataTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DataTable.swift; path = Pod/Core/DataTable.swift; sourceTree = ""; }; + 6A019A5A6229C2D52D360505F7D722A6 /* UnusedStepsTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UnusedStepsTracker.m; path = Pod/Core/UnusedStepsTracker.m; sourceTree = ""; }; 6C8993ECC1CB4F7013DF2530DD4AF77E /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-Info.plist"; sourceTree = ""; }; - 6CDB59F45F1B332EAC5FE4A40F65033B /* Language.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Language.swift; path = Pod/Native/Language.swift; sourceTree = ""; }; - 71CC4A9186242021D7EEFA61007932E4 /* XCTest-Gherkin.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = "XCTest-Gherkin.podspec"; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 6F78CAF0CB4E3DF2190D47E9E3895E1B /* XCTest-Gherkin.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = "XCTest-Gherkin.podspec"; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 73889370CE7E9E1A38427D1B175818AE /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_Tests.framework; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 78F21F810A64661F2F73DF04E920F42E /* XCTest-Gherkin.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "XCTest-Gherkin.modulemap"; sourceTree = ""; }; + 771E9D810835CF92834D30564A396FDF /* XCTest-Gherkin-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XCTest-Gherkin-dummy.m"; sourceTree = ""; }; + 7910B4901AC8EC350A2B5D6D7A9BAEB1 /* NativeRunner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeRunner.swift; path = Pod/Native/NativeRunner.swift; sourceTree = ""; }; 7A510A02862AB570701E189E9864656F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.markdown"; sourceTree = ""; }; - 8206B1907E2F037B7B8D566E24C851A6 /* NativeRunner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeRunner.swift; path = Pod/Native/NativeRunner.swift; sourceTree = ""; }; - 82E403E4F9E3E818FE1AF9A95668FC2F /* XCGNativeInitializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = XCGNativeInitializer.m; path = Pod/Native/XCGNativeInitializer.m; sourceTree = ""; }; - 871DD8ED9925D2FB7B18FB1C34B9F76B /* XCTestCase+Gherkin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "XCTestCase+Gherkin.swift"; path = "Pod/Core/XCTestCase+Gherkin.swift"; sourceTree = ""; }; 89F85ACF3D78B39506B75103B4694B36 /* SwiftLint.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftLint.xcconfig; sourceTree = ""; }; 8B201FDC568080D015576E1D620D2225 /* Pods-XCTest-Gherkin_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example.release.xcconfig"; sourceTree = ""; }; - 8BC7A08FFCB32B24CB63455CE961B93F /* XCTest-Gherkin.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "XCTest-Gherkin.xcconfig"; sourceTree = ""; }; - 8E63B758A2389E6BB80101A200F849CC /* Step.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Step.swift; path = Pod/Core/Step.swift; sourceTree = ""; }; + 9022EBF590D7CCE34875CB4005179E47 /* XCTestCase+Gherkin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "XCTestCase+Gherkin.swift"; path = "Pod/Core/XCTestCase+Gherkin.swift"; sourceTree = ""; }; 922D90B1DC51A2203BA776482B4A9374 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests.modulemap"; sourceTree = ""; }; - 9924EB00CDF1E368068D9F88B6B5C114 /* DataTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTable.swift; path = Pod/Core/DataTable.swift; sourceTree = ""; }; 9D3595CA063040284DDAD344A7F6592F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-dummy.m"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; A007D2D9C23EF45BE9F042F8F944BFDB /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-acknowledgements.plist"; sourceTree = ""; }; A1C60225984A89EAF69588E7298B7391 /* Pods-XCTest-Gherkin_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XCTest-Gherkin_Example-acknowledgements.markdown"; sourceTree = ""; }; - A2E40063A96B412D7E8F77764C3DFDEE /* StepDefiner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepDefiner.swift; path = Pod/Core/StepDefiner.swift; sourceTree = ""; }; + A4238BC9890C0489CA1A9C8A9B84D94D /* ClassHelperMethods.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClassHelperMethods.swift; path = Pod/Core/ClassHelperMethods.swift; sourceTree = ""; }; A6F847B276819BB5C71068A3EF79FC4A /* Pods-XCTest-Gherkin_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-XCTest-Gherkin_Example.modulemap"; sourceTree = ""; }; - A72F157FFB6870643B2BAF4197CD49DE /* XCTest-Gherkin-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XCTest-Gherkin-umbrella.h"; sourceTree = ""; }; - B6174F7CA7BEFF6F61D8798113EEC950 /* gherkin-languages.json */ = {isa = PBXFileReference; includeInIndex = 1; name = "gherkin-languages.json"; path = "Pod/Native/gherkin-languages.json"; sourceTree = ""; }; - B63F217EA15203423E5A5EAFB0F01184 /* XCGNativeInitializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = XCGNativeInitializer.h; path = Pod/Native/XCGNativeInitializer.h; sourceTree = ""; }; + B38C6528E8CB6A475C1F7A9CCEBF3192 /* StepDefiner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StepDefiner.swift; path = Pod/Core/StepDefiner.swift; sourceTree = ""; }; + B897187778BE61C0237B94CFAB351909 /* StringGherkinExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringGherkinExtension.swift; path = Pod/Core/StringGherkinExtension.swift; sourceTree = ""; }; B9733393A51A72FA6856B00479F25347 /* Pods-XCTest-Gherkin_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-acknowledgements.plist"; sourceTree = ""; }; + B9CBEB85AE5155385060E67C92B493FB /* ParseState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParseState.swift; path = Pod/Native/ParseState.swift; sourceTree = ""; }; + BE892E1794340EB70513FABCF43D3B0C /* NativeFeature.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeature.swift; path = Pod/Native/NativeFeature.swift; sourceTree = ""; }; BF8D00A63FDF4E6A77C3D53BEDC2EC78 /* Pods_XCTest_Gherkin_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example.framework; path = "Pods-XCTest-Gherkin_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D75F9F225FF048939EC89F68509377 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + C2AE81503F9B7E164C1B9E7F4C62EA88 /* Language.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Language.swift; path = Pod/Native/Language.swift; sourceTree = ""; }; C588A5C9885D6065A650B45091B28547 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.release.xcconfig"; sourceTree = ""; }; - CE46FE0EDC0BEA5317BA51B161AB339B /* NativeExample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeExample.swift; path = Pod/Native/NativeExample.swift; sourceTree = ""; }; - D242C17AC22EA5C54D11E380A0D4063A /* NativeDataTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeDataTable.swift; path = Pod/Native/NativeDataTable.swift; sourceTree = ""; }; - E01164EA7ACA140A8E643F2AF1AEC4C4 /* ClassHelperMethods.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClassHelperMethods.swift; path = Pod/Core/ClassHelperMethods.swift; sourceTree = ""; }; - E67B9B69AD5ABD440239ED4675E66478 /* LevenshteinDistance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LevenshteinDistance.swift; path = Pod/Core/LevenshteinDistance.swift; sourceTree = ""; }; - E6A23B0A82A90792349EAF329FD4FFBD /* NativeFeatureParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeatureParser.swift; path = Pod/Native/NativeFeatureParser.swift; sourceTree = ""; }; + C77A2E23584AC87BF417421741716554 /* XCTest-Gherkin.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "XCTest-Gherkin.modulemap"; sourceTree = ""; }; + CC376A5FADAF684813ACCC94BF3D189D /* LevenshteinDistance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LevenshteinDistance.swift; path = Pod/Core/LevenshteinDistance.swift; sourceTree = ""; }; + D104125820129A645F7A90BD0DE1F6B8 /* XCTest-Gherkin.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "XCTest-Gherkin.xcconfig"; sourceTree = ""; }; + D40FD5A60E37A9B61BD7E7754000E59C /* XCTest-Gherkin-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "XCTest-Gherkin-Info.plist"; sourceTree = ""; }; + DA65A109413868C92FA9CF6C8BE0C3CD /* NativeFeatureParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeatureParser.swift; path = Pod/Native/NativeFeatureParser.swift; sourceTree = ""; }; + E3B30F9A4E48603BEB67C978E8EEA7B9 /* PageObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageObject.swift; path = Pod/Core/PageObject.swift; sourceTree = ""; }; E96379CF5894D2413DD62DE6BD4389F0 /* Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_XCTest_Gherkin_Example_XCTest_Gherkin_ExampleUITests.framework; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - E96B87D45C6490C367EC5A90A4334EBA /* NativeFeature.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFeature.swift; path = Pod/Native/NativeFeature.swift; sourceTree = ""; }; EC5D567508972573AA010D06DD6E808B /* Pods-XCTest-Gherkin_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XCTest-Gherkin_Example-dummy.m"; sourceTree = ""; }; - EFF23961B7C04758BBB52FEEA9AC7963 /* NativeTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeTestCase.swift; path = Pod/Native/NativeTestCase.swift; sourceTree = ""; }; F3BB96E1A9F42FE644A0258F7BA6330D /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-acknowledgements.plist"; sourceTree = ""; }; F6AC55C4FD6FE60E15A1D3F14E2D4795 /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests-frameworks.sh"; sourceTree = ""; }; FAB9D22EAFA5B4485D65DA0E974B601F /* Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests-Info.plist"; sourceTree = ""; }; @@ -179,12 +179,12 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 332FFB3655D6CEFE66177B68EAEEB26E /* Frameworks */ = { + 33BE6ADC169FBB94B0EBD9D16642DFCF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A767816705F7877D348CE2A8E1A64FFA /* Foundation.framework in Frameworks */, - BD5978AB9450FA03B4005717E19EE850 /* XCTest.framework in Frameworks */, + 63A4D4EC2E81C3AC0B6F9912FB0C49CF /* Foundation.framework in Frameworks */, + 7A27DA2C7DBFD35FA90CE1BD5F3C41A0 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -215,6 +215,38 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0175BC8EBC5B5B70EC92CDF75E09A786 /* XCTest-Gherkin */ = { + isa = PBXGroup; + children = ( + 039409000632944345ECC4CA35B4CC7E /* Core */, + 1E8A66D8817132BB7CC5FC6A0FCDFB7D /* Native */, + 5E428020DB8A3A39D15CBAF0B926C31E /* Pod */, + 54D08405032011535C77B0FFF8EF37F1 /* Support Files */, + ); + name = "XCTest-Gherkin"; + path = ../..; + sourceTree = ""; + }; + 039409000632944345ECC4CA35B4CC7E /* Core */ = { + isa = PBXGroup; + children = ( + 587019597B6911C340A329F161C42396 /* Background.swift */, + A4238BC9890C0489CA1A9C8A9B84D94D /* ClassHelperMethods.swift */, + 1A931BFE367A1475795A673AB8A3E494 /* Example.swift */, + 6310EB4522B50229003E9C4F /* DataTable.swift */, + CC376A5FADAF684813ACCC94BF3D189D /* LevenshteinDistance.swift */, + 03CE594742A62F026E955AE028A1CEED /* MatchedStringRepresentable.swift */, + E3B30F9A4E48603BEB67C978E8EEA7B9 /* PageObject.swift */, + 580137C27C28614EC4CD6E13D08CA766 /* Step.swift */, + B38C6528E8CB6A475C1F7A9CCEBF3192 /* StepDefiner.swift */, + B897187778BE61C0237B94CFAB351909 /* StringGherkinExtension.swift */, + 5185B248F7AFDBF10C19743161198EF6 /* UnusedStepsTracker.h */, + 6A019A5A6229C2D52D360505F7D722A6 /* UnusedStepsTracker.m */, + 9022EBF590D7CCE34875CB4005179E47 /* XCTestCase+Gherkin.swift */, + ); + name = Core; + sourceTree = ""; + }; 0528BAD035D6816D2184D6CD16A7FC8C /* Products */ = { isa = PBXGroup; children = ( @@ -226,30 +258,38 @@ name = Products; sourceTree = ""; }; - 0D087EFC0FEF4AC9E8A88DAEE5197C24 /* XCTest-Gherkin */ = { + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( - 9302BB1B2EBE248D9BFC21004B37BE29 /* Core */, - 9C33D70FD7404DBFFF8425B71A440071 /* Native */, - 628F87508917BAB6360BEF5ADBC52DBC /* Pod */, - B7C4355AEE3528F214CA28F3E764C79A /* Support Files */, + 3E285571EF144F8DACCF451128B351DD /* iOS */, ); - name = "XCTest-Gherkin"; - path = ../..; + name = Frameworks; sourceTree = ""; }; - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + 1E8A66D8817132BB7CC5FC6A0FCDFB7D /* Native */ = { isa = PBXGroup; children = ( - 3E285571EF144F8DACCF451128B351DD /* iOS */, + C2AE81503F9B7E164C1B9E7F4C62EA88 /* Language.swift */, + 575C032990D9BD294CF1CD79522292FE /* NativeExample.swift */, + 6310EB4322B5021F003E9C4F /* NativeDataTable.swift */, + BE892E1794340EB70513FABCF43D3B0C /* NativeFeature.swift */, + DA65A109413868C92FA9CF6C8BE0C3CD /* NativeFeatureParser.swift */, + 7910B4901AC8EC350A2B5D6D7A9BAEB1 /* NativeRunner.swift */, + 080A944EC5CEF73D1272EF6DA97856FE /* NativeScenario.swift */, + 294F8F4B09FDC0152A82DB5E005D2B61 /* NativeTestCase.swift */, + B9CBEB85AE5155385060E67C92B493FB /* ParseState.swift */, + 613D3FAA75F3A769D58636E7A763BF9A /* XCGNativeInitializer.h */, + 4837FA7777EC05F0F52972D7F9304275 /* XCGNativeInitializer.m */, + 49105070F0498D30A45FE88D28850123 /* XCTest_Gherkin.h */, + C89D4DFD67C0C0B4EEA8B7890F8C7234 /* Resources */, ); - name = Frameworks; + name = Native; sourceTree = ""; }; 2D9943624296A6950D138AE42CED6FE5 /* Development Pods */ = { isa = PBXGroup; children = ( - 0D087EFC0FEF4AC9E8A88DAEE5197C24 /* XCTest-Gherkin */, + 0175BC8EBC5B5B70EC92CDF75E09A786 /* XCTest-Gherkin */, ); name = "Development Pods"; sourceTree = ""; @@ -307,42 +347,28 @@ path = "Target Support Files/Pods-XCTest-Gherkin_Example-XCTest-Gherkin_Tests"; sourceTree = ""; }; - 628F87508917BAB6360BEF5ADBC52DBC /* Pod */ = { - isa = PBXGroup; - children = ( - 62F8923D99668A57AFD4E854ABB38D49 /* LICENSE */, - C3D75F9F225FF048939EC89F68509377 /* README.md */, - 71CC4A9186242021D7EEFA61007932E4 /* XCTest-Gherkin.podspec */, - ); - name = Pod; - sourceTree = ""; - }; - 6A4D91DE5CEEB4EEE885B8EE884EDA9C /* Resources */ = { + 54D08405032011535C77B0FFF8EF37F1 /* Support Files */ = { isa = PBXGroup; children = ( - B6174F7CA7BEFF6F61D8798113EEC950 /* gherkin-languages.json */, + C77A2E23584AC87BF417421741716554 /* XCTest-Gherkin.modulemap */, + D104125820129A645F7A90BD0DE1F6B8 /* XCTest-Gherkin.xcconfig */, + 771E9D810835CF92834D30564A396FDF /* XCTest-Gherkin-dummy.m */, + D40FD5A60E37A9B61BD7E7754000E59C /* XCTest-Gherkin-Info.plist */, + 3856D2CD458A5D83C29C22BB0D8F2BA4 /* XCTest-Gherkin-prefix.pch */, + 4394E53E71AE65CAE4B3F216551732EF /* XCTest-Gherkin-umbrella.h */, ); - name = Resources; + name = "Support Files"; + path = "Example/Pods/Target Support Files/XCTest-Gherkin"; sourceTree = ""; }; - 9302BB1B2EBE248D9BFC21004B37BE29 /* Core */ = { + 5E428020DB8A3A39D15CBAF0B926C31E /* Pod */ = { isa = PBXGroup; children = ( - 60E3FDB928A3FEBD2B20ECA41B6AC5CF /* Background.swift */, - E01164EA7ACA140A8E643F2AF1AEC4C4 /* ClassHelperMethods.swift */, - 9924EB00CDF1E368068D9F88B6B5C114 /* DataTable.swift */, - 154868FF61699A97D66C3EC546277536 /* Example.swift */, - E67B9B69AD5ABD440239ED4675E66478 /* LevenshteinDistance.swift */, - 5B4B78AD63D88F45E05BAD88B3A95EB3 /* MatchedStringRepresentable.swift */, - 33DE81EE6FB41BA2549079B2E92E8461 /* PageObject.swift */, - 8E63B758A2389E6BB80101A200F849CC /* Step.swift */, - A2E40063A96B412D7E8F77764C3DFDEE /* StepDefiner.swift */, - 018E424D4BA0E5CDDFC3EA31BFE8FBE8 /* StringGherkinExtension.swift */, - 244530C113248A71273E29120D26929A /* UnusedStepsTracker.h */, - 0174ABF0F1719DF797263BC7966672ED /* UnusedStepsTracker.m */, - 871DD8ED9925D2FB7B18FB1C34B9F76B /* XCTestCase+Gherkin.swift */, + 46D87524386370C0D6BF93CD58762851 /* LICENSE */, + 1387D20472512553908AD3610728426F /* README.md */, + 6F78CAF0CB4E3DF2190D47E9E3895E1B /* XCTest-Gherkin.podspec */, ); - name = Core; + name = Pod; sourceTree = ""; }; 965877409E01FB3D85D85E90E6B30185 /* Pods */ = { @@ -362,26 +388,6 @@ path = SwiftLint; sourceTree = ""; }; - 9C33D70FD7404DBFFF8425B71A440071 /* Native */ = { - isa = PBXGroup; - children = ( - 6CDB59F45F1B332EAC5FE4A40F65033B /* Language.swift */, - D242C17AC22EA5C54D11E380A0D4063A /* NativeDataTable.swift */, - CE46FE0EDC0BEA5317BA51B161AB339B /* NativeExample.swift */, - E96B87D45C6490C367EC5A90A4334EBA /* NativeFeature.swift */, - E6A23B0A82A90792349EAF329FD4FFBD /* NativeFeatureParser.swift */, - 8206B1907E2F037B7B8D566E24C851A6 /* NativeRunner.swift */, - 2B5668CBFCE886A09005361FE438996C /* NativeScenario.swift */, - EFF23961B7C04758BBB52FEEA9AC7963 /* NativeTestCase.swift */, - 0B5FD2D876F8D7D597F9D7ACCC45EC34 /* ParseState.swift */, - B63F217EA15203423E5A5EAFB0F01184 /* XCGNativeInitializer.h */, - 82E403E4F9E3E818FE1AF9A95668FC2F /* XCGNativeInitializer.m */, - 1110B012E8FFF79DE2CB7BDB7F32EB87 /* XCTest_Gherkin.h */, - 6A4D91DE5CEEB4EEE885B8EE884EDA9C /* Resources */, - ); - name = Native; - sourceTree = ""; - }; A55B1D39BD117AF1843CE946B48A4C81 /* Pods-XCTest-Gherkin_Example */ = { isa = PBXGroup; children = ( @@ -399,18 +405,12 @@ path = "Target Support Files/Pods-XCTest-Gherkin_Example"; sourceTree = ""; }; - B7C4355AEE3528F214CA28F3E764C79A /* Support Files */ = { + C89D4DFD67C0C0B4EEA8B7890F8C7234 /* Resources */ = { isa = PBXGroup; children = ( - 78F21F810A64661F2F73DF04E920F42E /* XCTest-Gherkin.modulemap */, - 8BC7A08FFCB32B24CB63455CE961B93F /* XCTest-Gherkin.xcconfig */, - 46BFB17A0F0A2755B96FDA232789C9FE /* XCTest-Gherkin-dummy.m */, - 50FAE5706B8E8A2BE6E148D6D9DAD2D5 /* XCTest-Gherkin-Info.plist */, - 2C44B2A9A168E3D2FFA4E7D025756B4E /* XCTest-Gherkin-prefix.pch */, - A72F157FFB6870643B2BAF4197CD49DE /* XCTest-Gherkin-umbrella.h */, + 4A6FDEBC2CC4EFE432370954FE3F1D05 /* gherkin-languages.json */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/XCTest-Gherkin"; + name = Resources; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { @@ -461,14 +461,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F3723E299DA01D4EF7185D4F5DA30BF1 /* Headers */ = { + E982EDA1737C75F30CBF8CFAC12FF2C9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D0B4E0E1990AACD62F27B5F07F65BE69 /* UnusedStepsTracker.h in Headers */, - 734B73B04C83F6F88F95B5C6ED677A83 /* XCGNativeInitializer.h in Headers */, - 2F39F029AAA3335819777FEB715A89C2 /* XCTest-Gherkin-umbrella.h in Headers */, - AEEBC391C54F1C563ED6514CDF8BA3FB /* XCTest_Gherkin.h in Headers */, + 8210CE883DAF84FEAB6497C6F58C0CA2 /* UnusedStepsTracker.h in Headers */, + 3AFE600DF775CE27BFD1038F65830A8C /* XCGNativeInitializer.h in Headers */, + A2AC8EA28B682B2C562117E40C9C47F0 /* XCTest-Gherkin-umbrella.h in Headers */, + 203C3E3EFC893673731EDE7A47C7B259 /* XCTest_Gherkin.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -537,12 +537,12 @@ }; F199D15C201B9F6258649341FC74CE0C /* XCTest-Gherkin */ = { isa = PBXNativeTarget; - buildConfigurationList = 6A7C52A1079E1131B9696494C5A17100 /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */; + buildConfigurationList = 3473D262595CE3583DCFCBA1B7490408 /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */; buildPhases = ( - F3723E299DA01D4EF7185D4F5DA30BF1 /* Headers */, - E435754A7F830DC5FA35C9DBDCB1D2E1 /* Sources */, - 332FFB3655D6CEFE66177B68EAEEB26E /* Frameworks */, - 0221168FB2C89DD34713A3C88000803C /* Resources */, + E982EDA1737C75F30CBF8CFAC12FF2C9 /* Headers */, + D696E7917E631421BDF8505E3FC331F0 /* Sources */, + 33BE6ADC169FBB94B0EBD9D16642DFCF /* Frameworks */, + DA3AB3D386FC4A3EB2D224A35BDEDFF1 /* Resources */, ); buildRules = ( ); @@ -584,32 +584,32 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 0221168FB2C89DD34713A3C88000803C /* Resources */ = { + 4EE8585653036DEDCB1BC1BB8BF66C62 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E027BA1571B57B9436888119EF933F9C /* gherkin-languages.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4EE8585653036DEDCB1BC1BB8BF66C62 /* Resources */ = { + 5D63B14554012F1D925730257E9E92AD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 5D63B14554012F1D925730257E9E92AD /* Resources */ = { + C4D87EFF074D6BFE6D74B42F062613B6 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - C4D87EFF074D6BFE6D74B42F062613B6 /* Resources */ = { + DA3AB3D386FC4A3EB2D224A35BDEDFF1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + EFC87BAF516F4B4B840BD4DF10EC0596 /* gherkin-languages.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -632,41 +632,41 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E257FA8BD9919E6054F0FE8C408B10AD /* Sources */ = { + D696E7917E631421BDF8505E3FC331F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0207E4323AD68B2444CCEB8F9F2545A1 /* Pods-XCTest-Gherkin_Example-dummy.m in Sources */, + C23A37D3EF7DE9293E41F71AADA5AEF3 /* Background.swift in Sources */, + D800407E310BA29E037B62442B779B47 /* ClassHelperMethods.swift in Sources */, + 95B802F947431FF622D6F3F240EC3A4C /* Example.swift in Sources */, + D3377C0C63C7447756BD2D0E557CC060 /* Language.swift in Sources */, + F31E80D9E59C268C916EF31EB2ECCDF5 /* LevenshteinDistance.swift in Sources */, + D82E39679FB22F2A3F7D98249FD5464D /* MatchedStringRepresentable.swift in Sources */, + 0256218128D2B06458F9595AC2C6E53B /* NativeExample.swift in Sources */, + 9789CCD7D38E2977E322C5BA6E276823 /* NativeFeature.swift in Sources */, + A78DA6B4DEDFC6FBAF7F02B8C2F251C2 /* NativeFeatureParser.swift in Sources */, + 65DA43C4E99916AAFC7721F639DCA19A /* NativeRunner.swift in Sources */, + 6B15018CFA0A19AFD2B971ECE9B6DABD /* NativeScenario.swift in Sources */, + 07A72B799536470FE9A9F109CCD27312 /* NativeTestCase.swift in Sources */, + 3D65C3F1226794B0A0E05F7F3B624DAC /* PageObject.swift in Sources */, + 6310EB4422B5021F003E9C4F /* NativeDataTable.swift in Sources */, + 0DC4D7E4A5848701D03313269FF2CB33 /* ParseState.swift in Sources */, + F1B6E151B7394D8F00FA135FFF11C5BF /* Step.swift in Sources */, + B75F90135C50BE5D613CFF7D700BB6CF /* StepDefiner.swift in Sources */, + 357E63DD6985EB2790E8C610DD251881 /* StringGherkinExtension.swift in Sources */, + 6310EB4622B50229003E9C4F /* DataTable.swift in Sources */, + 5F4EA5BFFCF3A7E1573A093700F861BF /* UnusedStepsTracker.m in Sources */, + 21E56923BF3AE784E46EFDCAE7CF5CE4 /* XCGNativeInitializer.m in Sources */, + 8C60BAEF186803B8DECE0354C4171A6E /* XCTest-Gherkin-dummy.m in Sources */, + 57016AD8FF80351FA2CD5F47C2E84B4B /* XCTestCase+Gherkin.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E435754A7F830DC5FA35C9DBDCB1D2E1 /* Sources */ = { + E257FA8BD9919E6054F0FE8C408B10AD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 19BE9B56041DE30FF5E36C72AEBA4A2F /* Background.swift in Sources */, - F3B12DF743A57AD7673BE571AB8D26B4 /* ClassHelperMethods.swift in Sources */, - 328D1D3EC6B16B75D2696DE2013C512D /* DataTable.swift in Sources */, - 1ACC008BBF006788004E3A2C92530C21 /* Example.swift in Sources */, - DF2E3951DF91247F0516C2B24D65A838 /* Language.swift in Sources */, - 20E81359614C269B4549374BB3B74C59 /* LevenshteinDistance.swift in Sources */, - 34BAE5570E1D2B47AB97385D6DB4E2F3 /* MatchedStringRepresentable.swift in Sources */, - F97873320657D631880AF0A466ED4948 /* NativeDataTable.swift in Sources */, - CC9B95BC33D50724B9189DFED6A118D5 /* NativeExample.swift in Sources */, - E5C8245B0867B5F03C34DD228032FFB6 /* NativeFeature.swift in Sources */, - 91EABA3BA4F1CFB0A6177481CC4D9F16 /* NativeFeatureParser.swift in Sources */, - D608C199BB481F483417E446CBC9D118 /* NativeRunner.swift in Sources */, - 0C86590892DB6AA5B2B3E941ABF4CDB7 /* NativeScenario.swift in Sources */, - 2E44FFB415ECDED3166FD5E53958E0DF /* NativeTestCase.swift in Sources */, - 1FA776438190AAF31EF3F737656002A6 /* PageObject.swift in Sources */, - 981394A2991F19E2F83AC47080C6FF38 /* ParseState.swift in Sources */, - F32D65F4839A7506D4F0418F8E8BB482 /* Step.swift in Sources */, - 7CEA0864DA0594ED736AED40BD56F4F2 /* StepDefiner.swift in Sources */, - 29612A4A52F85D45CBC904D2309A591E /* StringGherkinExtension.swift in Sources */, - 5D9ADD73938168ACDF5FE31217190E74 /* UnusedStepsTracker.m in Sources */, - CA73B93B5A34AAF9A576C1C05A7AD2FB /* XCGNativeInitializer.m in Sources */, - 278809491FB36D6329348B65689E0EE2 /* XCTest-Gherkin-dummy.m in Sources */, - FE62D421C88862D5E682ED7D1FD1BF71 /* XCTestCase+Gherkin.swift in Sources */, + 0207E4323AD68B2444CCEB8F9F2545A1 /* Pods-XCTest-Gherkin_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -745,9 +745,9 @@ }; name = Debug; }; - 17A56AA77473C15F575606554F2E4598 /* Release */ = { + 3760F13ED54C1B0A138D36E0F2D396CE /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8BC7A08FFCB32B24CB63455CE961B93F /* XCTest-Gherkin.xcconfig */; + baseConfigurationReference = D104125820129A645F7A90BD0DE1F6B8 /* XCTest-Gherkin.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1050,11 +1050,10 @@ }; name = Release; }; - B7ACB584F2C87151BD3703BD79A0BFC0 /* Debug */ = { + B619CC59BCD5C33EE0C1D0E3B21A2911 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 125F5BB8ABD6323FE41CE693ED2F50F6 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */; + baseConfigurationReference = D104125820129A645F7A90BD0DE1F6B8 /* XCTest-Gherkin.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1064,29 +1063,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin.modulemap"; + PRODUCT_MODULE_NAME = XCTest_Gherkin; + PRODUCT_NAME = XCTest_Gherkin; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - D62D640745EE8A65983791D293B17C02 /* Debug */ = { + B7ACB584F2C87151BD3703BD79A0BFC0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8BC7A08FFCB32B24CB63455CE961B93F /* XCTest-Gherkin.xcconfig */; + baseConfigurationReference = 125F5BB8ABD6323FE41CE693ED2F50F6 /* Pods-XCTest-Gherkin_Example.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1096,18 +1095,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/XCTest-Gherkin/XCTest-Gherkin.modulemap"; - PRODUCT_MODULE_NAME = XCTest_Gherkin; - PRODUCT_NAME = XCTest_Gherkin; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-XCTest-Gherkin_Example/Pods-XCTest-Gherkin_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1130,29 +1130,29 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 3473D262595CE3583DCFCBA1B7490408 /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7E1F3D358966F24610AD782F313B4C40 /* Debug */, - 60A7F9B4A8E92A5B16CC2AA887D9FE07 /* Release */, + B619CC59BCD5C33EE0C1D0E3B21A2911 /* Debug */, + 3760F13ED54C1B0A138D36E0F2D396CE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 67657DCAA9593CFF02797CAC629F8799 /* Build configuration list for PBXNativeTarget "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1428CEA95AAF255B2FBD96CE19ED21A0 /* Debug */, - 53A0F62BAD790CF53FD4D0F6B1963079 /* Release */, + 7E1F3D358966F24610AD782F313B4C40 /* Debug */, + 60A7F9B4A8E92A5B16CC2AA887D9FE07 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6A7C52A1079E1131B9696494C5A17100 /* Build configuration list for PBXNativeTarget "XCTest-Gherkin" */ = { + 67657DCAA9593CFF02797CAC629F8799 /* Build configuration list for PBXNativeTarget "Pods-XCTest-Gherkin_Example-XCTest-Gherkin_ExampleUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - D62D640745EE8A65983791D293B17C02 /* Debug */, - 17A56AA77473C15F575606554F2E4598 /* Release */, + 1428CEA95AAF255B2FBD96CE19ED21A0 /* Debug */, + 53A0F62BAD790CF53FD4D0F6B1963079 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; From 9d01bfaaa64fb57dfb1719b7febf0aaff8f7718e Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Sat, 15 Jun 2019 22:03:15 +0100 Subject: [PATCH 6/7] updated readme --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 8f0b54c..f626c37 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,35 @@ func testOutlineTests() { } ``` +### Data tables + +Data tables are used for passing collections of values to the steps. Unlike examples data tables do not result in running steps multiple times. Instead all the data in the data table is passed into the step as a single parameter and the step is run only once. Data tables can be defined with arrays or dictionaries: + +```swift +Given("I use the following names:") { + ["Alice", "Bob"] +} + +step("I use the following names: (.+)") { (match: DataTable<[String]>) in + // match.values[0] == "Alice" + // match.values[1] == "Bob" +} + +Given("I register as the following users:") { + [ + "Alice": Person(name: "Alice", age: 27, height: 170), + "Bob": Person(name: "Bob", age: 27, height: 170) + ] +} + +step("I register as the following users: (.+)") { (match: DataTable<[String: Person]>) in + // match.values["Alice"]?.name == "Alice" + // match.values["Bob"]?.name == "Bob" +} +``` + +In the step + ### Background If you are repeating the same steps in each scenario you can move them to a `Background`. A `Background` is run before each scenario (effectively just before first scenario step is execuated) or outline pass (but **after** `setUp()`). You can have as many steps in `Background` as you want. From d25768cef0361f4ec61ab51e7fa099a52d61b8bc Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Sat, 15 Jun 2019 23:11:12 +0100 Subject: [PATCH 7/7] improved docs about native data tables --- .../Tests/StepDefinitions/SanitySteps.swift | 8 +- Pod/Core/DataTable.swift | 14 +++ Pod/Native/NativeDataTable.swift | 108 +++++++++++++----- README.md | 3 +- 4 files changed, 97 insertions(+), 36 deletions(-) diff --git a/Example/Tests/StepDefinitions/SanitySteps.swift b/Example/Tests/StepDefinitions/SanitySteps.swift index 2151bc6..e865a75 100644 --- a/Example/Tests/StepDefinitions/SanitySteps.swift +++ b/Example/Tests/StepDefinitions/SanitySteps.swift @@ -234,10 +234,10 @@ final class SanitySteps: StepDefiner { XCTAssertEqual( match.values, [ - "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], - "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], - "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], - "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] + "KMSY": [ "lat": 29.993333, "lon": -90.258056 ], + "KSFO": [ "lat": 37.618889, "lon": -122.375000 ], + "KSEA": [ "lat": 47.448889, "lon": -122.309444 ], + "KJFK": [ "lat": 40.639722, "lon": -73.778889 ] ] ) } diff --git a/Pod/Core/DataTable.swift b/Pod/Core/DataTable.swift index cbe7e03..191769e 100644 --- a/Pod/Core/DataTable.swift +++ b/Pod/Core/DataTable.swift @@ -7,6 +7,20 @@ import Foundation +/** + Use DataTable as the type of the step parameter to be able to pass collection of values to the step. + + Example: + ``` + Given("I use the following names:") { + ["Alice", "Bob"] + } + + step("I use the following names: (.+)") { (match: DataTable<[String]>) in + ... + } + ``` + */ public struct DataTable: CodableMatchedStringRepresentable where T: Codable { public let values: T diff --git a/Pod/Native/NativeDataTable.swift b/Pod/Native/NativeDataTable.swift index 7f93418..3f3ab94 100644 --- a/Pod/Native/NativeDataTable.swift +++ b/Pod/Native/NativeDataTable.swift @@ -60,13 +60,19 @@ extension StepDefiner { extension StepDefiner { /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | 1 | | 2 | | 3 | - - Result: + ``` + + Values passed to the step: + ``` [1, 2, 3] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [T] in @@ -84,13 +90,19 @@ extension StepDefiner { } /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | 1 | 4 | | 2 | 5 | | 3 | 6 | + ``` - Result: + Values passed to the step: + ``` [[1, 4], [2, 5], [3, 6]] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[T]]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[T]] in @@ -106,18 +118,24 @@ extension StepDefiner { } /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | firstName | lastName | birthDate | | Annie M. G. | Schmidt | 1911-03-20 | | Roald | Dahl | 1916-09-13 | | Astrid | Lindgren | 1907-11-14 | + ``` - Result: + Values passed to the step: + ``` [ [ "firstName": "Annie M.G", "lastName": "Schmidt", "birthDate": "1911-03-20" ], [ "firstName": "Roald", "lastName": "Dahl", "birthDate": "1916-09-13" ], [ "firstName": "Astrid", "lastName": "Lindgren", "birthDate": "1907-11-14" ] ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[[String: T]]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [[String: T]] in @@ -137,19 +155,25 @@ extension StepDefiner { } /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | KMSY | Louis Armstrong New Orleans International Airport | | KSFO | San Francisco International Airport | | KSEA | Seattle–Tacoma International Airport | | KJFK | John F. Kennedy International Airport | + ``` - Result: + Values passed to the step: + ``` [ "KMSY": "Louis Armstrong New Orleans International Airport", "KSFO": "San Francisco International Airport", "KSEA": "Seattle–Tacoma International Airport", "KJFK": "John F. Kennedy International Airport" ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: T]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: T] in @@ -167,19 +191,25 @@ extension StepDefiner { } /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | KMSY | 29.993333 | -90.258056 | | KSFO | 37.618889 | -122.375000 | | KSEA | 47.448889 | -122.309444 | | KJFK | 40.639722 | -73.778889 | + ``` - Result: + Values passed to the step: + ``` [ - "KMSY": ["29.993333", "-90.258056"], - "KSFO": ["37.618889", "-122.375000"], - "KSEA": ["47.448889", "-122.309444"], - "KJFK": ["40.639722", "-73.778889"] + "KMSY": [29.993333, -90.258056], + "KSFO": [37.618889, -122.375000], + "KSEA": [47.448889, -122.309444], + "KJFK": [40.639722, -73.778889] ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [T]]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: [T]] in @@ -195,20 +225,26 @@ extension StepDefiner { } /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | | lat | lon | | KMSY | 29.993333 | -90.258056 | | KSFO | 37.618889 | -122.375000 | | KSEA | 47.448889 | -122.309444 | | KJFK | 40.639722 | -73.778889 | + ``` - Result: + Values passed to the step: + ``` [ - "KMSY": [ "lat": "29.993333", "lon": "-90.258056" ], - "KSFO": [ "lat": "37.618889", "lon": "-122.375000" ], - "KSEA": [ "lat": "47.448889", "lon": "-122.309444" ], - "KJFK": [ "lat": "40.639722", "lon": "-73.778889" ] + "KMSY": [ "lat": 29.993333, "lon": -90.258056 ], + "KSFO": [ "lat": 37.618889, "lon": -122.375000 ], + "KSEA": [ "lat": 47.448889, "lon": -122.309444 ], + "KJFK": [ "lat": 40.639722, "lon": -73.778889 ] ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[String: [String: T]]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [String: [String: T]] in @@ -227,18 +263,25 @@ extension StepDefiner { } // TODO: implement custom decoder that will decode string cell values to expected types instead of failing - // This currently only works if all properties are strings /** - Input: + Step that parses data table + + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | name | age | height | | Alice | 20 | 170 | | Bob | 21 | 171 | - - Output: + ``` + + Values passed to the step: + ``` [ - Person(name: "Alice", age: 20, height: 170), - Person(name: "Bob", age: 21, height: 171) + Person(name: "Alice", age: "20", height: 170), + Person(name: "Bob", age: "21", height: 171) ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[T]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [T] in @@ -257,18 +300,23 @@ extension StepDefiner { } // TODO: implement custom decoder that will decode string cell values to expected types instead of failing - // This currently only works if all properties are strings /** - Input: + Define the step that accepts a data table as a single parameter. + + Input from the feature file: + ``` | | name | age | height | | 1 | Alice | 20 | 170 | | 2 | Bob | 21 | 171 | + ``` - Output: + Values passed to the step: + ``` [ 1: Person(name: "Alice", age: 20, height: 170), 2: Person(name: "Bob", age: 21, height: 171) ] + ``` */ open func step(_ expression: String, file: String = #file, line: Int = #line, f1: @escaping (NativeDataTable<[U: T]>)->()) { self.step(expression, file: file, line: line, f1: f1) { (values: [[String]]) throws -> [U: T] in diff --git a/README.md b/README.md index f626c37..b9a759c 100644 --- a/README.md +++ b/README.md @@ -204,8 +204,6 @@ step("I register as the following users: (.+)") { (match: DataTable<[String: Per } ``` -In the step - ### Background If you are repeating the same steps in each scenario you can move them to a `Background`. A `Background` is run before each scenario (effectively just before first scenario step is execuated) or outline pass (but **after** `setUp()`). You can have as many steps in `Background` as you want. @@ -350,6 +348,7 @@ There is an example of this in the Example/ project as part of this pod. Look at The advantages of this are obvious; you get to quickly run your existing feature files and can get up and running quickly. The disadvanages are beacuse the tests are generated at runtime they can't be run individually from inside Xcode so debugging is tricker. I would use this to start testing inside Xcode but if it gets hairy, convert that feature file into a native Swift test and debug from there. +Note: when working with native feature files with data tables steps should use `NativeDataTable` type instead of `DataTable`. See [native_data_table.feature](Example/Tests/Features/NativeFeatures/native_data_table.feature) for examples of data table formats that you can use in the feature files. ### Localisation of feature files