diff --git a/README.md b/README.md index c332cedd..628d700e 100644 --- a/README.md +++ b/README.md @@ -207,6 +207,14 @@ Starting with [version 0.5](https://github.com/MaxDesiatov/XMLCoder/releases/tag you can now set a property `trimValueWhitespaces` to `false` (the default value is `true`) on `XMLDecoder` instance to preserve all whitespaces in decoded strings. +### Choice element coding + +Starting with [version 0.8](https://github.com/MaxDesiatov/XMLCoder/releases/tag/0.8.0), you +now encode and decode union-type–like enums with associated values by conforming your +`CodingKey` type additionally to `XMLChoiceCodingKey`. + +For more information, see the [pull request](https://github.com/MaxDesiatov/XMLCoder/pull/119). + ## Installation ### Requirements diff --git a/Sources/XMLCoder/Auxiliaries/Box/ChoiceBox.swift b/Sources/XMLCoder/Auxiliaries/Box/ChoiceBox.swift new file mode 100644 index 00000000..ad2b6835 --- /dev/null +++ b/Sources/XMLCoder/Auxiliaries/Box/ChoiceBox.swift @@ -0,0 +1,40 @@ +// +// ChoiceBox.swift +// XMLCoder +// +// Created by James Bean on 7/18/19. +// + +/// A `Box` which represents an element which is known to contain an XML choice element. +struct ChoiceBox { + var key: String = "" + var element: Box = NullBox() +} + +extension ChoiceBox: Box { + var isNull: Bool { + return false + } + + func xmlString() -> String? { + return nil + } +} + +extension ChoiceBox: SimpleBox {} + +extension ChoiceBox { + init?(_ keyedBox: KeyedBox) { + guard + let firstKey = keyedBox.elements.keys.first, + let firstElement = keyedBox.elements[firstKey].first + else { + return nil + } + self.init(key: firstKey, element: firstElement) + } + + init(_ singleKeyedBox: SingleKeyedBox) { + self.init(key: singleKeyedBox.key, element: singleKeyedBox.element) + } +} diff --git a/Sources/XMLCoder/Auxiliaries/Box/SingleKeyedBox.swift b/Sources/XMLCoder/Auxiliaries/Box/SingleKeyedBox.swift new file mode 100644 index 00000000..42f0cbb5 --- /dev/null +++ b/Sources/XMLCoder/Auxiliaries/Box/SingleKeyedBox.swift @@ -0,0 +1,24 @@ +// +// SingleKeyedBox.swift +// XMLCoder +// +// Created by James Bean on 7/15/19. +// + +/// A `Box` which contains a single `key` and `element` pair. This is useful for disambiguating elements which could either represent +/// an element nested in a keyed or unkeyed container, or an choice between multiple known-typed values (implemented in Swift using +/// enums with associated values). +struct SingleKeyedBox: SimpleBox { + var key: String + var element: Box +} + +extension SingleKeyedBox: Box { + var isNull: Bool { + return false + } + + func xmlString() -> String? { + return nil + } +} diff --git a/Sources/XMLCoder/Auxiliaries/XMLChoiceCodingKey.swift b/Sources/XMLCoder/Auxiliaries/XMLChoiceCodingKey.swift new file mode 100644 index 00000000..5b5e8f92 --- /dev/null +++ b/Sources/XMLCoder/Auxiliaries/XMLChoiceCodingKey.swift @@ -0,0 +1,58 @@ +// +// XMLChoiceCodingKey.swift +// XMLCoder +// +// Created by Benjamin Wetherfield on 7/17/19. +// + +/// An empty marker protocol that can be used in place of `CodingKey`. It must be used when +/// attempting to encode and decode union-type–like enums with associated values to and from `XML` +/// choice elements. +/// +/// - Important: In order for your `XML`-destined `Codable` type to be encoded and/or decoded +/// properly, you must conform your custom `CodingKey` type additionally to `XMLChoiceCodingKey`. +/// +/// For example, say you have defined a type which can hold _either_ an `Int` _or_ a `String`: +/// +/// enum IntOrString { +/// case int(Int) +/// case string(String) +/// } +/// +/// Implementing the requirements for the `Codable` protocol like this: +/// +/// extension IntOrString: Codable { +/// enum CodingKeys: String, XMLChoiceCodingKey { +/// case int +/// case string +/// } +/// +/// func encode(to encoder: Encoder) throws { +/// var container = encoder.container(keyedBy: CodingKeys.self) +/// switch self { +/// case let .int(value): +/// try container.encode(value, forKey: .int) +/// case let .string(value): +/// try container.encode(value, forKey: .string) +/// } +/// } +/// +/// init(from decoder: Decoder) throws { +/// let container = try decoder.container(keyedBy: CodingKeys.self) +/// do { +/// self = .int(try container.decode(Int.self, forKey: .int)) +/// } catch { +/// self = .string(try container.decode(String.self, forKey: .string)) +/// } +/// } +/// } +/// +/// Retroactively conform the `CodingKeys` enum to `XMLChoiceCodingKey` when targeting `XML` as your +/// encoded format. +/// +/// extension IntOrString.CodingKeys: XMLChoiceCodingKey {} +/// +/// - Note: The `XMLChoiceCodingKey` marker protocol allows the `XMLEncoder` / `XMLDecoder` to +/// resolve ambiguities particular to the `XML` format between nested unkeyed container elements and +/// choice elements. +public protocol XMLChoiceCodingKey: CodingKey {} diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index acc800a8..25f862f7 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -63,9 +63,7 @@ struct XMLCoderElement: Equatable { if elements.isEmpty, let value = value { elements.append(StringBox(value), at: "value") } - let keyedBox = KeyedBox(elements: elements, attributes: attributes) - - return keyedBox + return KeyedBox(elements: elements, attributes: attributes) } func toXMLString(with header: XMLHeader? = nil, @@ -245,9 +243,17 @@ struct XMLCoderElement: Equatable { extension XMLCoderElement { init(key: String, box: UnkeyedBox) { - self.init(key: key, elements: box.map { - XMLCoderElement(key: key, box: $0) - }) + if let containsChoice = box as? [ChoiceBox] { + self.init(key: key, elements: containsChoice.map { + XMLCoderElement(key: $0.key, box: $0.element) + }) + } else { + self.init(key: key, elements: box.map { XMLCoderElement(key: key, box: $0) }) + } + } + + init(key: String, box: ChoiceBox) { + self.init(key: key, elements: [XMLCoderElement(key: box.key, box: box.element)]) } init(key: String, box: KeyedBox) { @@ -302,10 +308,14 @@ extension XMLCoderElement { self.init(key: key, box: sharedUnkeyedBox.unboxed) case let sharedKeyedBox as SharedBox: self.init(key: key, box: sharedKeyedBox.unboxed) + case let sharedChoiceBox as SharedBox: + self.init(key: key, box: sharedChoiceBox.unboxed) case let unkeyedBox as UnkeyedBox: self.init(key: key, box: unkeyedBox) case let keyedBox as KeyedBox: self.init(key: key, box: keyedBox) + case let choiceBox as ChoiceBox: + self.init(key: key, box: choiceBox) case let simpleBox as SimpleBox: self.init(key: key, box: simpleBox) case let box: diff --git a/Sources/XMLCoder/Decoder/XMLChoiceDecodingContainer.swift b/Sources/XMLCoder/Decoder/XMLChoiceDecodingContainer.swift new file mode 100644 index 00000000..fc356e4d --- /dev/null +++ b/Sources/XMLCoder/Decoder/XMLChoiceDecodingContainer.swift @@ -0,0 +1,91 @@ +// +// XMLChoiceDecodingContainer.swift +// XMLCoder +// +// Created by James Bean on 7/18/19. +// + +/// Container specialized for decoding XML choice elements. +struct XMLChoiceDecodingContainer: KeyedDecodingContainerProtocol { + typealias Key = K + + // MARK: Properties + + /// A reference to the decoder we're reading from. + private let decoder: XMLDecoderImplementation + + /// A reference to the container we're reading from. + private let container: SharedBox + + /// The path of coding keys taken to get to this point in decoding. + public private(set) var codingPath: [CodingKey] + + // MARK: - Initialization + + /// Initializes `self` by referencing the given decoder and container. + init(referencing decoder: XMLDecoderImplementation, wrapping container: SharedBox) { + self.decoder = decoder + container.withShared { $0.key = decoder.keyTransform($0.key) } + self.container = container + codingPath = decoder.codingPath + } + + // MARK: - KeyedDecodingContainerProtocol Methods + + public var allKeys: [Key] { + return container.withShared { [Key(stringValue: $0.key)!] } + } + + public func contains(_ key: Key) -> Bool { + return container.withShared { $0.key == key.stringValue } + } + + public func decodeNil(forKey key: Key) throws -> Bool { + return container.withShared { $0.element.isNull } + } + + public func decode(_ type: T.Type, forKey key: Key) throws -> T { + guard container.withShared({ $0.key == key.stringValue }), key is XMLChoiceCodingKey else { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: type, + reality: container + ) + } + return try decoder.unbox(container.withShared { $0.element }) + } + + public func nestedContainer( + keyedBy _: NestedKey.Type, forKey key: Key + ) throws -> KeyedDecodingContainer { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: NestedKey.self, + reality: container + ) + } + + public func nestedUnkeyedContainer(forKey key: Key) throws -> UnkeyedDecodingContainer { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: Key.self, + reality: container + ) + } + + public func superDecoder() throws -> Decoder { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: Key.self, + reality: container + ) + } + + public func superDecoder(forKey key: Key) throws -> Decoder { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: Key.self, + reality: container + ) + } +} diff --git a/Sources/XMLCoder/Decoder/XMLDecoderImplementation.swift b/Sources/XMLCoder/Decoder/XMLDecoderImplementation.swift index fe237eba..f3ae46f3 100644 --- a/Sources/XMLCoder/Decoder/XMLDecoderImplementation.swift +++ b/Sources/XMLCoder/Decoder/XMLDecoderImplementation.swift @@ -70,9 +70,15 @@ class XMLDecoderImplementation: Decoder { return topContainer } - public func container( - keyedBy keyType: Key.Type - ) throws -> KeyedDecodingContainer { + public func container(keyedBy keyType: Key.Type) throws -> KeyedDecodingContainer { + if Key.self is XMLChoiceCodingKey.Type { + return try choiceContainer(keyedBy: keyType) + } else { + return try keyedContainer(keyedBy: keyType) + } + } + + public func keyedContainer(keyedBy _: Key.Type) throws -> KeyedDecodingContainer { let topContainer = try self.topContainer() switch topContainer { @@ -118,6 +124,34 @@ class XMLDecoderImplementation: Decoder { } } + /// - Returns: A `KeyedDecodingContainer` for an XML choice element. + public func choiceContainer(keyedBy _: Key.Type) throws -> KeyedDecodingContainer { + let topContainer = try self.topContainer() + let choiceBox: ChoiceBox? + switch topContainer { + case let choice as ChoiceBox: + choiceBox = choice + case let singleKeyed as SingleKeyedBox: + choiceBox = ChoiceBox(singleKeyed) + case let keyed as SharedBox: + choiceBox = ChoiceBox(keyed.withShared { $0 }) + default: + choiceBox = nil + } + guard let box = choiceBox else { + throw DecodingError.typeMismatch( + at: codingPath, + expectation: [String: Any].self, + reality: topContainer + ) + } + let container = XMLChoiceDecodingContainer( + referencing: self, + wrapping: SharedBox(box) + ) + return KeyedDecodingContainer(container) + } + public func unkeyedContainer() throws -> UnkeyedDecodingContainer { let topContainer = try self.topContainer() @@ -138,9 +172,10 @@ class XMLDecoderImplementation: Decoder { case let unkeyed as SharedBox: return XMLUnkeyedDecodingContainer(referencing: self, wrapping: unkeyed) case let keyed as SharedBox: - guard let firstKey = keyed.withShared({ $0.elements.keys.first }) else { fallthrough } - - return XMLUnkeyedDecodingContainer(referencing: self, wrapping: SharedBox(keyed.withShared { $0.elements[firstKey] })) + return XMLUnkeyedDecodingContainer( + referencing: self, + wrapping: SharedBox(keyed.withShared { $0.elements.map(SingleKeyedBox.init) }) + ) default: throw DecodingError.typeMismatch( at: codingPath, @@ -420,3 +455,22 @@ extension XMLDecoderImplementation { return result } } + +extension XMLDecoderImplementation { + var keyTransform: (String) -> String { + switch options.keyDecodingStrategy { + case .convertFromSnakeCase: + return XMLDecoder.KeyDecodingStrategy._convertFromSnakeCase + case .convertFromCapitalized: + return XMLDecoder.KeyDecodingStrategy._convertFromCapitalized + case .convertFromKebabCase: + return XMLDecoder.KeyDecodingStrategy._convertFromKebabCase + case .useDefaultKeys: + return { key in key } + case let .custom(converter): + return { key in + converter(self.codingPath + [XMLKey(stringValue: key, intValue: nil)]).stringValue + } + } + } +} diff --git a/Sources/XMLCoder/Decoder/XMLKeyedDecodingContainer.swift b/Sources/XMLCoder/Decoder/XMLKeyedDecodingContainer.swift index 8ccd2b15..cbf42eb2 100644 --- a/Sources/XMLCoder/Decoder/XMLKeyedDecodingContainer.swift +++ b/Sources/XMLCoder/Decoder/XMLKeyedDecodingContainer.swift @@ -34,47 +34,11 @@ struct XMLKeyedDecodingContainer: KeyedDecodingContainerProtocol { wrapping container: KeyedContainer ) { self.decoder = decoder - - func mapKeys( - _ container: KeyedContainer, - closure: (String) -> String - ) -> KeyedContainer { - let attributes = container.withShared { keyedBox in - keyedBox.attributes.map { (closure($0), $1) } - } - let elements = container.withShared { keyedBox in - keyedBox.elements.map { (closure($0), $1) } - } - let keyedBox = KeyedBox(elements: elements, attributes: attributes) - return SharedBox(keyedBox) - } - - switch decoder.options.keyDecodingStrategy { - case .useDefaultKeys: - self.container = container - case .convertFromSnakeCase: - // Convert the snake case keys in the container to camel case. - // If we hit a duplicate key after conversion, then we'll use the - // first one we saw. Effectively an undefined behavior with dictionaries. - self.container = mapKeys(container) { key in - XMLDecoder.KeyDecodingStrategy._convertFromSnakeCase(key) - } - case .convertFromKebabCase: - self.container = mapKeys(container) { key in - XMLDecoder.KeyDecodingStrategy._convertFromKebabCase(key) - } - case .convertFromCapitalized: - self.container = mapKeys(container) { key in - XMLDecoder.KeyDecodingStrategy._convertFromCapitalized(key) - } - case let .custom(converter): - self.container = mapKeys(container) { key in - let codingPath = decoder.codingPath + [ - XMLKey(stringValue: key, intValue: nil), - ] - return converter(codingPath).stringValue - } + container.withShared { + $0.elements = .init($0.elements.map { (decoder.keyTransform($0), $1) }) + $0.attributes = .init($0.attributes.map { (decoder.keyTransform($0), $1) }) } + self.container = container codingPath = decoder.codingPath } diff --git a/Sources/XMLCoder/Decoder/XMLUnkeyedDecodingContainer.swift b/Sources/XMLCoder/Decoder/XMLUnkeyedDecodingContainer.swift index ec0059f3..513843e1 100644 --- a/Sources/XMLCoder/Decoder/XMLUnkeyedDecodingContainer.swift +++ b/Sources/XMLCoder/Decoder/XMLUnkeyedDecodingContainer.swift @@ -102,7 +102,18 @@ struct XMLUnkeyedDecodingContainer: UnkeyedDecodingContainer { unkeyedBox[self.currentIndex] } - let value = try decode(decoder, box) + var value: T? + if let singleKeyed = box as? SingleKeyedBox { + do { + // Drill down to the element in the case of an nested unkeyed element + value = try decode(decoder, singleKeyed.element) + } catch { + // Specialize for choice elements + value = try decode(decoder, ChoiceBox(key: singleKeyed.key, element: singleKeyed.element)) + } + } else { + value = try decode(decoder, box) + } defer { currentIndex += 1 } diff --git a/Sources/XMLCoder/Encoder/XMLChoiceEncodingContainer.swift b/Sources/XMLCoder/Encoder/XMLChoiceEncodingContainer.swift new file mode 100644 index 00000000..87a07414 --- /dev/null +++ b/Sources/XMLCoder/Encoder/XMLChoiceEncodingContainer.swift @@ -0,0 +1,207 @@ +// +// XMLChoiceEncodingContainer.swift +// XMLCoder +// +// Created by Benjamin Wetherfield on 7/17/19. +// + +struct XMLChoiceEncodingContainer: KeyedEncodingContainerProtocol { + typealias Key = K + + // MARK: Properties + + /// A reference to the encoder we're writing to. + private let encoder: XMLEncoderImplementation + + /// A reference to the container we're writing to. + private var container: SharedBox + + /// The path of coding keys taken to get to this point in encoding. + public private(set) var codingPath: [CodingKey] + + // MARK: - Initialization + + /// Initializes `self` with the given references. + init( + referencing encoder: XMLEncoderImplementation, + codingPath: [CodingKey], + wrapping container: SharedBox + ) { + self.encoder = encoder + self.codingPath = codingPath + self.container = container + } + + // MARK: - Coding Path Operations + + private func converted(_ key: CodingKey) -> CodingKey { + switch encoder.options.keyEncodingStrategy { + case .useDefaultKeys: + return key + case .convertToSnakeCase: + let newKeyString = XMLEncoder.KeyEncodingStrategy + ._convertToSnakeCase(key.stringValue) + return XMLKey(stringValue: newKeyString, intValue: key.intValue) + case .convertToKebabCase: + let newKeyString = XMLEncoder.KeyEncodingStrategy + ._convertToKebabCase(key.stringValue) + return XMLKey(stringValue: newKeyString, intValue: key.intValue) + case let .custom(converter): + return converter(codingPath + [key]) + case .capitalized: + let newKeyString = XMLEncoder.KeyEncodingStrategy + ._convertToCapitalized(key.stringValue) + return XMLKey(stringValue: newKeyString, intValue: key.intValue) + case .uppercased: + let newKeyString = XMLEncoder.KeyEncodingStrategy + ._convertToUppercased(key.stringValue) + return XMLKey(stringValue: newKeyString, intValue: key.intValue) + case .lowercased: + let newKeyString = XMLEncoder.KeyEncodingStrategy + ._convertToLowercased(key.stringValue) + return XMLKey(stringValue: newKeyString, intValue: key.intValue) + } + } + + // MARK: - KeyedEncodingContainerProtocol Methods + + public mutating func encodeNil(forKey key: Key) throws { + container.withShared { + $0.key = converted(key).stringValue + $0.element = NullBox() + } + } + + public mutating func encode( + _ value: T, + forKey key: Key + ) throws { + return try encode(value, forKey: key) { encoder, value in + try encoder.box(value) + } + } + + private mutating func encode( + _ value: T, + forKey key: Key, + encode: (XMLEncoderImplementation, T) throws -> Box + ) throws { + defer { + _ = self.encoder.nodeEncodings.removeLast() + self.encoder.codingPath.removeLast() + } + encoder.codingPath.append(key) + let nodeEncodings = encoder.options.nodeEncodingStrategy.nodeEncodings( + forType: T.self, + with: encoder + ) + encoder.nodeEncodings.append(nodeEncodings) + let box = try encode(encoder, value) + + let oldSelf = self + let elementEncoder: (T, Key, Box) throws -> () = { _, key, box in + oldSelf.container.withShared { container in + container.element = box + container.key = oldSelf.converted(key).stringValue + } + } + + defer { + self = oldSelf + } + + try elementEncoder(value, key, box) + } + + public mutating func nestedContainer( + keyedBy _: NestedKey.Type, + forKey key: Key + ) -> KeyedEncodingContainer { + if NestedKey.self is XMLChoiceCodingKey.Type { + return nestedChoiceContainer(keyedBy: NestedKey.self, forKey: key) + } else { + return nestedKeyedContainer(keyedBy: NestedKey.self, forKey: key) + } + } + + mutating func nestedKeyedContainer( + keyedBy _: NestedKey.Type, + forKey key: Key + ) -> KeyedEncodingContainer { + let sharedKeyed = SharedBox(KeyedBox()) + + self.container.withShared { container in + container.element = sharedKeyed + container.key = converted(key).stringValue + } + + codingPath.append(key) + defer { self.codingPath.removeLast() } + + let container = XMLKeyedEncodingContainer( + referencing: encoder, + codingPath: codingPath, + wrapping: sharedKeyed + ) + return KeyedEncodingContainer(container) + } + + mutating func nestedChoiceContainer( + keyedBy _: NestedKey.Type, + forKey key: Key + ) -> KeyedEncodingContainer { + let sharedChoice = SharedBox(ChoiceBox()) + + self.container.withShared { container in + container.element = sharedChoice + container.key = converted(key).stringValue + } + + codingPath.append(key) + defer { self.codingPath.removeLast() } + + let container = XMLChoiceEncodingContainer( + referencing: encoder, + codingPath: codingPath, + wrapping: sharedChoice + ) + return KeyedEncodingContainer(container) + } + + public mutating func nestedUnkeyedContainer( + forKey key: Key + ) -> UnkeyedEncodingContainer { + let sharedUnkeyed = SharedBox(UnkeyedBox()) + + container.withShared { container in + container.element = sharedUnkeyed + container.key = converted(key).stringValue + } + + codingPath.append(key) + defer { self.codingPath.removeLast() } + return XMLUnkeyedEncodingContainer( + referencing: encoder, + codingPath: codingPath, + wrapping: sharedUnkeyed + ) + } + + public mutating func superEncoder() -> Encoder { + return XMLReferencingEncoder( + referencing: encoder, + key: XMLKey.super, + convertedKey: converted(XMLKey.super), + wrapping: container + ) + } + + public mutating func superEncoder(forKey key: Key) -> Encoder { + return XMLReferencingEncoder( + referencing: encoder, + key: key, + convertedKey: converted(key), + wrapping: container + ) + } +} diff --git a/Sources/XMLCoder/Encoder/XMLEncoder.swift b/Sources/XMLCoder/Encoder/XMLEncoder.swift index 7ba007b2..a1b4a3e0 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoder.swift @@ -338,6 +338,8 @@ open class XMLEncoder { elementOrNone = XMLCoderElement(key: rootKey, box: keyedBox) } else if let unkeyedBox = topLevel as? UnkeyedBox { elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox) + } else if let choiceBox = topLevel as? ChoiceBox { + elementOrNone = XMLCoderElement(key: rootKey, box: choiceBox) } else { fatalError("Unrecognized top-level element of type: \(type(of: topLevel))") } diff --git a/Sources/XMLCoder/Encoder/XMLEncoderImplementation.swift b/Sources/XMLCoder/Encoder/XMLEncoderImplementation.swift index e0e710ee..f55d5098 100644 --- a/Sources/XMLCoder/Encoder/XMLEncoderImplementation.swift +++ b/Sources/XMLCoder/Encoder/XMLEncoderImplementation.swift @@ -64,6 +64,14 @@ class XMLEncoderImplementation: Encoder { // MARK: - Encoder Methods public func container(keyedBy _: Key.Type) -> KeyedEncodingContainer { + if Key.self is XMLChoiceCodingKey.Type { + return choiceContainer(keyedBy: Key.self) + } else { + return keyedContainer(keyedBy: Key.self) + } + } + + public func keyedContainer(keyedBy _: Key.Type) -> KeyedEncodingContainer { // If an existing keyed container was already requested, return that one. let topContainer: SharedBox if canEncodeNewValue { @@ -71,7 +79,12 @@ class XMLEncoderImplementation: Encoder { topContainer = storage.pushKeyedContainer() } else { guard let container = storage.lastContainer as? SharedBox else { - preconditionFailure("Attempt to push new keyed encoding container when already previously encoded at this path.") + preconditionFailure( + """ + Attempt to push new keyed encoding container when already previously encoded \ + at this path. + """ + ) } topContainer = container @@ -81,6 +94,28 @@ class XMLEncoderImplementation: Encoder { return KeyedEncodingContainer(container) } + public func choiceContainer(keyedBy _: Key.Type) -> KeyedEncodingContainer { + let topContainer: SharedBox + if canEncodeNewValue { + // We haven't yet pushed a container at this level; do so here. + topContainer = storage.pushChoiceContainer() + } else { + guard let container = storage.lastContainer as? SharedBox else { + preconditionFailure( + """ + Attempt to push new (single element) keyed encoding container when already \ + previously encoded at this path. + """ + ) + } + + topContainer = container + } + + let container = XMLChoiceEncodingContainer(referencing: self, codingPath: codingPath, wrapping: topContainer) + return KeyedEncodingContainer(container) + } + public func unkeyedContainer() -> UnkeyedEncodingContainer { // If an existing unkeyed container was already requested, return that one. let topContainer: SharedBox @@ -89,7 +124,12 @@ class XMLEncoderImplementation: Encoder { topContainer = storage.pushUnkeyedContainer() } else { guard let container = storage.lastContainer as? SharedBox else { - preconditionFailure("Attempt to push new unkeyed encoding container when already previously encoded at this path.") + preconditionFailure( + """ + Attempt to push new unkeyed encoding container when already previously encoded \ + at this path. + """ + ) } topContainer = container diff --git a/Sources/XMLCoder/Encoder/XMLEncodingStorage.swift b/Sources/XMLCoder/Encoder/XMLEncodingStorage.swift index 8a6f4c9e..eecba789 100644 --- a/Sources/XMLCoder/Encoder/XMLEncodingStorage.swift +++ b/Sources/XMLCoder/Encoder/XMLEncodingStorage.swift @@ -37,6 +37,12 @@ struct XMLEncodingStorage { return container } + mutating func pushChoiceContainer() -> SharedBox { + let container = SharedBox(ChoiceBox()) + containers.append(container) + return container + } + mutating func pushUnkeyedContainer() -> SharedBox { let container = SharedBox(UnkeyedBox()) containers.append(container) diff --git a/Sources/XMLCoder/Encoder/XMLKeyedEncodingContainer.swift b/Sources/XMLCoder/Encoder/XMLKeyedEncodingContainer.swift index 419bba27..de04a225 100644 --- a/Sources/XMLCoder/Encoder/XMLKeyedEncodingContainer.swift +++ b/Sources/XMLCoder/Encoder/XMLKeyedEncodingContainer.swift @@ -36,7 +36,7 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { // MARK: - Coding Path Operations - private func _converted(_ key: CodingKey) -> CodingKey { + private func converted(_ key: CodingKey) -> CodingKey { switch encoder.options.keyEncodingStrategy { case .useDefaultKeys: return key @@ -69,7 +69,7 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { public mutating func encodeNil(forKey key: Key) throws { container.withShared { - $0.elements.append(NullBox(), at: _converted(key).stringValue) + $0.elements.append(NullBox(), at: converted(key).stringValue) } } @@ -104,7 +104,7 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { encoder.nodeEncodings.append(nodeEncodings) let box = try encode(encoder, value) - let mySelf = self + let oldSelf = self let attributeEncoder: (T, Key, Box) throws -> () = { value, key, box in guard let attribute = box as? SimpleBox else { throw EncodingError.invalidValue(value, EncodingError.Context( @@ -112,19 +112,19 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { debugDescription: "Complex values cannot be encoded as attributes." )) } - mySelf.container.withShared { container in - container.attributes.append(attribute, at: mySelf._converted(key).stringValue) + oldSelf.container.withShared { container in + container.attributes.append(attribute, at: oldSelf.converted(key).stringValue) } } let elementEncoder: (T, Key, Box) throws -> () = { _, key, box in - mySelf.container.withShared { container in - container.elements.append(box, at: mySelf._converted(key).stringValue) + oldSelf.container.withShared { container in + container.elements.append(box, at: oldSelf.converted(key).stringValue) } } defer { - self = mySelf + self = oldSelf } switch strategy(key) { @@ -141,11 +141,22 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { public mutating func nestedContainer( keyedBy _: NestedKey.Type, forKey key: Key + ) -> KeyedEncodingContainer { + if NestedKey.self is XMLChoiceCodingKey.Type { + return nestedChoiceContainer(keyedBy: NestedKey.self, forKey: key) + } else { + return nestedKeyedContainer(keyedBy: NestedKey.self, forKey: key) + } + } + + mutating func nestedKeyedContainer( + keyedBy _: NestedKey.Type, + forKey key: Key ) -> KeyedEncodingContainer { let sharedKeyed = SharedBox(KeyedBox()) self.container.withShared { container in - container.elements.append(sharedKeyed, at: _converted(key).stringValue) + container.elements.append(sharedKeyed, at: converted(key).stringValue) } codingPath.append(key) @@ -159,13 +170,34 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { return KeyedEncodingContainer(container) } + mutating func nestedChoiceContainer( + keyedBy _: NestedKey.Type, + forKey key: Key + ) -> KeyedEncodingContainer { + let sharedChoice = SharedBox(ChoiceBox()) + + self.container.withShared { container in + container.elements.append(sharedChoice, at: converted(key).stringValue) + } + + codingPath.append(key) + defer { self.codingPath.removeLast() } + + let container = XMLChoiceEncodingContainer( + referencing: encoder, + codingPath: codingPath, + wrapping: sharedChoice + ) + return KeyedEncodingContainer(container) + } + public mutating func nestedUnkeyedContainer( forKey key: Key ) -> UnkeyedEncodingContainer { let sharedUnkeyed = SharedBox(UnkeyedBox()) container.withShared { container in - container.elements.append(sharedUnkeyed, at: _converted(key).stringValue) + container.elements.append(sharedUnkeyed, at: converted(key).stringValue) } codingPath.append(key) @@ -181,7 +213,7 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { return XMLReferencingEncoder( referencing: encoder, key: XMLKey.super, - convertedKey: _converted(XMLKey.super), + convertedKey: converted(XMLKey.super), wrapping: container ) } @@ -190,7 +222,7 @@ struct XMLKeyedEncodingContainer: KeyedEncodingContainerProtocol { return XMLReferencingEncoder( referencing: encoder, key: key, - convertedKey: _converted(key), + convertedKey: converted(key), wrapping: container ) } diff --git a/Sources/XMLCoder/Encoder/XMLReferencingEncoder.swift b/Sources/XMLCoder/Encoder/XMLReferencingEncoder.swift index 57559aed..0a9e6484 100644 --- a/Sources/XMLCoder/Encoder/XMLReferencingEncoder.swift +++ b/Sources/XMLCoder/Encoder/XMLReferencingEncoder.swift @@ -24,6 +24,9 @@ class XMLReferencingEncoder: XMLEncoderImplementation { /// Referencing a specific key in a keyed container. case keyed(SharedBox, String) + + /// Referencing a specific key in a keyed container. + case choice(SharedBox, String) } // MARK: - Properties @@ -71,6 +74,23 @@ class XMLReferencingEncoder: XMLEncoderImplementation { codingPath.append(key) } + init( + referencing encoder: XMLEncoderImplementation, + key: CodingKey, + convertedKey: CodingKey, + wrapping sharedKeyed: SharedBox + ) { + self.encoder = encoder + reference = .choice(sharedKeyed, convertedKey.stringValue) + super.init( + options: encoder.options, + nodeEncodings: encoder.nodeEncodings, + codingPath: encoder.codingPath + ) + + codingPath.append(key) + } + // MARK: - Coding Path Operations override var canEncodeNewValue: Bool { @@ -100,6 +120,11 @@ class XMLReferencingEncoder: XMLEncoderImplementation { sharedKeyedBox.withShared { keyedBox in keyedBox.elements.append(box, at: key) } + case let .choice(sharedChoiceBox, key): + sharedChoiceBox.withShared { choiceBox in + choiceBox.element = box + choiceBox.key = key + } } } } diff --git a/Sources/XMLCoder/Encoder/XMLUnkeyedEncodingContainer.swift b/Sources/XMLCoder/Encoder/XMLUnkeyedEncodingContainer.swift index b9846632..f3160980 100644 --- a/Sources/XMLCoder/Encoder/XMLUnkeyedEncodingContainer.swift +++ b/Sources/XMLCoder/Encoder/XMLUnkeyedEncodingContainer.swift @@ -66,6 +66,14 @@ struct XMLUnkeyedEncodingContainer: UnkeyedEncodingContainer { public mutating func nestedContainer( keyedBy _: NestedKey.Type ) -> KeyedEncodingContainer { + if NestedKey.self is XMLChoiceCodingKey.Type { + return nestedChoiceContainer(keyedBy: NestedKey.self) + } else { + return nestedKeyedContainer(keyedBy: NestedKey.self) + } + } + + public mutating func nestedKeyedContainer(keyedBy _: NestedKey.Type) -> KeyedEncodingContainer { codingPath.append(XMLKey(index: count)) defer { self.codingPath.removeLast() } @@ -82,6 +90,23 @@ struct XMLUnkeyedEncodingContainer: UnkeyedEncodingContainer { return KeyedEncodingContainer(container) } + public mutating func nestedChoiceContainer(keyedBy _: NestedKey.Type) -> KeyedEncodingContainer { + codingPath.append(XMLKey(index: count)) + defer { self.codingPath.removeLast() } + + let sharedChoice = SharedBox(ChoiceBox()) + self.container.withShared { container in + container.append(sharedChoice) + } + + let container = XMLChoiceEncodingContainer( + referencing: encoder, + codingPath: codingPath, + wrapping: sharedChoice + ) + return KeyedEncodingContainer(container) + } + public mutating func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { codingPath.append(XMLKey(index: count)) defer { self.codingPath.removeLast() } diff --git a/Tests/XMLCoderTests/CompositeChoiceTests.swift b/Tests/XMLCoderTests/CompositeChoiceTests.swift new file mode 100644 index 00000000..54db559c --- /dev/null +++ b/Tests/XMLCoderTests/CompositeChoiceTests.swift @@ -0,0 +1,106 @@ +// +// CompositeChoiceTests.swift +// XMLCoderTests +// +// Created by James Bean on 7/15/19. +// + +import XCTest +import XMLCoder + +private struct IntWrapper: Codable, Equatable { + let wrapped: Int +} + +private struct StringWrapper: Codable, Equatable { + let wrapped: String +} + +private enum IntOrStringWrapper: Equatable { + case int(IntWrapper) + case string(StringWrapper) +} + +extension IntOrStringWrapper: Codable { + enum CodingKeys: String, XMLChoiceCodingKey { + case int + case string + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + do { + self = .int(try container.decode(IntWrapper.self, forKey: .int)) + } catch { + self = .string(try container.decode(StringWrapper.self, forKey: .string)) + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .int(value): + try container.encode(value, forKey: .int) + case let .string(value): + try container.encode(value, forKey: .string) + } + } +} + +class EnumAssociatedValueTestComposite: XCTestCase { + var encoder: XMLEncoder { + let encoder = XMLEncoder() + encoder.outputFormatting = [.prettyPrinted] + return encoder + } + + private let simpleString = IntOrStringWrapper.string(StringWrapper(wrapped: "A Word About Woke Times")) + + private let xmlSimpleString = """ + + + A Word About Woke Times + + + """ + + private let simpleArray: [IntOrStringWrapper] = [ + .string(StringWrapper(wrapped: "A Word About Woke Times")), + .int(IntWrapper(wrapped: 9000)), + .string(StringWrapper(wrapped: "A Word About Woke Tomes")), + ] + + private let xmlSimpleArray = """ + + + A Word About Woke Times + + + 9000 + + + A Word About Woke Tomes + + + """ + + func testDecodeIntOrStringWrapper() throws { + let decoded = try XMLDecoder().decode(IntOrStringWrapper.self, from: xmlSimpleString.data(using: .utf8)!) + XCTAssertEqual(decoded, simpleString) + } + + func testEncodeIntOrStringWrapper() throws { + let encoded = try encoder.encode(simpleString, withRootKey: "container") + XCTAssertEqual(String(data: encoded, encoding: .utf8), xmlSimpleString) + } + + func testDecodeArrayOfIntOrStringWrappers() throws { + let decoded = try XMLDecoder().decode([IntOrStringWrapper].self, from: xmlSimpleArray.data(using: .utf8)!) + XCTAssertEqual(decoded, simpleArray) + } + + func testEncodeArrayOfIntOrStringWrappers() throws { + let encoded = try encoder.encode(simpleArray, withRootKey: "container") + XCTAssertEqual(String(data: encoded, encoding: .utf8), xmlSimpleArray) + } +} diff --git a/Tests/XMLCoderTests/Minimal/BoxTreeTests.swift b/Tests/XMLCoderTests/Minimal/BoxTreeTests.swift index faebe593..0707a128 100644 --- a/Tests/XMLCoderTests/Minimal/BoxTreeTests.swift +++ b/Tests/XMLCoderTests/Minimal/BoxTreeTests.swift @@ -9,7 +9,7 @@ import XCTest @testable import XMLCoder class BoxTreeTests: XCTestCase { - func testNestedValues() { + func testNestedValues() throws { let e1 = XMLCoderElement( key: "foo", value: "456", @@ -31,7 +31,6 @@ class BoxTreeTests: XCTestCase { let boxTree = root.transformToBoxTree() let foo = boxTree.elements["foo"] - XCTAssertEqual(foo.count, 2) } } diff --git a/Tests/XMLCoderTests/NestedAttributeChoiceTests.swift b/Tests/XMLCoderTests/NestedAttributeChoiceTests.swift new file mode 100644 index 00000000..42879488 --- /dev/null +++ b/Tests/XMLCoderTests/NestedAttributeChoiceTests.swift @@ -0,0 +1,144 @@ +// +// NestedAttributeChoiceTests.swift +// XMLCoderTests +// +// Created by Benjamin Wetherfield on 7/23/19. +// + +import XCTest +import XMLCoder + +private struct Container: Equatable { + let paragraphs: [Paragraph] +} + +private struct Paragraph: Equatable { + let entries: [Entry] +} + +private enum Entry: Equatable { + case run(Run) + case properties(Properties) + case br(Break) +} + +private struct Run: Codable, Equatable, DynamicNodeEncoding { + let id: Int + let text: String + + static func nodeEncoding(for key: CodingKey) -> XMLEncoder.NodeEncoding { + switch key { + case CodingKeys.id: + return .attribute + default: + return .element + } + } +} + +private struct Properties: Codable, Equatable, DynamicNodeEncoding { + let id: Int + let title: String + + static func nodeEncoding(for key: CodingKey) -> XMLEncoder.NodeEncoding { + return .attribute + } +} + +private struct Break: Codable, Equatable {} + +extension Container: Codable { + enum CodingKeys: String, CodingKey { + case paragraphs = "p" + } +} + +extension Paragraph: Codable { + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + entries = try container.decode([Entry].self) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(entries) + } +} + +extension Entry: Codable { + private enum CodingKeys: String, XMLChoiceCodingKey { + case run, properties, br + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + do { + self = .run(try container.decode(Run.self, forKey: .run)) + } catch { + do { + self = .properties(try container.decode(Properties.self, forKey: .properties)) + } catch { + self = .br(try container.decode(Break.self, forKey: .br)) + } + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .run(value): + try container.encode(value, forKey: .run) + case let .properties(value): + try container.encode(value, forKey: .properties) + case let .br(value): + try container.encode(value, forKey: .br) + } + } +} + +class NestedAttributeChoiceTests: XCTestCase { + private var encoder: XMLEncoder { + let encoder = XMLEncoder() + encoder.outputFormatting = [.prettyPrinted] + return encoder + } + + func testNestedEnumsEncoding() throws { + let xml = """ + +

+
+ + I am answering it again. + + +

+

+ + I am answering it again. + +
+

+
+ """ + let value = Container( + paragraphs: [ + Paragraph( + entries: [ + .br(Break()), + .run(Run(id: 1518, text: "I am answering it again.")), + .properties(Properties(id: 431, title: "A Word About Wake Times")), + ] + ), + Paragraph( + entries: [ + .run(Run(id: 1519, text: "I am answering it again.")), + .br(Break()), + ] + ), + ] + ) + let encoded = try encoder.encode(value, withRootKey: "container") + XCTAssertEqual(String(data: encoded, encoding: .utf8), xml) + } +} diff --git a/Tests/XMLCoderTests/NestedChoiceTests.swift b/Tests/XMLCoderTests/NestedChoiceTests.swift new file mode 100644 index 00000000..4810c454 --- /dev/null +++ b/Tests/XMLCoderTests/NestedChoiceTests.swift @@ -0,0 +1,250 @@ +// +// NestedChoiceTests.swift +// XMLCoderTests +// +// Created by James Bean on 7/15/19. +// + +import XCTest +import XMLCoder + +private struct Container: Equatable { + let paragraphs: [Paragraph] +} + +private struct Paragraph: Equatable { + let entries: [Entry] +} + +private enum Entry: Equatable { + case run(Run) + case properties(Properties) + case br(Break) +} + +private struct Run: Codable, Equatable { + let id: Int + let text: String +} + +private struct Properties: Codable, Equatable { + let id: Int + let title: String +} + +private struct Break: Codable, Equatable {} + +extension Container: Codable { + enum CodingKeys: String, CodingKey { + case paragraphs = "p" + } +} + +extension Paragraph: Codable { + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + entries = try container.decode([Entry].self) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(entries) + } +} + +extension Entry: Codable { + private enum CodingKeys: String, XMLChoiceCodingKey { + case run, properties, br + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + do { + self = .run(try container.decode(Run.self, forKey: .run)) + } catch { + do { + self = .properties(try container.decode(Properties.self, forKey: .properties)) + } catch { + self = .br(try container.decode(Break.self, forKey: .br)) + } + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .run(value): + try container.encode(value, forKey: .run) + case let .properties(value): + try container.encode(value, forKey: .properties) + case let .br(value): + try container.encode(value, forKey: .br) + } + } +} + +class NestedChoiceTests: XCTestCase { + func testBreakDecoding() throws { + let xml = "

" + let result = try XMLDecoder().decode(Break.self, from: xml.data(using: .utf8)!) + let expected = Break() + XCTAssertEqual(result, expected) + } + + func testPropertiesDecoding() throws { + let xml = """ + + 431 + A Word About Wake Times + + """ + let result = try XMLDecoder().decode(Properties.self, from: xml.data(using: .utf8)!) + let expected = Properties(id: 431, title: "A Word About Wake Times") + XCTAssertEqual(result, expected) + } + + func testPropertiesAsEntryDecoding() throws { + let xml = """ + + + 431 + A Word About Wake Times + + + """ + let result = try XMLDecoder().decode(Entry.self, from: xml.data(using: .utf8)!) + let expected: Entry = .properties(Properties(id: 431, title: "A Word About Wake Times")) + XCTAssertEqual(result, expected) + } + + func testRunDecoding() throws { + let xml = """ + + 1518 + I am answering it again. + + """ + let result = try XMLDecoder().decode(Run.self, from: xml.data(using: .utf8)!) + let expected = Run(id: 1518, text: "I am answering it again.") + XCTAssertEqual(result, expected) + } + + func testRunAsEntryDecoding() throws { + let xml = """ + + + 1518 + I am answering it again. + + + """ + let result = try XMLDecoder().decode(Entry.self, from: xml.data(using: .utf8)!) + let expected = Entry.run(Run(id: 1518, text: "I am answering it again.")) + XCTAssertEqual(result, expected) + } + + func testEntriesDecoding() throws { + let xml = """ + + + 1518 + I am answering it again. + + + 431 + A Word About Wake Times + + + """ + let result = try XMLDecoder().decode([Entry].self, from: xml.data(using: .utf8)!) + let expected: [Entry] = [ + .run(Run(id: 1518, text: "I am answering it again.")), + .properties(Properties(id: 431, title: "A Word About Wake Times")), + ] + XCTAssertEqual(result, expected) + } + + func testParagraphDecoding() throws { + let xml = """ +

+ + 1518 + I am answering it again. + + + 431 + A Word About Wake Times + +

+ """ + let result = try XMLDecoder().decode(Paragraph.self, from: xml.data(using: .utf8)!) + let expected = Paragraph( + entries: [ + .run(Run(id: 1518, text: "I am answering it again.")), + .properties(Properties(id: 431, title: "A Word About Wake Times")), + ] + ) + XCTAssertEqual(result, expected) + } + + func testNestedEnums() throws { + let xml = """ + +

+ + 1518 + I am answering it again. + + + 431 + A Word About Wake Times + +

+

+ + 1519 + I am answering it again. + +

+
+ """ + let result = try XMLDecoder().decode(Container.self, from: xml.data(using: .utf8)!) + let expected = Container( + paragraphs: [ + Paragraph( + entries: [ + .run(Run(id: 1518, text: "I am answering it again.")), + .properties(Properties(id: 431, title: "A Word About Wake Times")), + ] + ), + Paragraph( + entries: [ + .run(Run(id: 1519, text: "I am answering it again.")), + ] + ), + ] + ) + XCTAssertEqual(result, expected) + } + + func testNestedEnumsRoundTrip() throws { + let original = Container( + paragraphs: [ + Paragraph( + entries: [ + .run(Run(id: 1518, text: "I am answering it again.")), + .properties(Properties(id: 431, title: "A Word About Wake Times")), + ] + ), + Paragraph( + entries: [ + .run(Run(id: 1519, text: "I am answering it again.")), + ] + ), + ] + ) + let encoded = try XMLEncoder().encode(original, withRootKey: "container") + let decoded = try XMLDecoder().decode(Container.self, from: encoded) + XCTAssertEqual(decoded, original) + } +} diff --git a/Tests/XMLCoderTests/NestingTests.swift b/Tests/XMLCoderTests/NestingTests.swift index ba265700..e982f9ad 100644 --- a/Tests/XMLCoderTests/NestingTests.swift +++ b/Tests/XMLCoderTests/NestingTests.swift @@ -25,108 +25,122 @@ final class NestingTests: XCTestCase { [1, 2, 3], ] + let xmlUnkeyedWithinUnkeyed = + """ + + + 1 + 2 + 3 + + + 1 + 2 + 3 + + + """ + let unkeyedWithinKeyed: [String: [Int]] = [ "first": [1, 2, 3], "second": [1, 2, 3], ] + let xmlUnkeyedWithinKeyed = + """ + + 1 + 2 + 3 + 1 + 2 + 3 + + """ + let keyedWithinUnkeyed: [[String: Int]] = [ ["first": 1], ["second": 2], ] + let xmlKeyedWithinUnkeyed = + """ + + + 1 + + + 2 + + + """ + let keyedWithinKeyed: [String: [String: Int]] = [ "first": ["a": 1, "b": 2], "second": ["c": 3, "d": 4], ] + let xmlKeyedWithinKeyed = + """ + + + 2 + 1 + + + 3 + 4 + + + """ + func testEncodeUnkeyedWithinUnkeyed() throws { - XCTAssertNoThrow(try encoder.encode(unkeyedWithinUnkeyed, withRootKey: "element")) + let encoded = try encoder.encode(unkeyedWithinUnkeyed, withRootKey: "element") + XCTAssertEqual(String(data: encoded, encoding: .utf8), xmlUnkeyedWithinUnkeyed) } func testEncodeUnkeyedWithinKeyed() throws { - XCTAssertNoThrow(try encoder.encode(unkeyedWithinKeyed, withRootKey: "element")) + let encoded = try encoder.encode(unkeyedWithinKeyed, withRootKey: "element") + let decoded = try decoder.decode([String: [Int]].self, from: encoded) + XCTAssertEqual(decoded, unkeyedWithinKeyed) } func testEncodeKeyedWithinUnkeyed() throws { - XCTAssertNoThrow(try encoder.encode(keyedWithinUnkeyed, withRootKey: "element")) + let encoded = try encoder.encode(keyedWithinUnkeyed, withRootKey: "element") + XCTAssertEqual(String(data: encoded, encoding: .utf8), xmlKeyedWithinUnkeyed) } func testEncodeKeyedWithinKeyed() throws { - XCTAssertNoThrow(try encoder.encode(keyedWithinKeyed, withRootKey: "element")) + let encoded = try encoder.encode(keyedWithinKeyed, withRootKey: "element") + let decoded = try decoder.decode([String: [String: Int]].self, from: encoded) + XCTAssertEqual(decoded, keyedWithinKeyed) } func testDecodeUnkeyedWithinUnkeyed() throws { - let xml = - """ - - - 1 - 2 - 3 - - - 1 - 2 - 3 - - - """ - let encoded = xml.data(using: .utf8)! - - XCTAssertNoThrow(try decoder.decode(type(of: unkeyedWithinUnkeyed), from: encoded)) + let encoded = xmlUnkeyedWithinUnkeyed.data(using: .utf8)! + let expected = unkeyedWithinUnkeyed + let decoded = try decoder.decode([[Int]].self, from: encoded) + XCTAssertEqual(decoded, expected) } func testDecodeUnkeyedWithinKeyed() throws { - let xml = - """ - - 1 - 2 - 3 - 1 - 2 - 3 - - """ - let encoded = xml.data(using: .utf8)! - - XCTAssertNoThrow(try decoder.decode(type(of: unkeyedWithinKeyed), from: encoded)) + let encoded = xmlUnkeyedWithinKeyed.data(using: .utf8)! + let expected = unkeyedWithinKeyed + let decoded = try decoder.decode([String: [Int]].self, from: encoded) + XCTAssertEqual(decoded, expected) } func testDecodeKeyedWithinUnkeyed() throws { - let xml = - """ - - - 1 - - - 2 - - - """ - let encoded = xml.data(using: .utf8)! - - XCTAssertNoThrow(try decoder.decode(type(of: keyedWithinUnkeyed), from: encoded)) + let encoded = xmlKeyedWithinUnkeyed.data(using: .utf8)! + let expected = keyedWithinUnkeyed + let decoded = try decoder.decode([[String: Int]].self, from: encoded) + XCTAssertEqual(decoded, expected) } func testDecodeKeyedWithinKeyed() throws { - let xml = - """ - - - 2 - 1 - - - 3 - 4 - - - """ - let encoded = xml.data(using: .utf8)! - - XCTAssertNoThrow(try decoder.decode(type(of: keyedWithinKeyed), from: encoded)) + let encoded = xmlKeyedWithinKeyed.data(using: .utf8)! + let expected = keyedWithinKeyed + let decoded = try decoder.decode([String: [String: Int]].self, from: encoded) + XCTAssertEqual(decoded, expected) } } diff --git a/Tests/XMLCoderTests/SimpleChoiceTests.swift b/Tests/XMLCoderTests/SimpleChoiceTests.swift new file mode 100644 index 00000000..e22ce864 --- /dev/null +++ b/Tests/XMLCoderTests/SimpleChoiceTests.swift @@ -0,0 +1,118 @@ +// +// SimpleChoiceTests.swift +// XMLCoderTests +// +// Created by James Bean on 7/15/19. +// + +import XCTest +import XMLCoder + +private enum IntOrString: Equatable { + case int(Int) + case string(String) +} + +extension IntOrString: Codable { + enum CodingKeys: String, XMLChoiceCodingKey { + case int + case string + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .int(value): + try container.encode(value, forKey: .int) + case let .string(value): + try container.encode(value, forKey: .string) + } + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + do { + self = .int(try container.decode(Int.self, forKey: .int)) + } catch { + self = .string(try container.decode(String.self, forKey: .string)) + } + } +} + +class SimpleChoiceTests: XCTestCase { + func testIntOrStringIntDecoding() throws { + let xml = """ + + 42 + + """ + let result = try XMLDecoder().decode(IntOrString.self, from: xml.data(using: .utf8)!) + let expected = IntOrString.int(42) + XCTAssertEqual(result, expected) + } + + func testIntOrStringStringDecoding() throws { + let xml = """ + + forty-two" + + """ + let result = try XMLDecoder().decode(IntOrString.self, from: xml.data(using: .utf8)!) + let expected = IntOrString.string("forty-two") + XCTAssertEqual(result, expected) + } + + func testIntOrStringArrayDecoding() throws { + let xml = """ + + 1 + two + three + 4 + 5 + + """ + let result = try XMLDecoder().decode([IntOrString].self, from: xml.data(using: .utf8)!) + let expected: [IntOrString] = [ + .int(1), + .string("two"), + .string("three"), + .int(4), + .int(5), + ] + XCTAssertEqual(result, expected) + } + + func testIntOrStringRoundTrip() throws { + let original = IntOrString.int(5) + let encoded = try XMLEncoder().encode(original, withRootKey: "container") + let decoded = try XMLDecoder().decode(IntOrString.self, from: encoded) + XCTAssertEqual(original, decoded) + } + + func testIntOrStringArrayRoundTrip() throws { + let original: [IntOrString] = [ + .int(1), + .string("two"), + .string("three"), + .int(4), + .int(5), + ] + let encoded = try XMLEncoder().encode(original, withRootKey: "container") + let decoded = try XMLDecoder().decode([IntOrString].self, from: encoded) + XCTAssertEqual(original, decoded) + } + + func testIntOrStringDoubleArrayRoundTrip() throws { + let original: [[IntOrString]] = [[ + .int(1), + .string("two"), + .string("three"), + .int(4), + .int(5), + ]] + let encoded = try XMLEncoder().encode(original, withRootKey: "container") + let decoded = try XMLDecoder().decode([[IntOrString]].self, from: encoded) + XCTAssertEqual(original, decoded) + } +} diff --git a/XMLCoder.xcodeproj/project.pbxproj b/XMLCoder.xcodeproj/project.pbxproj index 36d664e7..e6c05c36 100644 --- a/XMLCoder.xcodeproj/project.pbxproj +++ b/XMLCoder.xcodeproj/project.pbxproj @@ -9,11 +9,11 @@ /* Begin PBXAggregateTarget section */ "XMLCoder::XMLCoderPackageTests::ProductTarget" /* XMLCoderPackageTests */ = { isa = PBXAggregateTarget; - buildConfigurationList = OBJ_70 /* Build configuration list for PBXAggregateTarget "XMLCoderPackageTests" */; + buildConfigurationList = OBJ_200 /* Build configuration list for PBXAggregateTarget "XMLCoderPackageTests" */; buildPhases = ( ); dependencies = ( - OBJ_73 /* PBXTargetDependency */, + OBJ_203 /* PBXTargetDependency */, ); name = XMLCoderPackageTests; productName = XMLCoderPackageTests; @@ -21,119 +21,128 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - A61DCCD821DF9CA200C0A19D /* ClassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A61DCCD621DF8DB300C0A19D /* ClassTests.swift */; }; - A61FE03921E4D60B0015D993 /* UnkeyedIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A61FE03721E4D4F10015D993 /* UnkeyedIntTests.swift */; }; - A61FE03C21E4EAB10015D993 /* KeyedIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A61FE03A21E4EA8B0015D993 /* KeyedIntTests.swift */; }; - B34B3C08220381AC00BCBA30 /* String+ExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B34B3C07220381AB00BCBA30 /* String+ExtensionsTests.swift */; }; - B35157CE21F986DD009CA0CC /* DynamicNodeEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = B35157CD21F986DD009CA0CC /* DynamicNodeEncoding.swift */; }; - B3B6902E220A71DF0084D407 /* AttributedIntrinsicTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B6902D220A71DF0084D407 /* AttributedIntrinsicTest.swift */; }; - B3BE1D612202C1F600259831 /* DynamicNodeEncodingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BE1D602202C1F600259831 /* DynamicNodeEncodingTest.swift */; }; - B3BE1D632202CB1400259831 /* XMLEncoderImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BE1D622202CB1400259831 /* XMLEncoderImplementation.swift */; }; - B3BE1D652202CB7200259831 /* SingleValueEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BE1D642202CB7200259831 /* SingleValueEncodingContainer.swift */; }; - B3BE1D682202CBF800259831 /* XMLDecoderImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BE1D662202CBF800259831 /* XMLDecoderImplementation.swift */; }; - B3BE1D692202CBF800259831 /* SingleValueDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BE1D672202CBF800259831 /* SingleValueDecodingContainer.swift */; }; - BF63EF0021CCDED2001D38C5 /* XMLStackParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EEFF21CCDED2001D38C5 /* XMLStackParserTests.swift */; }; - BF63EF0621CD7A74001D38C5 /* URLBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF0521CD7A74001D38C5 /* URLBox.swift */; }; - BF63EF0821CD7AF8001D38C5 /* URLBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF0721CD7AF8001D38C5 /* URLBoxTests.swift */; }; - BF63EF0A21CD7C1A001D38C5 /* URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF0921CD7C1A001D38C5 /* URLTests.swift */; }; - BF63EF0C21CD7F28001D38C5 /* EmptyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF0B21CD7F28001D38C5 /* EmptyTests.swift */; }; - BF63EF1821CEB6BD001D38C5 /* SharedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF1721CEB6BD001D38C5 /* SharedBox.swift */; }; - BF63EF1E21CEC99B001D38C5 /* BenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF1D21CEC99A001D38C5 /* BenchmarkTests.swift */; }; - BF63EF6721D0F874001D38C5 /* XMLKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF6621D0F874001D38C5 /* XMLKeyTests.swift */; }; - BF63EF6921D0FDB5001D38C5 /* XMLHeaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF6821D0FDB5001D38C5 /* XMLHeaderTests.swift */; }; - BF63EF6B21D10284001D38C5 /* XMLElementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF63EF6A21D10284001D38C5 /* XMLElementTests.swift */; }; - BF8171D021D3B1BD00901EB0 /* DecodingContainerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8171CF21D3B1BD00901EB0 /* DecodingContainerTests.swift */; }; - BF8171F221D3D03E00901EB0 /* SharedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8171F121D3D03E00901EB0 /* SharedBoxTests.swift */; }; - BF9457A821CBB498005ACFDE /* NullBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF94579E21CBB497005ACFDE /* NullBox.swift */; }; - BF9457A921CBB498005ACFDE /* KeyedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF94579F21CBB497005ACFDE /* KeyedBox.swift */; }; - BF9457AA21CBB498005ACFDE /* UnkeyedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457A021CBB497005ACFDE /* UnkeyedBox.swift */; }; - BF9457AB21CBB498005ACFDE /* DecimalBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457A121CBB497005ACFDE /* DecimalBox.swift */; }; - BF9457AD21CBB498005ACFDE /* BoolBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457A321CBB497005ACFDE /* BoolBox.swift */; }; - BF9457AE21CBB498005ACFDE /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457A421CBB497005ACFDE /* Box.swift */; }; - BF9457AF21CBB498005ACFDE /* StringBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457A521CBB498005ACFDE /* StringBox.swift */; }; - BF9457B721CBB4DB005ACFDE /* XMLHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B121CBB4DB005ACFDE /* XMLHeader.swift */; }; - BF9457B821CBB4DB005ACFDE /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B221CBB4DB005ACFDE /* String+Extensions.swift */; }; - BF9457B921CBB4DB005ACFDE /* XMLStackParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B321CBB4DB005ACFDE /* XMLStackParser.swift */; }; - BF9457BA21CBB4DB005ACFDE /* ISO8601DateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B421CBB4DB005ACFDE /* ISO8601DateFormatter.swift */; }; - BF9457BB21CBB4DB005ACFDE /* XMLKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B521CBB4DB005ACFDE /* XMLKey.swift */; }; - BF9457BC21CBB4DB005ACFDE /* XMLCoderElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457B621CBB4DB005ACFDE /* XMLCoderElement.swift */; }; - BF9457C821CBB516005ACFDE /* BoolBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457BE21CBB516005ACFDE /* BoolBoxTests.swift */; }; - BF9457C921CBB516005ACFDE /* KeyedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457BF21CBB516005ACFDE /* KeyedBoxTests.swift */; }; - BF9457CB21CBB516005ACFDE /* DecimalBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C121CBB516005ACFDE /* DecimalBoxTests.swift */; }; - BF9457CC21CBB516005ACFDE /* NullBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C221CBB516005ACFDE /* NullBoxTests.swift */; }; - BF9457CD21CBB516005ACFDE /* FloatBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C321CBB516005ACFDE /* FloatBoxTests.swift */; }; - BF9457CE21CBB516005ACFDE /* StringBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C421CBB516005ACFDE /* StringBoxTests.swift */; }; - BF9457CF21CBB516005ACFDE /* IntBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C521CBB516005ACFDE /* IntBoxTests.swift */; }; - BF9457D021CBB516005ACFDE /* UIntBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C621CBB516005ACFDE /* UIntBoxTests.swift */; }; - BF9457D121CBB516005ACFDE /* UnkeyedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457C721CBB516005ACFDE /* UnkeyedBoxTests.swift */; }; - BF9457D521CBB59E005ACFDE /* UIntBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457D221CBB59D005ACFDE /* UIntBox.swift */; }; - BF9457D621CBB59E005ACFDE /* FloatBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457D321CBB59D005ACFDE /* FloatBox.swift */; }; - BF9457D721CBB59E005ACFDE /* IntBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457D421CBB59D005ACFDE /* IntBox.swift */; }; - BF9457DA21CBB5D2005ACFDE /* DataBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457D821CBB5D2005ACFDE /* DataBox.swift */; }; - BF9457DB21CBB5D2005ACFDE /* DateBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457D921CBB5D2005ACFDE /* DateBox.swift */; }; - BF9457DD21CBB62C005ACFDE /* DateBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457DC21CBB62C005ACFDE /* DateBoxTests.swift */; }; - BF9457E021CBB68A005ACFDE /* DataBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457DE21CBB683005ACFDE /* DataBoxTests.swift */; }; - BF9457ED21CBB6BC005ACFDE /* BoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E221CBB6BC005ACFDE /* BoolTests.swift */; }; - BF9457EE21CBB6BC005ACFDE /* IntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E321CBB6BC005ACFDE /* IntTests.swift */; }; - BF9457EF21CBB6BC005ACFDE /* NullTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E421CBB6BC005ACFDE /* NullTests.swift */; }; - BF9457F021CBB6BC005ACFDE /* StringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E521CBB6BC005ACFDE /* StringTests.swift */; }; - BF9457F121CBB6BC005ACFDE /* FloatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E621CBB6BC005ACFDE /* FloatTests.swift */; }; - BF9457F221CBB6BC005ACFDE /* UnkeyedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E721CBB6BC005ACFDE /* UnkeyedTests.swift */; }; - BF9457F321CBB6BC005ACFDE /* DateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E821CBB6BC005ACFDE /* DateTests.swift */; }; - BF9457F421CBB6BC005ACFDE /* UIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457E921CBB6BC005ACFDE /* UIntTests.swift */; }; - BF9457F521CBB6BC005ACFDE /* DecimalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457EA21CBB6BC005ACFDE /* DecimalTests.swift */; }; - BF9457F621CBB6BC005ACFDE /* KeyedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457EB21CBB6BC005ACFDE /* KeyedTests.swift */; }; - BF9457F721CBB6BC005ACFDE /* DataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9457EC21CBB6BC005ACFDE /* DataTests.swift */; }; - D11815C1227788C8008836E4 /* SpacePreserveTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D11815BF227788BA008836E4 /* SpacePreserveTest.swift */; }; - D14D8A8621F1D6B300B0D31A /* SingleChildTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14D8A8521F1D6B300B0D31A /* SingleChildTests.swift */; }; - D158F12F2229892C0032B449 /* DynamicNodeDecoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D158F12E2229892C0032B449 /* DynamicNodeDecoding.swift */; }; - D162674321F9B2AF0056D1D8 /* OptionalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D162674121F9B2850056D1D8 /* OptionalTests.swift */; }; - D1761D1F2247F04500F53CEF /* DynamicNodeDecodingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1761D1E2247F04500F53CEF /* DynamicNodeDecodingTest.swift */; }; - D1A3D4AD227AD9BF00F28969 /* KeyDecodingAndEncodingStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1A3D4AB227AD9BC00F28969 /* KeyDecodingAndEncodingStrategyTests.swift */; }; - D1AC9466224E3E63004AB49B /* AttributedEnumIntrinsicTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1AC9464224E3E1F004AB49B /* AttributedEnumIntrinsicTest.swift */; }; - D1B6A2C22297EF6F005B8A6E /* BorderTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1B6A2C02297EF5A005B8A6E /* BorderTest.swift */; }; - D1CAD3622293FAB80077901D /* MixedContainerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CAD3612293FAB80077901D /* MixedContainerTest.swift */; }; - D1CB1EF521EA9599009CAF02 /* RJITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* RJITest.swift */; }; - D1CFC8242226B13F00B03222 /* NamespaceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CFC8222226AFB400B03222 /* NamespaceTest.swift */; }; - D1D50D3122942EAE007098FC /* NestingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1D50D3022942EAE007098FC /* NestingTests.swift */; }; - D1E0C85321D8E65E0042A261 /* ErrorContextTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1E0C85121D8E6540042A261 /* ErrorContextTest.swift */; }; - D1E0C85521D91EBF0042A261 /* Metatypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1E0C85421D91EBF0042A261 /* Metatypes.swift */; }; - D1EC3E62225A32F500C610E3 /* BoxTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1EC3E61225A32F500C610E3 /* BoxTreeTests.swift */; }; - D1EC3E65225A38EC00C610E3 /* KeyedStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1EC3E64225A38EC00C610E3 /* KeyedStorage.swift */; }; - D1FC040521C7EF8200065B43 /* RJISample.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1FC040421C7EF8200065B43 /* RJISample.swift */; }; - OBJ_48 /* DecodingErrorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* DecodingErrorExtension.swift */; }; - OBJ_49 /* XMLDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* XMLDecoder.swift */; }; - OBJ_50 /* XMLDecodingStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* XMLDecodingStorage.swift */; }; - OBJ_51 /* XMLKeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* XMLKeyedDecodingContainer.swift */; }; - OBJ_52 /* XMLUnkeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* XMLUnkeyedDecodingContainer.swift */; }; - OBJ_53 /* EncodingErrorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* EncodingErrorExtension.swift */; }; - OBJ_54 /* XMLEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* XMLEncoder.swift */; }; - OBJ_55 /* XMLEncodingStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* XMLEncodingStorage.swift */; }; - OBJ_56 /* XMLKeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* XMLKeyedEncodingContainer.swift */; }; - OBJ_57 /* XMLReferencingEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* XMLReferencingEncoder.swift */; }; - OBJ_58 /* XMLUnkeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* XMLUnkeyedEncodingContainer.swift */; }; - OBJ_68 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; - OBJ_80 /* BooksTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* BooksTest.swift */; }; - OBJ_81 /* BreakfastTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_29 /* BreakfastTest.swift */; }; - OBJ_82 /* CDCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* CDCatalog.swift */; }; - OBJ_83 /* CDTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* CDTest.swift */; }; - OBJ_85 /* NodeEncodingStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* NodeEncodingStrategyTests.swift */; }; - OBJ_86 /* NoteTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* NoteTest.swift */; }; - OBJ_87 /* PlantCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* PlantCatalog.swift */; }; - OBJ_88 /* PlantTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* PlantTest.swift */; }; - OBJ_90 /* RelationshipsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* RelationshipsTest.swift */; }; - OBJ_92 /* XMLCoder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "XMLCoder::XMLCoder::Product" /* XMLCoder.framework */; }; + OBJ_148 /* BoolBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* BoolBox.swift */; }; + OBJ_149 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* Box.swift */; }; + OBJ_150 /* ChoiceBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* ChoiceBox.swift */; }; + OBJ_151 /* DataBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* DataBox.swift */; }; + OBJ_152 /* DateBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* DateBox.swift */; }; + OBJ_153 /* DecimalBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* DecimalBox.swift */; }; + OBJ_154 /* FloatBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* FloatBox.swift */; }; + OBJ_155 /* IntBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* IntBox.swift */; }; + OBJ_156 /* KeyedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* KeyedBox.swift */; }; + OBJ_157 /* NullBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* NullBox.swift */; }; + OBJ_158 /* SharedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* SharedBox.swift */; }; + OBJ_159 /* SingleKeyedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* SingleKeyedBox.swift */; }; + OBJ_160 /* StringBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_24 /* StringBox.swift */; }; + OBJ_161 /* UIntBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_25 /* UIntBox.swift */; }; + OBJ_162 /* URLBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* URLBox.swift */; }; + OBJ_163 /* UnkeyedBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* UnkeyedBox.swift */; }; + OBJ_164 /* ISO8601DateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* ISO8601DateFormatter.swift */; }; + OBJ_165 /* KeyedStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_29 /* KeyedStorage.swift */; }; + OBJ_166 /* Metatypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* Metatypes.swift */; }; + OBJ_167 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* String+Extensions.swift */; }; + OBJ_168 /* XMLChoiceCodingKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* XMLChoiceCodingKey.swift */; }; + OBJ_169 /* XMLCoderElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* XMLCoderElement.swift */; }; + OBJ_170 /* XMLHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* XMLHeader.swift */; }; + OBJ_171 /* XMLKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* XMLKey.swift */; }; + OBJ_172 /* XMLStackParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* XMLStackParser.swift */; }; + OBJ_173 /* DecodingErrorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* DecodingErrorExtension.swift */; }; + OBJ_174 /* DynamicNodeDecoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* DynamicNodeDecoding.swift */; }; + OBJ_175 /* SingleValueDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* SingleValueDecodingContainer.swift */; }; + OBJ_176 /* XMLChoiceDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* XMLChoiceDecodingContainer.swift */; }; + OBJ_177 /* XMLDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* XMLDecoder.swift */; }; + OBJ_178 /* XMLDecoderImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* XMLDecoderImplementation.swift */; }; + OBJ_179 /* XMLDecodingStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* XMLDecodingStorage.swift */; }; + OBJ_180 /* XMLKeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* XMLKeyedDecodingContainer.swift */; }; + OBJ_181 /* XMLUnkeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* XMLUnkeyedDecodingContainer.swift */; }; + OBJ_182 /* DynamicNodeEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* DynamicNodeEncoding.swift */; }; + OBJ_183 /* EncodingErrorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* EncodingErrorExtension.swift */; }; + OBJ_184 /* SingleValueEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_50 /* SingleValueEncodingContainer.swift */; }; + OBJ_185 /* XMLChoiceEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_51 /* XMLChoiceEncodingContainer.swift */; }; + OBJ_186 /* XMLEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_52 /* XMLEncoder.swift */; }; + OBJ_187 /* XMLEncoderImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_53 /* XMLEncoderImplementation.swift */; }; + OBJ_188 /* XMLEncodingStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_54 /* XMLEncodingStorage.swift */; }; + OBJ_189 /* XMLKeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_55 /* XMLKeyedEncodingContainer.swift */; }; + OBJ_190 /* XMLReferencingEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_56 /* XMLReferencingEncoder.swift */; }; + OBJ_191 /* XMLUnkeyedEncodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_57 /* XMLUnkeyedEncodingContainer.swift */; }; + OBJ_198 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; + OBJ_209 /* AttributedEnumIntrinsicTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_60 /* AttributedEnumIntrinsicTest.swift */; }; + OBJ_210 /* AttributedIntrinsicTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_61 /* AttributedIntrinsicTest.swift */; }; + OBJ_211 /* String+ExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_63 /* String+ExtensionsTests.swift */; }; + OBJ_212 /* XMLElementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_64 /* XMLElementTests.swift */; }; + OBJ_213 /* XMLHeaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_65 /* XMLHeaderTests.swift */; }; + OBJ_214 /* XMLKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_66 /* XMLKeyTests.swift */; }; + OBJ_215 /* XMLStackParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_67 /* XMLStackParserTests.swift */; }; + OBJ_216 /* BenchmarkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_68 /* BenchmarkTests.swift */; }; + OBJ_217 /* BooksTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_69 /* BooksTest.swift */; }; + OBJ_218 /* BorderTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_70 /* BorderTest.swift */; }; + OBJ_219 /* BoolBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_72 /* BoolBoxTests.swift */; }; + OBJ_220 /* DataBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_73 /* DataBoxTests.swift */; }; + OBJ_221 /* DateBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_74 /* DateBoxTests.swift */; }; + OBJ_222 /* DecimalBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_75 /* DecimalBoxTests.swift */; }; + OBJ_223 /* FloatBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_76 /* FloatBoxTests.swift */; }; + OBJ_224 /* IntBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_77 /* IntBoxTests.swift */; }; + OBJ_225 /* KeyedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_78 /* KeyedBoxTests.swift */; }; + OBJ_226 /* NullBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_79 /* NullBoxTests.swift */; }; + OBJ_227 /* SharedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_80 /* SharedBoxTests.swift */; }; + OBJ_228 /* StringBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_81 /* StringBoxTests.swift */; }; + OBJ_229 /* UIntBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_82 /* UIntBoxTests.swift */; }; + OBJ_230 /* URLBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_83 /* URLBoxTests.swift */; }; + OBJ_231 /* UnkeyedBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_84 /* UnkeyedBoxTests.swift */; }; + OBJ_232 /* BreakfastTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_85 /* BreakfastTest.swift */; }; + OBJ_233 /* CDCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_86 /* CDCatalog.swift */; }; + OBJ_234 /* CDTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_87 /* CDTest.swift */; }; + OBJ_235 /* ClassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_88 /* ClassTests.swift */; }; + OBJ_236 /* CompositeChoiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_89 /* CompositeChoiceTests.swift */; }; + OBJ_237 /* DecodingContainerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_90 /* DecodingContainerTests.swift */; }; + OBJ_238 /* DynamicNodeDecodingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_91 /* DynamicNodeDecodingTest.swift */; }; + OBJ_239 /* DynamicNodeEncodingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_92 /* DynamicNodeEncodingTest.swift */; }; + OBJ_240 /* ErrorContextTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_93 /* ErrorContextTest.swift */; }; + OBJ_241 /* KeyDecodingAndEncodingStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_94 /* KeyDecodingAndEncodingStrategyTests.swift */; }; + OBJ_242 /* BoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_96 /* BoolTests.swift */; }; + OBJ_243 /* BoxTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_97 /* BoxTreeTests.swift */; }; + OBJ_244 /* DataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_98 /* DataTests.swift */; }; + OBJ_245 /* DateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_99 /* DateTests.swift */; }; + OBJ_246 /* DecimalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_100 /* DecimalTests.swift */; }; + OBJ_247 /* EmptyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_101 /* EmptyTests.swift */; }; + OBJ_248 /* FloatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_102 /* FloatTests.swift */; }; + OBJ_249 /* IntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_103 /* IntTests.swift */; }; + OBJ_250 /* KeyedIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_104 /* KeyedIntTests.swift */; }; + OBJ_251 /* KeyedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_105 /* KeyedTests.swift */; }; + OBJ_252 /* NullTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_106 /* NullTests.swift */; }; + OBJ_253 /* OptionalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_107 /* OptionalTests.swift */; }; + OBJ_254 /* StringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_108 /* StringTests.swift */; }; + OBJ_255 /* UIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_109 /* UIntTests.swift */; }; + OBJ_256 /* URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_110 /* URLTests.swift */; }; + OBJ_257 /* UnkeyedIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_111 /* UnkeyedIntTests.swift */; }; + OBJ_258 /* UnkeyedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_112 /* UnkeyedTests.swift */; }; + OBJ_259 /* MixedContainerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_113 /* MixedContainerTest.swift */; }; + OBJ_260 /* NamespaceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_114 /* NamespaceTest.swift */; }; + OBJ_261 /* NestedAttributeChoiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_115 /* NestedAttributeChoiceTests.swift */; }; + OBJ_262 /* NestedChoiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_116 /* NestedChoiceTests.swift */; }; + OBJ_263 /* NestingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_117 /* NestingTests.swift */; }; + OBJ_264 /* NodeEncodingStrategyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_118 /* NodeEncodingStrategyTests.swift */; }; + OBJ_265 /* NoteTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_119 /* NoteTest.swift */; }; + OBJ_266 /* PlantCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_120 /* PlantCatalog.swift */; }; + OBJ_267 /* PlantTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_121 /* PlantTest.swift */; }; + OBJ_268 /* RJISample.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_122 /* RJISample.swift */; }; + OBJ_269 /* RJITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_123 /* RJITest.swift */; }; + OBJ_270 /* RelationshipsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_124 /* RelationshipsTest.swift */; }; + OBJ_271 /* SimpleChoiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_125 /* SimpleChoiceTests.swift */; }; + OBJ_272 /* SingleChildTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_126 /* SingleChildTests.swift */; }; + OBJ_273 /* SpacePreserveTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_127 /* SpacePreserveTest.swift */; }; + OBJ_275 /* XMLCoder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "XMLCoder::XMLCoder::Product" /* XMLCoder.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - D1FC040221C7ED2300065B43 /* PBXContainerItemProxy */ = { + 143B746122ED4A67005D7765 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; remoteGlobalIDString = "XMLCoder::XMLCoder"; remoteInfo = XMLCoder; }; - D1FC040321C7EF2300065B43 /* PBXContainerItemProxy */ = { + 143B746222ED4A67005D7765 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = OBJ_1 /* Project object */; proxyType = 1; @@ -143,312 +152,317 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - A61DCCD621DF8DB300C0A19D /* ClassTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClassTests.swift; sourceTree = ""; }; - A61FE03721E4D4F10015D993 /* UnkeyedIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnkeyedIntTests.swift; sourceTree = ""; }; - A61FE03A21E4EA8B0015D993 /* KeyedIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedIntTests.swift; sourceTree = ""; }; - B34B3C07220381AB00BCBA30 /* String+ExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+ExtensionsTests.swift"; sourceTree = ""; }; - B35157CD21F986DD009CA0CC /* DynamicNodeEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeEncoding.swift; sourceTree = ""; }; - B3B6902D220A71DF0084D407 /* AttributedIntrinsicTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedIntrinsicTest.swift; sourceTree = ""; }; - B3BE1D602202C1F600259831 /* DynamicNodeEncodingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DynamicNodeEncodingTest.swift; sourceTree = ""; }; - B3BE1D622202CB1400259831 /* XMLEncoderImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncoderImplementation.swift; sourceTree = ""; }; - B3BE1D642202CB7200259831 /* SingleValueEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleValueEncodingContainer.swift; sourceTree = ""; }; - B3BE1D662202CBF800259831 /* XMLDecoderImplementation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLDecoderImplementation.swift; sourceTree = ""; }; - B3BE1D672202CBF800259831 /* SingleValueDecodingContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleValueDecodingContainer.swift; sourceTree = ""; }; - BF63EEFF21CCDED2001D38C5 /* XMLStackParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLStackParserTests.swift; sourceTree = ""; }; - BF63EF0521CD7A74001D38C5 /* URLBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLBox.swift; sourceTree = ""; }; - BF63EF0721CD7AF8001D38C5 /* URLBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLBoxTests.swift; sourceTree = ""; }; - BF63EF0921CD7C1A001D38C5 /* URLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLTests.swift; sourceTree = ""; }; - BF63EF0B21CD7F28001D38C5 /* EmptyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyTests.swift; sourceTree = ""; }; - BF63EF1721CEB6BD001D38C5 /* SharedBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedBox.swift; sourceTree = ""; }; - BF63EF1D21CEC99A001D38C5 /* BenchmarkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BenchmarkTests.swift; sourceTree = ""; }; - BF63EF6621D0F874001D38C5 /* XMLKeyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLKeyTests.swift; sourceTree = ""; }; - BF63EF6821D0FDB5001D38C5 /* XMLHeaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLHeaderTests.swift; sourceTree = ""; }; - BF63EF6A21D10284001D38C5 /* XMLElementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLElementTests.swift; sourceTree = ""; }; - BF8171CF21D3B1BD00901EB0 /* DecodingContainerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodingContainerTests.swift; sourceTree = ""; }; - BF8171F121D3D03E00901EB0 /* SharedBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedBoxTests.swift; sourceTree = ""; }; - BF94579E21CBB497005ACFDE /* NullBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NullBox.swift; sourceTree = ""; }; - BF94579F21CBB497005ACFDE /* KeyedBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyedBox.swift; sourceTree = ""; }; - BF9457A021CBB497005ACFDE /* UnkeyedBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnkeyedBox.swift; sourceTree = ""; }; - BF9457A121CBB497005ACFDE /* DecimalBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecimalBox.swift; sourceTree = ""; }; - BF9457A321CBB497005ACFDE /* BoolBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoolBox.swift; sourceTree = ""; }; - BF9457A421CBB497005ACFDE /* Box.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Box.swift; sourceTree = ""; }; - BF9457A521CBB498005ACFDE /* StringBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringBox.swift; sourceTree = ""; }; - BF9457B121CBB4DB005ACFDE /* XMLHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLHeader.swift; sourceTree = ""; }; - BF9457B221CBB4DB005ACFDE /* String+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; - BF9457B321CBB4DB005ACFDE /* XMLStackParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLStackParser.swift; sourceTree = ""; }; - BF9457B421CBB4DB005ACFDE /* ISO8601DateFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISO8601DateFormatter.swift; sourceTree = ""; }; - BF9457B521CBB4DB005ACFDE /* XMLKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLKey.swift; sourceTree = ""; }; - BF9457B621CBB4DB005ACFDE /* XMLCoderElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLCoderElement.swift; sourceTree = ""; }; - BF9457BE21CBB516005ACFDE /* BoolBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoolBoxTests.swift; sourceTree = ""; }; - BF9457BF21CBB516005ACFDE /* KeyedBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyedBoxTests.swift; sourceTree = ""; }; - BF9457C121CBB516005ACFDE /* DecimalBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecimalBoxTests.swift; sourceTree = ""; }; - BF9457C221CBB516005ACFDE /* NullBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NullBoxTests.swift; sourceTree = ""; }; - BF9457C321CBB516005ACFDE /* FloatBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloatBoxTests.swift; sourceTree = ""; }; - BF9457C421CBB516005ACFDE /* StringBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringBoxTests.swift; sourceTree = ""; }; - BF9457C521CBB516005ACFDE /* IntBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntBoxTests.swift; sourceTree = ""; }; - BF9457C621CBB516005ACFDE /* UIntBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIntBoxTests.swift; sourceTree = ""; }; - BF9457C721CBB516005ACFDE /* UnkeyedBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnkeyedBoxTests.swift; sourceTree = ""; }; - BF9457D221CBB59D005ACFDE /* UIntBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIntBox.swift; sourceTree = ""; }; - BF9457D321CBB59D005ACFDE /* FloatBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloatBox.swift; sourceTree = ""; }; - BF9457D421CBB59D005ACFDE /* IntBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntBox.swift; sourceTree = ""; }; - BF9457D821CBB5D2005ACFDE /* DataBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataBox.swift; sourceTree = ""; }; - BF9457D921CBB5D2005ACFDE /* DateBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateBox.swift; sourceTree = ""; }; - BF9457DC21CBB62C005ACFDE /* DateBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateBoxTests.swift; sourceTree = ""; }; - BF9457DE21CBB683005ACFDE /* DataBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataBoxTests.swift; sourceTree = ""; }; - BF9457E221CBB6BC005ACFDE /* BoolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoolTests.swift; sourceTree = ""; }; - BF9457E321CBB6BC005ACFDE /* IntTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntTests.swift; sourceTree = ""; }; - BF9457E421CBB6BC005ACFDE /* NullTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NullTests.swift; sourceTree = ""; }; - BF9457E521CBB6BC005ACFDE /* StringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = ""; }; - BF9457E621CBB6BC005ACFDE /* FloatTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloatTests.swift; sourceTree = ""; }; - BF9457E721CBB6BC005ACFDE /* UnkeyedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnkeyedTests.swift; sourceTree = ""; }; - BF9457E821CBB6BC005ACFDE /* DateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTests.swift; sourceTree = ""; }; - BF9457E921CBB6BC005ACFDE /* UIntTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIntTests.swift; sourceTree = ""; }; - BF9457EA21CBB6BC005ACFDE /* DecimalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecimalTests.swift; sourceTree = ""; }; - BF9457EB21CBB6BC005ACFDE /* KeyedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyedTests.swift; sourceTree = ""; }; - BF9457EC21CBB6BC005ACFDE /* DataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataTests.swift; sourceTree = ""; }; - D11815BF227788BA008836E4 /* SpacePreserveTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpacePreserveTest.swift; sourceTree = ""; }; - D11979B521F5CD2500A9C574 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; - D11979B621F5CD2500A9C574 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - D11979B721F5EA5400A9C574 /* XMLCoder.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = XMLCoder.podspec; sourceTree = ""; }; - D14D8A8521F1D6B300B0D31A /* SingleChildTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleChildTests.swift; sourceTree = ""; }; - D158F12E2229892C0032B449 /* DynamicNodeDecoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeDecoding.swift; sourceTree = ""; }; - D162674121F9B2850056D1D8 /* OptionalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalTests.swift; sourceTree = ""; }; - D1761D1E2247F04500F53CEF /* DynamicNodeDecodingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeDecodingTest.swift; sourceTree = ""; }; - D1A3D4AB227AD9BC00F28969 /* KeyDecodingAndEncodingStrategyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyDecodingAndEncodingStrategyTests.swift; sourceTree = ""; }; - D1AC9464224E3E1F004AB49B /* AttributedEnumIntrinsicTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedEnumIntrinsicTest.swift; sourceTree = ""; }; - D1B6A2C02297EF5A005B8A6E /* BorderTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BorderTest.swift; sourceTree = ""; }; - D1CAD3612293FAB80077901D /* MixedContainerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MixedContainerTest.swift; sourceTree = ""; }; - D1CFC8222226AFB400B03222 /* NamespaceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamespaceTest.swift; sourceTree = ""; }; - D1D50D3022942EAE007098FC /* NestingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NestingTests.swift; sourceTree = ""; }; - D1E0C85121D8E6540042A261 /* ErrorContextTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorContextTest.swift; sourceTree = ""; }; - D1E0C85421D91EBF0042A261 /* Metatypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Metatypes.swift; sourceTree = ""; }; - D1EC3E61225A32F500C610E3 /* BoxTreeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxTreeTests.swift; sourceTree = ""; }; - D1EC3E63225A334C00C610E3 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - D1EC3E64225A38EC00C610E3 /* KeyedStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedStorage.swift; sourceTree = ""; }; - D1FC040421C7EF8200065B43 /* RJISample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RJISample.swift; sourceTree = ""; }; - OBJ_10 /* DecodingErrorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodingErrorExtension.swift; sourceTree = ""; }; - OBJ_11 /* XMLDecoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLDecoder.swift; sourceTree = ""; }; - OBJ_12 /* XMLDecodingStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLDecodingStorage.swift; sourceTree = ""; }; - OBJ_13 /* XMLKeyedDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKeyedDecodingContainer.swift; sourceTree = ""; }; - OBJ_14 /* XMLUnkeyedDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLUnkeyedDecodingContainer.swift; sourceTree = ""; }; - OBJ_16 /* EncodingErrorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodingErrorExtension.swift; sourceTree = ""; }; - OBJ_17 /* XMLEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncoder.swift; sourceTree = ""; }; - OBJ_18 /* XMLEncodingStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncodingStorage.swift; sourceTree = ""; }; - OBJ_19 /* XMLKeyedEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKeyedEncodingContainer.swift; sourceTree = ""; }; - OBJ_20 /* XMLReferencingEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLReferencingEncoder.swift; sourceTree = ""; }; - OBJ_21 /* XMLUnkeyedEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLUnkeyedEncodingContainer.swift; sourceTree = ""; }; - OBJ_28 /* BooksTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooksTest.swift; sourceTree = ""; }; - OBJ_29 /* BreakfastTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreakfastTest.swift; sourceTree = ""; }; - OBJ_30 /* CDCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDCatalog.swift; sourceTree = ""; }; - OBJ_31 /* CDTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDTest.swift; sourceTree = ""; }; - OBJ_33 /* NodeEncodingStrategyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeEncodingStrategyTests.swift; sourceTree = ""; }; - OBJ_34 /* NoteTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoteTest.swift; sourceTree = ""; }; - OBJ_35 /* PlantCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlantCatalog.swift; sourceTree = ""; }; - OBJ_36 /* PlantTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlantTest.swift; sourceTree = ""; }; - OBJ_37 /* RJITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RJITest.swift; sourceTree = ""; }; - OBJ_38 /* RelationshipsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelationshipsTest.swift; sourceTree = ""; }; + OBJ_100 /* DecimalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecimalTests.swift; sourceTree = ""; }; + OBJ_101 /* EmptyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyTests.swift; sourceTree = ""; }; + OBJ_102 /* FloatTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatTests.swift; sourceTree = ""; }; + OBJ_103 /* IntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntTests.swift; sourceTree = ""; }; + OBJ_104 /* KeyedIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedIntTests.swift; sourceTree = ""; }; + OBJ_105 /* KeyedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedTests.swift; sourceTree = ""; }; + OBJ_106 /* NullTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullTests.swift; sourceTree = ""; }; + OBJ_107 /* OptionalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalTests.swift; sourceTree = ""; }; + OBJ_108 /* StringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = ""; }; + OBJ_109 /* UIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIntTests.swift; sourceTree = ""; }; + OBJ_110 /* URLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLTests.swift; sourceTree = ""; }; + OBJ_111 /* UnkeyedIntTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnkeyedIntTests.swift; sourceTree = ""; }; + OBJ_112 /* UnkeyedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnkeyedTests.swift; sourceTree = ""; }; + OBJ_113 /* MixedContainerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MixedContainerTest.swift; sourceTree = ""; }; + OBJ_114 /* NamespaceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamespaceTest.swift; sourceTree = ""; }; + OBJ_115 /* NestedAttributeChoiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NestedAttributeChoiceTests.swift; sourceTree = ""; }; + OBJ_116 /* NestedChoiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NestedChoiceTests.swift; sourceTree = ""; }; + OBJ_117 /* NestingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NestingTests.swift; sourceTree = ""; }; + OBJ_118 /* NodeEncodingStrategyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeEncodingStrategyTests.swift; sourceTree = ""; }; + OBJ_119 /* NoteTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoteTest.swift; sourceTree = ""; }; + OBJ_12 /* BoolBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoolBox.swift; sourceTree = ""; }; + OBJ_120 /* PlantCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlantCatalog.swift; sourceTree = ""; }; + OBJ_121 /* PlantTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlantTest.swift; sourceTree = ""; }; + OBJ_122 /* RJISample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RJISample.swift; sourceTree = ""; }; + OBJ_123 /* RJITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RJITest.swift; sourceTree = ""; }; + OBJ_124 /* RelationshipsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelationshipsTest.swift; sourceTree = ""; }; + OBJ_125 /* SimpleChoiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleChoiceTests.swift; sourceTree = ""; }; + OBJ_126 /* SingleChildTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleChildTests.swift; sourceTree = ""; }; + OBJ_127 /* SpacePreserveTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpacePreserveTest.swift; sourceTree = ""; }; + OBJ_13 /* Box.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Box.swift; sourceTree = ""; }; + OBJ_131 /* CODE_OF_CONDUCT.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CODE_OF_CONDUCT.md; sourceTree = ""; }; + OBJ_132 /* codecov.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = codecov.yml; sourceTree = ""; }; + OBJ_133 /* XMLCoder.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = XMLCoder.podspec; sourceTree = ""; }; + OBJ_134 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + OBJ_135 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + OBJ_136 /* test_swiftpm.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = test_swiftpm.sh; sourceTree = ""; }; + OBJ_137 /* test_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = test_xcodebuild.sh; sourceTree = ""; }; + OBJ_138 /* lint.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = lint.sh; sourceTree = ""; }; + OBJ_139 /* azure-pipelines.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = "azure-pipelines.yml"; sourceTree = ""; }; + OBJ_14 /* ChoiceBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChoiceBox.swift; sourceTree = ""; }; + OBJ_140 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + OBJ_141 /* docs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = docs.sh; sourceTree = ""; }; + OBJ_142 /* pod.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = pod.sh; sourceTree = ""; }; + OBJ_15 /* DataBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataBox.swift; sourceTree = ""; }; + OBJ_16 /* DateBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateBox.swift; sourceTree = ""; }; + OBJ_17 /* DecimalBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecimalBox.swift; sourceTree = ""; }; + OBJ_18 /* FloatBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatBox.swift; sourceTree = ""; }; + OBJ_19 /* IntBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntBox.swift; sourceTree = ""; }; + OBJ_20 /* KeyedBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedBox.swift; sourceTree = ""; }; + OBJ_21 /* NullBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullBox.swift; sourceTree = ""; }; + OBJ_22 /* SharedBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedBox.swift; sourceTree = ""; }; + OBJ_23 /* SingleKeyedBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleKeyedBox.swift; sourceTree = ""; }; + OBJ_24 /* StringBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringBox.swift; sourceTree = ""; }; + OBJ_25 /* UIntBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIntBox.swift; sourceTree = ""; }; + OBJ_26 /* URLBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLBox.swift; sourceTree = ""; }; + OBJ_27 /* UnkeyedBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnkeyedBox.swift; sourceTree = ""; }; + OBJ_28 /* ISO8601DateFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISO8601DateFormatter.swift; sourceTree = ""; }; + OBJ_29 /* KeyedStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedStorage.swift; sourceTree = ""; }; + OBJ_30 /* Metatypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Metatypes.swift; sourceTree = ""; }; + OBJ_31 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; + OBJ_32 /* XMLChoiceCodingKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLChoiceCodingKey.swift; sourceTree = ""; }; + OBJ_33 /* XMLCoderElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLCoderElement.swift; sourceTree = ""; }; + OBJ_34 /* XMLHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLHeader.swift; sourceTree = ""; }; + OBJ_35 /* XMLKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKey.swift; sourceTree = ""; }; + OBJ_36 /* XMLStackParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLStackParser.swift; sourceTree = ""; }; + OBJ_38 /* DecodingErrorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodingErrorExtension.swift; sourceTree = ""; }; + OBJ_39 /* DynamicNodeDecoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeDecoding.swift; sourceTree = ""; }; + OBJ_40 /* SingleValueDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleValueDecodingContainer.swift; sourceTree = ""; }; + OBJ_41 /* XMLChoiceDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLChoiceDecodingContainer.swift; sourceTree = ""; }; + OBJ_42 /* XMLDecoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLDecoder.swift; sourceTree = ""; }; + OBJ_43 /* XMLDecoderImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLDecoderImplementation.swift; sourceTree = ""; }; + OBJ_44 /* XMLDecodingStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLDecodingStorage.swift; sourceTree = ""; }; + OBJ_45 /* XMLKeyedDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKeyedDecodingContainer.swift; sourceTree = ""; }; + OBJ_46 /* XMLUnkeyedDecodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLUnkeyedDecodingContainer.swift; sourceTree = ""; }; + OBJ_48 /* DynamicNodeEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeEncoding.swift; sourceTree = ""; }; + OBJ_49 /* EncodingErrorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodingErrorExtension.swift; sourceTree = ""; }; + OBJ_50 /* SingleValueEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleValueEncodingContainer.swift; sourceTree = ""; }; + OBJ_51 /* XMLChoiceEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLChoiceEncodingContainer.swift; sourceTree = ""; }; + OBJ_52 /* XMLEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncoder.swift; sourceTree = ""; }; + OBJ_53 /* XMLEncoderImplementation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncoderImplementation.swift; sourceTree = ""; }; + OBJ_54 /* XMLEncodingStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLEncodingStorage.swift; sourceTree = ""; }; + OBJ_55 /* XMLKeyedEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKeyedEncodingContainer.swift; sourceTree = ""; }; + OBJ_56 /* XMLReferencingEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLReferencingEncoder.swift; sourceTree = ""; }; + OBJ_57 /* XMLUnkeyedEncodingContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLUnkeyedEncodingContainer.swift; sourceTree = ""; }; OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + OBJ_60 /* AttributedEnumIntrinsicTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedEnumIntrinsicTest.swift; sourceTree = ""; }; + OBJ_61 /* AttributedIntrinsicTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedIntrinsicTest.swift; sourceTree = ""; }; + OBJ_63 /* String+ExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ExtensionsTests.swift"; sourceTree = ""; }; + OBJ_64 /* XMLElementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLElementTests.swift; sourceTree = ""; }; + OBJ_65 /* XMLHeaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLHeaderTests.swift; sourceTree = ""; }; + OBJ_66 /* XMLKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLKeyTests.swift; sourceTree = ""; }; + OBJ_67 /* XMLStackParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XMLStackParserTests.swift; sourceTree = ""; }; + OBJ_68 /* BenchmarkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BenchmarkTests.swift; sourceTree = ""; }; + OBJ_69 /* BooksTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooksTest.swift; sourceTree = ""; }; + OBJ_70 /* BorderTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderTest.swift; sourceTree = ""; }; + OBJ_72 /* BoolBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoolBoxTests.swift; sourceTree = ""; }; + OBJ_73 /* DataBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataBoxTests.swift; sourceTree = ""; }; + OBJ_74 /* DateBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateBoxTests.swift; sourceTree = ""; }; + OBJ_75 /* DecimalBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecimalBoxTests.swift; sourceTree = ""; }; + OBJ_76 /* FloatBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatBoxTests.swift; sourceTree = ""; }; + OBJ_77 /* IntBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntBoxTests.swift; sourceTree = ""; }; + OBJ_78 /* KeyedBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyedBoxTests.swift; sourceTree = ""; }; + OBJ_79 /* NullBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullBoxTests.swift; sourceTree = ""; }; + OBJ_80 /* SharedBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedBoxTests.swift; sourceTree = ""; }; + OBJ_81 /* StringBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringBoxTests.swift; sourceTree = ""; }; + OBJ_82 /* UIntBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIntBoxTests.swift; sourceTree = ""; }; + OBJ_83 /* URLBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLBoxTests.swift; sourceTree = ""; }; + OBJ_84 /* UnkeyedBoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnkeyedBoxTests.swift; sourceTree = ""; }; + OBJ_85 /* BreakfastTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreakfastTest.swift; sourceTree = ""; }; + OBJ_86 /* CDCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDCatalog.swift; sourceTree = ""; }; + OBJ_87 /* CDTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CDTest.swift; sourceTree = ""; }; + OBJ_88 /* ClassTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClassTests.swift; sourceTree = ""; }; + OBJ_89 /* CompositeChoiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositeChoiceTests.swift; sourceTree = ""; }; + OBJ_9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + OBJ_90 /* DecodingContainerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodingContainerTests.swift; sourceTree = ""; }; + OBJ_91 /* DynamicNodeDecodingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeDecodingTest.swift; sourceTree = ""; }; + OBJ_92 /* DynamicNodeEncodingTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicNodeEncodingTest.swift; sourceTree = ""; }; + OBJ_93 /* ErrorContextTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorContextTest.swift; sourceTree = ""; }; + OBJ_94 /* KeyDecodingAndEncodingStrategyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyDecodingAndEncodingStrategyTests.swift; sourceTree = ""; }; + OBJ_96 /* BoolTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoolTests.swift; sourceTree = ""; }; + OBJ_97 /* BoxTreeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxTreeTests.swift; sourceTree = ""; }; + OBJ_98 /* DataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataTests.swift; sourceTree = ""; }; + OBJ_99 /* DateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTests.swift; sourceTree = ""; }; "XMLCoder::XMLCoder::Product" /* XMLCoder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = XMLCoder.framework; sourceTree = BUILT_PRODUCTS_DIR; }; "XMLCoder::XMLCoderTests::Product" /* XMLCoderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = XMLCoderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - OBJ_62 /* Frameworks */ = { + OBJ_192 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_91 /* Frameworks */ = { + OBJ_274 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; files = ( - OBJ_92 /* XMLCoder.framework in Frameworks */, + OBJ_275 /* XMLCoder.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - BF63EEFE21CCDEC1001D38C5 /* Auxiliary */ = { + OBJ_10 /* Auxiliaries */ = { isa = PBXGroup; children = ( - BF63EF6621D0F874001D38C5 /* XMLKeyTests.swift */, - BF63EEFF21CCDED2001D38C5 /* XMLStackParserTests.swift */, - BF63EF6821D0FDB5001D38C5 /* XMLHeaderTests.swift */, - BF63EF6A21D10284001D38C5 /* XMLElementTests.swift */, - B34B3C07220381AB00BCBA30 /* String+ExtensionsTests.swift */, + OBJ_11 /* Box */, + OBJ_28 /* ISO8601DateFormatter.swift */, + OBJ_29 /* KeyedStorage.swift */, + OBJ_30 /* Metatypes.swift */, + OBJ_31 /* String+Extensions.swift */, + OBJ_32 /* XMLChoiceCodingKey.swift */, + OBJ_33 /* XMLCoderElement.swift */, + OBJ_34 /* XMLHeader.swift */, + OBJ_35 /* XMLKey.swift */, + OBJ_36 /* XMLStackParser.swift */, ); - path = Auxiliary; + path = Auxiliaries; sourceTree = ""; }; - BF94578721CBB454005ACFDE /* Box */ = { + OBJ_11 /* Box */ = { isa = PBXGroup; children = ( - BF9457A421CBB497005ACFDE /* Box.swift */, - BF94579E21CBB497005ACFDE /* NullBox.swift */, - BF9457A321CBB497005ACFDE /* BoolBox.swift */, - BF9457D421CBB59D005ACFDE /* IntBox.swift */, - BF9457D221CBB59D005ACFDE /* UIntBox.swift */, - BF9457A121CBB497005ACFDE /* DecimalBox.swift */, - BF9457D321CBB59D005ACFDE /* FloatBox.swift */, - BF9457A521CBB498005ACFDE /* StringBox.swift */, - BF9457D821CBB5D2005ACFDE /* DataBox.swift */, - BF9457D921CBB5D2005ACFDE /* DateBox.swift */, - BF63EF0521CD7A74001D38C5 /* URLBox.swift */, - BF9457A021CBB497005ACFDE /* UnkeyedBox.swift */, - BF94579F21CBB497005ACFDE /* KeyedBox.swift */, - BF63EF1721CEB6BD001D38C5 /* SharedBox.swift */, + OBJ_12 /* BoolBox.swift */, + OBJ_13 /* Box.swift */, + OBJ_14 /* ChoiceBox.swift */, + OBJ_15 /* DataBox.swift */, + OBJ_16 /* DateBox.swift */, + OBJ_17 /* DecimalBox.swift */, + OBJ_18 /* FloatBox.swift */, + OBJ_19 /* IntBox.swift */, + OBJ_20 /* KeyedBox.swift */, + OBJ_21 /* NullBox.swift */, + OBJ_22 /* SharedBox.swift */, + OBJ_23 /* SingleKeyedBox.swift */, + OBJ_24 /* StringBox.swift */, + OBJ_25 /* UIntBox.swift */, + OBJ_26 /* URLBox.swift */, + OBJ_27 /* UnkeyedBox.swift */, ); path = Box; sourceTree = ""; }; - BF9457B021CBB4DB005ACFDE /* Auxiliaries */ = { + OBJ_128 /* Products */ = { isa = PBXGroup; children = ( - BF94578721CBB454005ACFDE /* Box */, - BF9457B421CBB4DB005ACFDE /* ISO8601DateFormatter.swift */, - D1EC3E64225A38EC00C610E3 /* KeyedStorage.swift */, - D1E0C85421D91EBF0042A261 /* Metatypes.swift */, - BF9457B221CBB4DB005ACFDE /* String+Extensions.swift */, - BF9457B621CBB4DB005ACFDE /* XMLCoderElement.swift */, - BF9457B121CBB4DB005ACFDE /* XMLHeader.swift */, - BF9457B321CBB4DB005ACFDE /* XMLStackParser.swift */, - BF9457B521CBB4DB005ACFDE /* XMLKey.swift */, + "XMLCoder::XMLCoderTests::Product" /* XMLCoderTests.xctest */, + "XMLCoder::XMLCoder::Product" /* XMLCoder.framework */, ); - path = Auxiliaries; - sourceTree = ""; + name = Products; + sourceTree = BUILT_PRODUCTS_DIR; }; - BF9457BD21CBB516005ACFDE /* Box */ = { + OBJ_37 /* Decoder */ = { isa = PBXGroup; children = ( - BF9457C221CBB516005ACFDE /* NullBoxTests.swift */, - BF9457BE21CBB516005ACFDE /* BoolBoxTests.swift */, - BF9457C521CBB516005ACFDE /* IntBoxTests.swift */, - BF9457C621CBB516005ACFDE /* UIntBoxTests.swift */, - BF9457C121CBB516005ACFDE /* DecimalBoxTests.swift */, - BF9457C321CBB516005ACFDE /* FloatBoxTests.swift */, - BF9457C421CBB516005ACFDE /* StringBoxTests.swift */, - BF9457DE21CBB683005ACFDE /* DataBoxTests.swift */, - BF9457DC21CBB62C005ACFDE /* DateBoxTests.swift */, - BF63EF0721CD7AF8001D38C5 /* URLBoxTests.swift */, - BF9457C721CBB516005ACFDE /* UnkeyedBoxTests.swift */, - BF9457BF21CBB516005ACFDE /* KeyedBoxTests.swift */, - BF8171F121D3D03E00901EB0 /* SharedBoxTests.swift */, + OBJ_38 /* DecodingErrorExtension.swift */, + OBJ_39 /* DynamicNodeDecoding.swift */, + OBJ_40 /* SingleValueDecodingContainer.swift */, + OBJ_41 /* XMLChoiceDecodingContainer.swift */, + OBJ_42 /* XMLDecoder.swift */, + OBJ_43 /* XMLDecoderImplementation.swift */, + OBJ_44 /* XMLDecodingStorage.swift */, + OBJ_45 /* XMLKeyedDecodingContainer.swift */, + OBJ_46 /* XMLUnkeyedDecodingContainer.swift */, ); - path = Box; + path = Decoder; sourceTree = ""; }; - BF9457E121CBB6BC005ACFDE /* Minimal */ = { + OBJ_47 /* Encoder */ = { isa = PBXGroup; children = ( - BF9457E221CBB6BC005ACFDE /* BoolTests.swift */, - BF9457EC21CBB6BC005ACFDE /* DataTests.swift */, - BF9457E821CBB6BC005ACFDE /* DateTests.swift */, - BF9457EA21CBB6BC005ACFDE /* DecimalTests.swift */, - BF63EF0B21CD7F28001D38C5 /* EmptyTests.swift */, - BF9457E621CBB6BC005ACFDE /* FloatTests.swift */, - BF9457E321CBB6BC005ACFDE /* IntTests.swift */, - A61FE03A21E4EA8B0015D993 /* KeyedIntTests.swift */, - BF9457EB21CBB6BC005ACFDE /* KeyedTests.swift */, - BF9457E421CBB6BC005ACFDE /* NullTests.swift */, - D162674121F9B2850056D1D8 /* OptionalTests.swift */, - BF9457E521CBB6BC005ACFDE /* StringTests.swift */, - BF9457E921CBB6BC005ACFDE /* UIntTests.swift */, - A61FE03721E4D4F10015D993 /* UnkeyedIntTests.swift */, - BF9457E721CBB6BC005ACFDE /* UnkeyedTests.swift */, - BF63EF0921CD7C1A001D38C5 /* URLTests.swift */, - D1EC3E61225A32F500C610E3 /* BoxTreeTests.swift */, + OBJ_48 /* DynamicNodeEncoding.swift */, + OBJ_49 /* EncodingErrorExtension.swift */, + OBJ_50 /* SingleValueEncodingContainer.swift */, + OBJ_51 /* XMLChoiceEncodingContainer.swift */, + OBJ_52 /* XMLEncoder.swift */, + OBJ_53 /* XMLEncoderImplementation.swift */, + OBJ_54 /* XMLEncodingStorage.swift */, + OBJ_55 /* XMLKeyedEncodingContainer.swift */, + OBJ_56 /* XMLReferencingEncoder.swift */, + OBJ_57 /* XMLUnkeyedEncodingContainer.swift */, ); - path = Minimal; + path = Encoder; sourceTree = ""; }; - OBJ_15 /* Encoder */ = { + OBJ_5 /* */ = { isa = PBXGroup; children = ( - B35157CD21F986DD009CA0CC /* DynamicNodeEncoding.swift */, - OBJ_16 /* EncodingErrorExtension.swift */, - B3BE1D642202CB7200259831 /* SingleValueEncodingContainer.swift */, - OBJ_17 /* XMLEncoder.swift */, - B3BE1D622202CB1400259831 /* XMLEncoderImplementation.swift */, - OBJ_18 /* XMLEncodingStorage.swift */, - OBJ_19 /* XMLKeyedEncodingContainer.swift */, - OBJ_20 /* XMLReferencingEncoder.swift */, - OBJ_21 /* XMLUnkeyedEncodingContainer.swift */, - ); - path = Encoder; + OBJ_6 /* Package.swift */, + OBJ_7 /* Sources */, + OBJ_58 /* Tests */, + OBJ_128 /* Products */, + OBJ_131 /* CODE_OF_CONDUCT.md */, + OBJ_132 /* codecov.yml */, + OBJ_133 /* XMLCoder.podspec */, + OBJ_134 /* LICENSE */, + OBJ_135 /* CHANGELOG.md */, + OBJ_136 /* test_swiftpm.sh */, + OBJ_137 /* test_xcodebuild.sh */, + OBJ_138 /* lint.sh */, + OBJ_139 /* azure-pipelines.yml */, + OBJ_140 /* README.md */, + OBJ_141 /* docs.sh */, + OBJ_142 /* pod.sh */, + ); + name = ""; sourceTree = ""; }; - OBJ_25 /* Tests */ = { + OBJ_58 /* Tests */ = { isa = PBXGroup; children = ( - OBJ_26 /* XMLCoderTests */, + OBJ_59 /* XMLCoderTests */, ); name = Tests; sourceTree = SOURCE_ROOT; }; - OBJ_26 /* XMLCoderTests */ = { + OBJ_59 /* XMLCoderTests */ = { isa = PBXGroup; children = ( - BF63EEFE21CCDEC1001D38C5 /* Auxiliary */, - BF9457BD21CBB516005ACFDE /* Box */, - BF9457E121CBB6BC005ACFDE /* Minimal */, - D1AC9464224E3E1F004AB49B /* AttributedEnumIntrinsicTest.swift */, - B3B6902D220A71DF0084D407 /* AttributedIntrinsicTest.swift */, - BF63EF1D21CEC99A001D38C5 /* BenchmarkTests.swift */, - OBJ_28 /* BooksTest.swift */, - D1B6A2C02297EF5A005B8A6E /* BorderTest.swift */, - OBJ_29 /* BreakfastTest.swift */, - OBJ_30 /* CDCatalog.swift */, - OBJ_31 /* CDTest.swift */, - A61DCCD621DF8DB300C0A19D /* ClassTests.swift */, - BF8171CF21D3B1BD00901EB0 /* DecodingContainerTests.swift */, - D1761D1E2247F04500F53CEF /* DynamicNodeDecodingTest.swift */, - B3BE1D602202C1F600259831 /* DynamicNodeEncodingTest.swift */, - D1E0C85121D8E6540042A261 /* ErrorContextTest.swift */, - D1CFC8222226AFB400B03222 /* NamespaceTest.swift */, - D1D50D3022942EAE007098FC /* NestingTests.swift */, - OBJ_33 /* NodeEncodingStrategyTests.swift */, - OBJ_34 /* NoteTest.swift */, - OBJ_35 /* PlantCatalog.swift */, - OBJ_36 /* PlantTest.swift */, - OBJ_38 /* RelationshipsTest.swift */, - D1FC040421C7EF8200065B43 /* RJISample.swift */, - OBJ_37 /* RJITest.swift */, - D14D8A8521F1D6B300B0D31A /* SingleChildTests.swift */, - D11815BF227788BA008836E4 /* SpacePreserveTest.swift */, - D1A3D4AB227AD9BC00F28969 /* KeyDecodingAndEncodingStrategyTests.swift */, - D1CAD3612293FAB80077901D /* MixedContainerTest.swift */, + OBJ_60 /* AttributedEnumIntrinsicTest.swift */, + OBJ_61 /* AttributedIntrinsicTest.swift */, + OBJ_62 /* Auxiliary */, + OBJ_68 /* BenchmarkTests.swift */, + OBJ_69 /* BooksTest.swift */, + OBJ_70 /* BorderTest.swift */, + OBJ_71 /* Box */, + OBJ_85 /* BreakfastTest.swift */, + OBJ_86 /* CDCatalog.swift */, + OBJ_87 /* CDTest.swift */, + OBJ_88 /* ClassTests.swift */, + OBJ_89 /* CompositeChoiceTests.swift */, + OBJ_90 /* DecodingContainerTests.swift */, + OBJ_91 /* DynamicNodeDecodingTest.swift */, + OBJ_92 /* DynamicNodeEncodingTest.swift */, + OBJ_93 /* ErrorContextTest.swift */, + OBJ_94 /* KeyDecodingAndEncodingStrategyTests.swift */, + OBJ_95 /* Minimal */, + OBJ_113 /* MixedContainerTest.swift */, + OBJ_114 /* NamespaceTest.swift */, + OBJ_115 /* NestedAttributeChoiceTests.swift */, + OBJ_116 /* NestedChoiceTests.swift */, + OBJ_117 /* NestingTests.swift */, + OBJ_118 /* NodeEncodingStrategyTests.swift */, + OBJ_119 /* NoteTest.swift */, + OBJ_120 /* PlantCatalog.swift */, + OBJ_121 /* PlantTest.swift */, + OBJ_122 /* RJISample.swift */, + OBJ_123 /* RJITest.swift */, + OBJ_124 /* RelationshipsTest.swift */, + OBJ_125 /* SimpleChoiceTests.swift */, + OBJ_126 /* SingleChildTests.swift */, + OBJ_127 /* SpacePreserveTest.swift */, ); name = XMLCoderTests; path = Tests/XMLCoderTests; sourceTree = SOURCE_ROOT; }; - OBJ_40 /* Products */ = { - isa = PBXGroup; - children = ( - "XMLCoder::XMLCoderTests::Product" /* XMLCoderTests.xctest */, - "XMLCoder::XMLCoder::Product" /* XMLCoder.framework */, - ); - name = Products; - sourceTree = BUILT_PRODUCTS_DIR; - }; - OBJ_5 = { + OBJ_62 /* Auxiliary */ = { isa = PBXGroup; children = ( - D1EC3E63225A334C00C610E3 /* LICENSE */, - D11979B721F5EA5400A9C574 /* XMLCoder.podspec */, - D11979B521F5CD2500A9C574 /* CHANGELOG.md */, - D11979B621F5CD2500A9C574 /* README.md */, - OBJ_6 /* Package.swift */, - OBJ_7 /* Sources */, - OBJ_25 /* Tests */, - OBJ_40 /* Products */, + OBJ_63 /* String+ExtensionsTests.swift */, + OBJ_64 /* XMLElementTests.swift */, + OBJ_65 /* XMLHeaderTests.swift */, + OBJ_66 /* XMLKeyTests.swift */, + OBJ_67 /* XMLStackParserTests.swift */, ); - indentWidth = 4; + path = Auxiliary; sourceTree = ""; - tabWidth = 4; }; OBJ_7 /* Sources */ = { isa = PBXGroup; @@ -458,30 +472,60 @@ name = Sources; sourceTree = SOURCE_ROOT; }; + OBJ_71 /* Box */ = { + isa = PBXGroup; + children = ( + OBJ_72 /* BoolBoxTests.swift */, + OBJ_73 /* DataBoxTests.swift */, + OBJ_74 /* DateBoxTests.swift */, + OBJ_75 /* DecimalBoxTests.swift */, + OBJ_76 /* FloatBoxTests.swift */, + OBJ_77 /* IntBoxTests.swift */, + OBJ_78 /* KeyedBoxTests.swift */, + OBJ_79 /* NullBoxTests.swift */, + OBJ_80 /* SharedBoxTests.swift */, + OBJ_81 /* StringBoxTests.swift */, + OBJ_82 /* UIntBoxTests.swift */, + OBJ_83 /* URLBoxTests.swift */, + OBJ_84 /* UnkeyedBoxTests.swift */, + ); + path = Box; + sourceTree = ""; + }; OBJ_8 /* XMLCoder */ = { isa = PBXGroup; children = ( - BF9457B021CBB4DB005ACFDE /* Auxiliaries */, - OBJ_9 /* Decoder */, - OBJ_15 /* Encoder */, + OBJ_9 /* Info.plist */, + OBJ_10 /* Auxiliaries */, + OBJ_37 /* Decoder */, + OBJ_47 /* Encoder */, ); name = XMLCoder; path = Sources/XMLCoder; sourceTree = SOURCE_ROOT; }; - OBJ_9 /* Decoder */ = { + OBJ_95 /* Minimal */ = { isa = PBXGroup; children = ( - OBJ_10 /* DecodingErrorExtension.swift */, - D158F12E2229892C0032B449 /* DynamicNodeDecoding.swift */, - B3BE1D672202CBF800259831 /* SingleValueDecodingContainer.swift */, - OBJ_11 /* XMLDecoder.swift */, - B3BE1D662202CBF800259831 /* XMLDecoderImplementation.swift */, - OBJ_12 /* XMLDecodingStorage.swift */, - OBJ_13 /* XMLKeyedDecodingContainer.swift */, - OBJ_14 /* XMLUnkeyedDecodingContainer.swift */, + OBJ_96 /* BoolTests.swift */, + OBJ_97 /* BoxTreeTests.swift */, + OBJ_98 /* DataTests.swift */, + OBJ_99 /* DateTests.swift */, + OBJ_100 /* DecimalTests.swift */, + OBJ_101 /* EmptyTests.swift */, + OBJ_102 /* FloatTests.swift */, + OBJ_103 /* IntTests.swift */, + OBJ_104 /* KeyedIntTests.swift */, + OBJ_105 /* KeyedTests.swift */, + OBJ_106 /* NullTests.swift */, + OBJ_107 /* OptionalTests.swift */, + OBJ_108 /* StringTests.swift */, + OBJ_109 /* UIntTests.swift */, + OBJ_110 /* URLTests.swift */, + OBJ_111 /* UnkeyedIntTests.swift */, + OBJ_112 /* UnkeyedTests.swift */, ); - path = Decoder; + path = Minimal; sourceTree = ""; }; /* End PBXGroup section */ @@ -489,9 +533,9 @@ /* Begin PBXNativeTarget section */ "XMLCoder::SwiftPMPackageDescription" /* XMLCoderPackageDescription */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_64 /* Build configuration list for PBXNativeTarget "XMLCoderPackageDescription" */; + buildConfigurationList = OBJ_194 /* Build configuration list for PBXNativeTarget "XMLCoderPackageDescription" */; buildPhases = ( - OBJ_67 /* Sources */, + OBJ_197 /* Sources */, ); buildRules = ( ); @@ -503,11 +547,10 @@ }; "XMLCoder::XMLCoder" /* XMLCoder */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_44 /* Build configuration list for PBXNativeTarget "XMLCoder" */; + buildConfigurationList = OBJ_144 /* Build configuration list for PBXNativeTarget "XMLCoder" */; buildPhases = ( - OBJ_47 /* Sources */, - OBJ_62 /* Frameworks */, - D1543A8921CEB96E0039D8EC /* ShellScript */, + OBJ_147 /* Sources */, + OBJ_192 /* Frameworks */, ); buildRules = ( ); @@ -520,15 +563,15 @@ }; "XMLCoder::XMLCoderTests" /* XMLCoderTests */ = { isa = PBXNativeTarget; - buildConfigurationList = OBJ_75 /* Build configuration list for PBXNativeTarget "XMLCoderTests" */; + buildConfigurationList = OBJ_205 /* Build configuration list for PBXNativeTarget "XMLCoderTests" */; buildPhases = ( - OBJ_78 /* Sources */, - OBJ_91 /* Frameworks */, + OBJ_208 /* Sources */, + OBJ_274 /* Frameworks */, ); buildRules = ( ); dependencies = ( - OBJ_93 /* PBXTargetDependency */, + OBJ_276 /* PBXTargetDependency */, ); name = XMLCoderTests; productName = XMLCoderTests; @@ -541,15 +584,8 @@ OBJ_1 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftMigration = 9999; LastUpgradeCheck = 9999; - TargetAttributes = { - "XMLCoder::XMLCoder" = { - LastSwiftMigration = 1010; - }; - "XMLCoder::XMLCoderTests" = { - LastSwiftMigration = 1010; - }; - }; }; buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "XMLCoder" */; compatibilityVersion = "Xcode 3.2"; @@ -559,8 +595,8 @@ English, en, ); - mainGroup = OBJ_5; - productRefGroup = OBJ_40 /* Products */; + mainGroup = OBJ_5 /* */; + productRefGroup = OBJ_128 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -572,220 +608,155 @@ }; /* End PBXProject section */ -/* Begin PBXShellScriptBuildPhase section */ - D1543A8921CEB96E0039D8EC /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ - OBJ_47 /* Sources */ = { + OBJ_147 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - B3BE1D632202CB1400259831 /* XMLEncoderImplementation.swift in Sources */, - BF9457D621CBB59E005ACFDE /* FloatBox.swift in Sources */, - BF9457B721CBB4DB005ACFDE /* XMLHeader.swift in Sources */, - B3BE1D692202CBF800259831 /* SingleValueDecodingContainer.swift in Sources */, - BF9457BB21CBB4DB005ACFDE /* XMLKey.swift in Sources */, - OBJ_48 /* DecodingErrorExtension.swift in Sources */, - BF63EF1821CEB6BD001D38C5 /* SharedBox.swift in Sources */, - B3BE1D682202CBF800259831 /* XMLDecoderImplementation.swift in Sources */, - BF9457DB21CBB5D2005ACFDE /* DateBox.swift in Sources */, - BF63EF0621CD7A74001D38C5 /* URLBox.swift in Sources */, - OBJ_49 /* XMLDecoder.swift in Sources */, - OBJ_50 /* XMLDecodingStorage.swift in Sources */, - B3BE1D652202CB7200259831 /* SingleValueEncodingContainer.swift in Sources */, - BF9457D521CBB59E005ACFDE /* UIntBox.swift in Sources */, - D1EC3E65225A38EC00C610E3 /* KeyedStorage.swift in Sources */, - OBJ_51 /* XMLKeyedDecodingContainer.swift in Sources */, - OBJ_52 /* XMLUnkeyedDecodingContainer.swift in Sources */, - OBJ_53 /* EncodingErrorExtension.swift in Sources */, - BF9457B921CBB4DB005ACFDE /* XMLStackParser.swift in Sources */, - OBJ_54 /* XMLEncoder.swift in Sources */, - B35157CE21F986DD009CA0CC /* DynamicNodeEncoding.swift in Sources */, - BF9457BA21CBB4DB005ACFDE /* ISO8601DateFormatter.swift in Sources */, - OBJ_55 /* XMLEncodingStorage.swift in Sources */, - BF9457A921CBB498005ACFDE /* KeyedBox.swift in Sources */, - BF9457D721CBB59E005ACFDE /* IntBox.swift in Sources */, - BF9457AD21CBB498005ACFDE /* BoolBox.swift in Sources */, - BF9457B821CBB4DB005ACFDE /* String+Extensions.swift in Sources */, - BF9457AE21CBB498005ACFDE /* Box.swift in Sources */, - BF9457DA21CBB5D2005ACFDE /* DataBox.swift in Sources */, - BF9457AB21CBB498005ACFDE /* DecimalBox.swift in Sources */, - OBJ_56 /* XMLKeyedEncodingContainer.swift in Sources */, - D158F12F2229892C0032B449 /* DynamicNodeDecoding.swift in Sources */, - D1E0C85521D91EBF0042A261 /* Metatypes.swift in Sources */, - OBJ_57 /* XMLReferencingEncoder.swift in Sources */, - BF9457BC21CBB4DB005ACFDE /* XMLCoderElement.swift in Sources */, - BF9457AA21CBB498005ACFDE /* UnkeyedBox.swift in Sources */, - BF9457AF21CBB498005ACFDE /* StringBox.swift in Sources */, - OBJ_58 /* XMLUnkeyedEncodingContainer.swift in Sources */, - BF9457A821CBB498005ACFDE /* NullBox.swift in Sources */, + OBJ_148 /* BoolBox.swift in Sources */, + OBJ_149 /* Box.swift in Sources */, + OBJ_150 /* ChoiceBox.swift in Sources */, + OBJ_151 /* DataBox.swift in Sources */, + OBJ_152 /* DateBox.swift in Sources */, + OBJ_153 /* DecimalBox.swift in Sources */, + OBJ_154 /* FloatBox.swift in Sources */, + OBJ_155 /* IntBox.swift in Sources */, + OBJ_156 /* KeyedBox.swift in Sources */, + OBJ_157 /* NullBox.swift in Sources */, + OBJ_158 /* SharedBox.swift in Sources */, + OBJ_159 /* SingleKeyedBox.swift in Sources */, + OBJ_160 /* StringBox.swift in Sources */, + OBJ_161 /* UIntBox.swift in Sources */, + OBJ_162 /* URLBox.swift in Sources */, + OBJ_163 /* UnkeyedBox.swift in Sources */, + OBJ_164 /* ISO8601DateFormatter.swift in Sources */, + OBJ_165 /* KeyedStorage.swift in Sources */, + OBJ_166 /* Metatypes.swift in Sources */, + OBJ_167 /* String+Extensions.swift in Sources */, + OBJ_168 /* XMLChoiceCodingKey.swift in Sources */, + OBJ_169 /* XMLCoderElement.swift in Sources */, + OBJ_170 /* XMLHeader.swift in Sources */, + OBJ_171 /* XMLKey.swift in Sources */, + OBJ_172 /* XMLStackParser.swift in Sources */, + OBJ_173 /* DecodingErrorExtension.swift in Sources */, + OBJ_174 /* DynamicNodeDecoding.swift in Sources */, + OBJ_175 /* SingleValueDecodingContainer.swift in Sources */, + OBJ_176 /* XMLChoiceDecodingContainer.swift in Sources */, + OBJ_177 /* XMLDecoder.swift in Sources */, + OBJ_178 /* XMLDecoderImplementation.swift in Sources */, + OBJ_179 /* XMLDecodingStorage.swift in Sources */, + OBJ_180 /* XMLKeyedDecodingContainer.swift in Sources */, + OBJ_181 /* XMLUnkeyedDecodingContainer.swift in Sources */, + OBJ_182 /* DynamicNodeEncoding.swift in Sources */, + OBJ_183 /* EncodingErrorExtension.swift in Sources */, + OBJ_184 /* SingleValueEncodingContainer.swift in Sources */, + OBJ_185 /* XMLChoiceEncodingContainer.swift in Sources */, + OBJ_186 /* XMLEncoder.swift in Sources */, + OBJ_187 /* XMLEncoderImplementation.swift in Sources */, + OBJ_188 /* XMLEncodingStorage.swift in Sources */, + OBJ_189 /* XMLKeyedEncodingContainer.swift in Sources */, + OBJ_190 /* XMLReferencingEncoder.swift in Sources */, + OBJ_191 /* XMLUnkeyedEncodingContainer.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_67 /* Sources */ = { + OBJ_197 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - OBJ_68 /* Package.swift in Sources */, + OBJ_198 /* Package.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - OBJ_78 /* Sources */ = { + OBJ_208 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; files = ( - BF9457CB21CBB516005ACFDE /* DecimalBoxTests.swift in Sources */, - BF9457F221CBB6BC005ACFDE /* UnkeyedTests.swift in Sources */, - A61FE03C21E4EAB10015D993 /* KeyedIntTests.swift in Sources */, - BF9457F321CBB6BC005ACFDE /* DateTests.swift in Sources */, - D1D50D3122942EAE007098FC /* NestingTests.swift in Sources */, - BF9457D121CBB516005ACFDE /* UnkeyedBoxTests.swift in Sources */, - BF63EF6921D0FDB5001D38C5 /* XMLHeaderTests.swift in Sources */, - BF9457F021CBB6BC005ACFDE /* StringTests.swift in Sources */, - D14D8A8621F1D6B300B0D31A /* SingleChildTests.swift in Sources */, - A61FE03921E4D60B0015D993 /* UnkeyedIntTests.swift in Sources */, - BF63EF6B21D10284001D38C5 /* XMLElementTests.swift in Sources */, - BF9457ED21CBB6BC005ACFDE /* BoolTests.swift in Sources */, - B3B6902E220A71DF0084D407 /* AttributedIntrinsicTest.swift in Sources */, - D11815C1227788C8008836E4 /* SpacePreserveTest.swift in Sources */, - D1FC040521C7EF8200065B43 /* RJISample.swift in Sources */, - D1EC3E62225A32F500C610E3 /* BoxTreeTests.swift in Sources */, - BF63EF0A21CD7C1A001D38C5 /* URLTests.swift in Sources */, - BF9457CE21CBB516005ACFDE /* StringBoxTests.swift in Sources */, - D1CFC8242226B13F00B03222 /* NamespaceTest.swift in Sources */, - BF9457D021CBB516005ACFDE /* UIntBoxTests.swift in Sources */, - OBJ_80 /* BooksTest.swift in Sources */, - D1761D1F2247F04500F53CEF /* DynamicNodeDecodingTest.swift in Sources */, - OBJ_81 /* BreakfastTest.swift in Sources */, - OBJ_82 /* CDCatalog.swift in Sources */, - BF63EF0021CCDED2001D38C5 /* XMLStackParserTests.swift in Sources */, - BF9457CC21CBB516005ACFDE /* NullBoxTests.swift in Sources */, - BF63EF1E21CEC99B001D38C5 /* BenchmarkTests.swift in Sources */, - BF9457CF21CBB516005ACFDE /* IntBoxTests.swift in Sources */, - BF9457E021CBB68A005ACFDE /* DataBoxTests.swift in Sources */, - D162674321F9B2AF0056D1D8 /* OptionalTests.swift in Sources */, - D1A3D4AD227AD9BF00F28969 /* KeyDecodingAndEncodingStrategyTests.swift in Sources */, - BF9457F521CBB6BC005ACFDE /* DecimalTests.swift in Sources */, - OBJ_83 /* CDTest.swift in Sources */, - BF63EF6721D0F874001D38C5 /* XMLKeyTests.swift in Sources */, - OBJ_85 /* NodeEncodingStrategyTests.swift in Sources */, - D1B6A2C22297EF6F005B8A6E /* BorderTest.swift in Sources */, - OBJ_86 /* NoteTest.swift in Sources */, - BF63EF0C21CD7F28001D38C5 /* EmptyTests.swift in Sources */, - B34B3C08220381AC00BCBA30 /* String+ExtensionsTests.swift in Sources */, - B3BE1D612202C1F600259831 /* DynamicNodeEncodingTest.swift in Sources */, - BF9457F721CBB6BC005ACFDE /* DataTests.swift in Sources */, - BF9457EE21CBB6BC005ACFDE /* IntTests.swift in Sources */, - BF8171F221D3D03E00901EB0 /* SharedBoxTests.swift in Sources */, - OBJ_87 /* PlantCatalog.swift in Sources */, - BF9457C921CBB516005ACFDE /* KeyedBoxTests.swift in Sources */, - OBJ_88 /* PlantTest.swift in Sources */, - D1AC9466224E3E63004AB49B /* AttributedEnumIntrinsicTest.swift in Sources */, - BF63EF0821CD7AF8001D38C5 /* URLBoxTests.swift in Sources */, - BF9457DD21CBB62C005ACFDE /* DateBoxTests.swift in Sources */, - A61DCCD821DF9CA200C0A19D /* ClassTests.swift in Sources */, - BF9457CD21CBB516005ACFDE /* FloatBoxTests.swift in Sources */, - BF9457F621CBB6BC005ACFDE /* KeyedTests.swift in Sources */, - BF9457C821CBB516005ACFDE /* BoolBoxTests.swift in Sources */, - D1E0C85321D8E65E0042A261 /* ErrorContextTest.swift in Sources */, - D1CB1EF521EA9599009CAF02 /* RJITest.swift in Sources */, - BF9457F421CBB6BC005ACFDE /* UIntTests.swift in Sources */, - D1CAD3622293FAB80077901D /* MixedContainerTest.swift in Sources */, - BF9457F121CBB6BC005ACFDE /* FloatTests.swift in Sources */, - BF8171D021D3B1BD00901EB0 /* DecodingContainerTests.swift in Sources */, - BF9457EF21CBB6BC005ACFDE /* NullTests.swift in Sources */, - OBJ_90 /* RelationshipsTest.swift in Sources */, + OBJ_209 /* AttributedEnumIntrinsicTest.swift in Sources */, + OBJ_210 /* AttributedIntrinsicTest.swift in Sources */, + OBJ_211 /* String+ExtensionsTests.swift in Sources */, + OBJ_212 /* XMLElementTests.swift in Sources */, + OBJ_213 /* XMLHeaderTests.swift in Sources */, + OBJ_214 /* XMLKeyTests.swift in Sources */, + OBJ_215 /* XMLStackParserTests.swift in Sources */, + OBJ_216 /* BenchmarkTests.swift in Sources */, + OBJ_217 /* BooksTest.swift in Sources */, + OBJ_218 /* BorderTest.swift in Sources */, + OBJ_219 /* BoolBoxTests.swift in Sources */, + OBJ_220 /* DataBoxTests.swift in Sources */, + OBJ_221 /* DateBoxTests.swift in Sources */, + OBJ_222 /* DecimalBoxTests.swift in Sources */, + OBJ_223 /* FloatBoxTests.swift in Sources */, + OBJ_224 /* IntBoxTests.swift in Sources */, + OBJ_225 /* KeyedBoxTests.swift in Sources */, + OBJ_226 /* NullBoxTests.swift in Sources */, + OBJ_227 /* SharedBoxTests.swift in Sources */, + OBJ_228 /* StringBoxTests.swift in Sources */, + OBJ_229 /* UIntBoxTests.swift in Sources */, + OBJ_230 /* URLBoxTests.swift in Sources */, + OBJ_231 /* UnkeyedBoxTests.swift in Sources */, + OBJ_232 /* BreakfastTest.swift in Sources */, + OBJ_233 /* CDCatalog.swift in Sources */, + OBJ_234 /* CDTest.swift in Sources */, + OBJ_235 /* ClassTests.swift in Sources */, + OBJ_236 /* CompositeChoiceTests.swift in Sources */, + OBJ_237 /* DecodingContainerTests.swift in Sources */, + OBJ_238 /* DynamicNodeDecodingTest.swift in Sources */, + OBJ_239 /* DynamicNodeEncodingTest.swift in Sources */, + OBJ_240 /* ErrorContextTest.swift in Sources */, + OBJ_241 /* KeyDecodingAndEncodingStrategyTests.swift in Sources */, + OBJ_242 /* BoolTests.swift in Sources */, + OBJ_243 /* BoxTreeTests.swift in Sources */, + OBJ_244 /* DataTests.swift in Sources */, + OBJ_245 /* DateTests.swift in Sources */, + OBJ_246 /* DecimalTests.swift in Sources */, + OBJ_247 /* EmptyTests.swift in Sources */, + OBJ_248 /* FloatTests.swift in Sources */, + OBJ_249 /* IntTests.swift in Sources */, + OBJ_250 /* KeyedIntTests.swift in Sources */, + OBJ_251 /* KeyedTests.swift in Sources */, + OBJ_252 /* NullTests.swift in Sources */, + OBJ_253 /* OptionalTests.swift in Sources */, + OBJ_254 /* StringTests.swift in Sources */, + OBJ_255 /* UIntTests.swift in Sources */, + OBJ_256 /* URLTests.swift in Sources */, + OBJ_257 /* UnkeyedIntTests.swift in Sources */, + OBJ_258 /* UnkeyedTests.swift in Sources */, + OBJ_259 /* MixedContainerTest.swift in Sources */, + OBJ_260 /* NamespaceTest.swift in Sources */, + OBJ_261 /* NestedAttributeChoiceTests.swift in Sources */, + OBJ_262 /* NestedChoiceTests.swift in Sources */, + OBJ_263 /* NestingTests.swift in Sources */, + OBJ_264 /* NodeEncodingStrategyTests.swift in Sources */, + OBJ_265 /* NoteTest.swift in Sources */, + OBJ_266 /* PlantCatalog.swift in Sources */, + OBJ_267 /* PlantTest.swift in Sources */, + OBJ_268 /* RJISample.swift in Sources */, + OBJ_269 /* RJITest.swift in Sources */, + OBJ_270 /* RelationshipsTest.swift in Sources */, + OBJ_271 /* SimpleChoiceTests.swift in Sources */, + OBJ_272 /* SingleChildTests.swift in Sources */, + OBJ_273 /* SpacePreserveTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - OBJ_73 /* PBXTargetDependency */ = { + OBJ_203 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = "XMLCoder::XMLCoderTests" /* XMLCoderTests */; - targetProxy = D1FC040321C7EF2300065B43 /* PBXContainerItemProxy */; + targetProxy = 143B746222ED4A67005D7765 /* PBXContainerItemProxy */; }; - OBJ_93 /* PBXTargetDependency */ = { + OBJ_276 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = "XMLCoder::XMLCoder" /* XMLCoder */; - targetProxy = D1FC040221C7ED2300065B43 /* PBXContainerItemProxy */; + targetProxy = 143B746122ED4A67005D7765 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - OBJ_3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.7.0; - DEBUG_INFORMATION_FORMAT = dwarf; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - ONLY_ACTIVE_ARCH = YES; - OTHER_SWIFT_FLAGS = "-DXcode"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "SWIFT_PACKAGE DEBUG"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TVOS_DEPLOYMENT_TARGET = 9.0; - USE_HEADERMAP = NO; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Debug; - }; - OBJ_4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 0.7.0; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_OPTIMIZATION_LEVEL = s; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - OTHER_SWIFT_FLAGS = "-DXcode"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TVOS_DEPLOYMENT_TARGET = 9.0; - USE_HEADERMAP = NO; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Release; - }; - OBJ_45 /* Debug */ = { + OBJ_145 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; @@ -795,7 +766,9 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = XMLCoder.xcodeproj/XMLCoder_Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -806,10 +779,12 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 4.2; TARGET_NAME = XMLCoder; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; - OBJ_46 /* Release */ = { + OBJ_146 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; @@ -819,7 +794,9 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = XMLCoder.xcodeproj/XMLCoder_Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -830,40 +807,42 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 4.2; TARGET_NAME = XMLCoder; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; - OBJ_65 /* Debug */ = { + OBJ_195 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; - SWIFT_VERSION = 4.0; + OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; + SWIFT_VERSION = 4.2; }; name = Debug; }; - OBJ_66 /* Release */ = { + OBJ_196 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { LD = /usr/bin/true; - OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; - SWIFT_VERSION = 4.0; + OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"; + SWIFT_VERSION = 4.2; }; name = Release; }; - OBJ_71 /* Debug */ = { + OBJ_201 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Debug; }; - OBJ_72 /* Release */ = { + OBJ_202 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Release; }; - OBJ_76 /* Debug */ = { + OBJ_206 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; @@ -874,17 +853,21 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = XMLCoder.xcodeproj/XMLCoderTests_Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 4.2; TARGET_NAME = XMLCoderTests; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; - OBJ_77 /* Release */ = { + OBJ_207 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; @@ -895,60 +878,115 @@ ); HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = XMLCoder.xcodeproj/XMLCoderTests_Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; SWIFT_VERSION = 4.2; TARGET_NAME = XMLCoderTests; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + OBJ_3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "SWIFT_PACKAGE=1", + "DEBUG=1", + ); + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + USE_HEADERMAP = NO; + }; + name = Debug; + }; + OBJ_4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_OPTIMIZATION_LEVEL = s; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "SWIFT_PACKAGE=1", + ); + MACOSX_DEPLOYMENT_TARGET = 10.10; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + USE_HEADERMAP = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - OBJ_2 /* Build configuration list for PBXProject "XMLCoder" */ = { + OBJ_144 /* Build configuration list for PBXNativeTarget "XMLCoder" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_3 /* Debug */, - OBJ_4 /* Release */, + OBJ_145 /* Debug */, + OBJ_146 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - OBJ_44 /* Build configuration list for PBXNativeTarget "XMLCoder" */ = { + OBJ_194 /* Build configuration list for PBXNativeTarget "XMLCoderPackageDescription" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_45 /* Debug */, - OBJ_46 /* Release */, + OBJ_195 /* Debug */, + OBJ_196 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - OBJ_64 /* Build configuration list for PBXNativeTarget "XMLCoderPackageDescription" */ = { + OBJ_2 /* Build configuration list for PBXProject "XMLCoder" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_65 /* Debug */, - OBJ_66 /* Release */, + OBJ_3 /* Debug */, + OBJ_4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - OBJ_70 /* Build configuration list for PBXAggregateTarget "XMLCoderPackageTests" */ = { + OBJ_200 /* Build configuration list for PBXAggregateTarget "XMLCoderPackageTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_71 /* Debug */, - OBJ_72 /* Release */, + OBJ_201 /* Debug */, + OBJ_202 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - OBJ_75 /* Build configuration list for PBXNativeTarget "XMLCoderTests" */ = { + OBJ_205 /* Build configuration list for PBXNativeTarget "XMLCoderTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - OBJ_76 /* Debug */, - OBJ_77 /* Release */, + OBJ_206 /* Debug */, + OBJ_207 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release;