diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index db0045c1..0109a2df 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -44,6 +44,8 @@ struct XMLCoderElement: Equatable { elements.append(element) } + // FIXME: this should be split into separate functions and + // thoroughtly tested func flatten() -> KeyedBox { let attributes = self.attributes.mapValues { StringBox($0) } @@ -73,7 +75,7 @@ struct XMLCoderElement: Equatable { case var unkeyedBox as UnkeyedBox: unkeyedBox.append(content) result[key] = unkeyedBox - case let box?: + case let box? where !hasValue: result[key] = UnkeyedBox([box, content]) default: result[key] = content diff --git a/Tests/XMLCoderTests/AttributedIntrinsicTest.swift b/Tests/XMLCoderTests/AttributedIntrinsicTest.swift index b64ce0fd..de9f483f 100644 --- a/Tests/XMLCoderTests/AttributedIntrinsicTest.swift +++ b/Tests/XMLCoderTests/AttributedIntrinsicTest.swift @@ -52,6 +52,45 @@ private struct FooEmptyKeyed: Codable, DynamicNodeEncoding { } } +private let previewXML = + """ + + + 00:00:17:01 + + """.data(using: .utf8)! + +private struct AppPreview: Codable, Equatable { + var displayTarget: String + var position: Int + var previewImageTime: PreviewImageTime + + enum CodingKeys: String, CodingKey { + case displayTarget = "display_target" + case position + case previewImageTime = "preview_image_time" + } +} + +private struct PreviewImageTime: Codable, Equatable, DynamicNodeEncoding { + var format: String + var value: String + + enum CodingKeys: String, CodingKey { + case format + case value + } + + static func nodeEncoding(forKey key: CodingKey) -> XMLEncoder.NodeEncoding { + switch key { + case CodingKeys.format: + return .attribute + default: + return .element + } + } +} + final class AttributedIntrinsicTest: XCTestCase { func testEncode() throws { let encoder = XMLEncoder() @@ -83,9 +122,24 @@ final class AttributedIntrinsicTest: XCTestCase { XCTAssertEqual(foo2.unkeyedValue, 456) } + func testDecodePreview() throws { + let decoder = XMLDecoder() + + let preview = try decoder.decode(AppPreview.self, from: previewXML) + XCTAssertEqual(AppPreview( + displayTarget: "iOS-6.5-in", + position: 1, + previewImageTime: PreviewImageTime( + format: "24/999 1000/nonDrop", + value: "00:00:17:01" + ) + ), preview) + } + static var allTests = [ ("testEncode", testEncode), ("testDecode", testDecode), + ("testDecodePreview", testDecodePreview), ] }