Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,13 @@ struct XMLCoderElement: Equatable {
prettyPrinted: Bool
) -> String {
var string = ""
// Fix added for empty key adjustment in `UnkeyedBox` taking static func builder
let nonEmptyKey = element.key != ""
let level = nonEmptyKey ? level + 1 : level
string += element._toXMLString(
indented: level + 1, withCDATA: cdata, formatting: formatting
indented: level, withCDATA: cdata, formatting: formatting
)
string += prettyPrinted ? "\n" : ""
string += (prettyPrinted && nonEmptyKey) ? "\n" : ""
return string
}

Expand Down Expand Up @@ -226,7 +229,9 @@ struct XMLCoderElement: Equatable {
string += "</\(key)>"
}
} else if !elements.isEmpty {
string += prettyPrinted ? ">\n" : ">"
if !key.isEmpty {
string += prettyPrinted ? ">\n" : ">"
}
formatXMLElements(formatting, &string, level, cdata, prettyPrinted)

string += indentation
Expand All @@ -244,6 +249,12 @@ struct XMLCoderElement: Equatable {
// MARK: - Convenience Initializers

extension XMLCoderElement {
static func containsChoice(key: String, box: UnkeyedBox) -> XMLCoderElement {
return XMLCoderElement(key: key, elements: box.map {
XMLCoderElement(key: "", box: $0)
})
}

init(key: String, box: UnkeyedBox) {
self.init(key: key, elements: box.map {
XMLCoderElement(key: key, box: $0)
Expand Down
4 changes: 4 additions & 0 deletions Sources/XMLCoder/Encoder/XMLChoiceEncodable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@
//

public protocol XMLChoiceEncodable: Encodable {}

public protocol ArrayOfXMLChoiceEncodable {}

extension Array: ArrayOfXMLChoiceEncodable where Element: XMLChoiceEncodable {}
6 changes: 5 additions & 1 deletion Sources/XMLCoder/Encoder/XMLEncoder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,11 @@ open class XMLEncoder {
if let keyedBox = topLevel as? KeyedBox {
elementOrNone = XMLCoderElement(key: rootKey, box: keyedBox)
} else if let unkeyedBox = topLevel as? UnkeyedBox {
elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox)
if T.self is ArrayOfXMLChoiceEncodable.Type {
elementOrNone = XMLCoderElement.containsChoice(key: rootKey, box: unkeyedBox)
} else {
elementOrNone = XMLCoderElement(key: rootKey, box: unkeyedBox)
}
} else {
fatalError("Unrecognized top-level element of type: \(type(of: topLevel))")
}
Expand Down
4 changes: 1 addition & 3 deletions Tests/XMLCoderTests/CompositeChoiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ private enum IntOrStringWrapper: Equatable {
}

extension IntOrStringWrapper: XMLChoiceCodable {

enum CodingKeys: String, CodingKey {
case int
case string
Expand All @@ -38,7 +37,7 @@ extension IntOrStringWrapper: XMLChoiceCodable {
}

func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case let .int(value):
try container.encode(value, forKey: .int)
Expand All @@ -49,7 +48,6 @@ extension IntOrStringWrapper: XMLChoiceCodable {
}

class CompositeChoiceTests: XCTestCase {

func testIntOrStringWrapper() throws {
let xml = """
<container>
Expand Down
2 changes: 0 additions & 2 deletions Tests/XMLCoderTests/SimpleChoiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ private enum IntOrString: Equatable {
}

extension IntOrString: XMLChoiceCodable {

enum CodingKeys: String, CodingKey {
case int
case string
Expand All @@ -41,7 +40,6 @@ extension IntOrString: XMLChoiceCodable {
}

class SimpleChoiceTests: XCTestCase {

func testIntOrStringIntDecoding() throws {
let xml = "<int>42</int>"
let result = try XMLDecoder().decode(IntOrString.self, from: xml.data(using: .utf8)!)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>classNames</key>
<dict>
<key>BenchmarkTests</key>
<dict>
<key>testDecodeArrays()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.45609</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeBools()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.064437</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeDatas()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.083191</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeDates()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.061247</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeDecimals()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.049022</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeDictionaries()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.22164</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeFloats()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.0426</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeInts()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.040157</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeNulls()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.031343</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeUInts()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.041441</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testDecodeURLs()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.047946</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeArrays()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.088624</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeBools()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.016727</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeDatas()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.022805</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeDates()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.02052</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeDecimals()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.016909</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeDictionaries()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.11651</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeFloats()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.018687</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeInts()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.017093</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeNulls()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.0073608</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeUInts()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.017129</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
<key>testEncodeURLs()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>0.020648</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,30 @@
<dict>
<key>runDestinationsByUUID</key>
<dict>
<key>726F61F1-369A-4FE6-9D1D-BEC88E5CB1DC</key>
<dict>
<key>localComputer</key>
<dict>
<key>busSpeedInMHz</key>
<integer>100</integer>
<key>cpuCount</key>
<integer>1</integer>
<key>cpuKind</key>
<string>Intel Core i5</string>
<key>cpuSpeedInMHz</key>
<integer>3100</integer>
<key>logicalCPUCoresPerPackage</key>
<integer>4</integer>
<key>modelCode</key>
<string>MacBookPro14,2</string>
<key>physicalCPUCoresPerPackage</key>
<integer>2</integer>
<key>platformIdentifier</key>
<string>com.apple.platform.macosx</string>
</dict>
<key>targetArchitecture</key>
<string>x86_64</string>
</dict>
<key>76E090BF-7AFE-4988-A06A-3C423396A4A4</key>
<dict>
<key>localComputer</key>
Expand Down