Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
749e0fc
Add testing preliminaries for choice elements
bwetherfield Jul 15, 2019
ffbb395
Add ChoiceKey protocol conforming to CodingKey
jsbean Jul 26, 2019
77f9699
Implement choice element encoding
bwetherfield Jul 26, 2019
c128f28
Implement choice element decoding
jsbean Jul 27, 2019
312c4f5
Refactor clean up choice coding implementation
jsbean Jul 27, 2019
91693e9
Rename XMLChoiceKey -> XMLChoiceCodingKey
jsbean Jul 27, 2019
b5684f3
Rename SingleElementBox to SingleKeyedBox
jsbean Jul 26, 2019
5fd8d8f
Rename nestedSingleElementContainer -> nestedChoiceContainer
jsbean Jul 27, 2019
5bda791
Cull redundancies
jsbean Jul 27, 2019
045e07c
Add enum with associated value encoding tests
bwetherfield Jul 27, 2019
a7fb985
Fix usage to one key in the XMLChoiceDecodingContainer
jsbean Jul 26, 2019
b1b6c27
Factor out mapKeys to XMLDecoderImplementation.transformKeyedContainer
jsbean Jul 26, 2019
048d0c3
Be more assertive in NestingTests (#44)
jsbean Jul 27, 2019
5748eee
Merge branch 'master' into choice-implementation
jsbean Jul 27, 2019
c6ee065
Use KeyedBox like we used to (#46)
jsbean Jul 27, 2019
e6467d5
Rename scheme XMLCoder-Package -> XMLCoder
jsbean Jul 28, 2019
ce09102
Share scheme
jsbean Jul 28, 2019
f09c79d
Use Swift 4.2
jsbean Jul 28, 2019
0414fd8
Use Swift 4.2 everywhere
jsbean Jul 28, 2019
e1f0c45
Bring back old performance testing baseline
jsbean Jul 29, 2019
0b9c5cc
Whitespace
jsbean Jul 29, 2019
a8125e2
Bring back scheme management plist
jsbean Jul 29, 2019
bf52ca8
Bring back in empty AdditionalOptions
jsbean Jul 29, 2019
fd594fd
Whitespace
jsbean Jul 29, 2019
a930d00
Remove print statement
jsbean Jul 29, 2019
5a7a64a
Merge early exits in ChoiceBox.init?(_: KeyedBox)
jsbean Jul 30, 2019
c000573
Tighten up SharedBox init callsite
jsbean Jul 30, 2019
d4bd9f4
Rename _converted -> converted
jsbean Jul 30, 2019
4a99e95
Beef up XMLChoiceCodingKey doc comment
jsbean Jul 30, 2019
7920b72
Rename local variable mySelf -> oldSelf
jsbean Jul 30, 2019
683cb34
Wrangle long preconditionFailure messages
jsbean Jul 30, 2019
7db9627
Reword Implement -> Implementing in doc comment
jsbean Jul 30, 2019
c213808
Throw errors instead of fatallyErroring
jsbean Jul 30, 2019
32195c5
Add brief description to README
jsbean Jul 30, 2019
8149ead
Keep README in tag-ological order
jsbean Jul 30, 2019
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
Prev Previous commit
Next Next commit
Add enum with associated value encoding tests
Add nested array encoding test

Add array within dictionary test

Formatting

Add keyed within unkeyed test

Add roundtrip test for keyed within keyed case

Update test to roundtrip for robustness

Add wrapped tests for encoding

Fix formatting
  • Loading branch information
bwetherfield authored and jsbean committed Jul 27, 2019
commit 045e07c130c82e1d13f13f6ad65c91ab2c1b696a
86 changes: 53 additions & 33 deletions Tests/XMLCoderTests/CompositeChoiceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,40 +47,60 @@ extension IntOrStringWrapper: Codable {
}
}

class CompositeChoiceTests: XCTestCase {
func testIntOrStringWrapper() throws {
let xml = """
<container>
<string>
<wrapped>A Word About Woke Times</wrapped>
</string>
</container>
"""
let result = try XMLDecoder().decode(IntOrStringWrapper.self, from: xml.data(using: .utf8)!)
let expected = IntOrStringWrapper.string(StringWrapper(wrapped: "A Word About Woke Times"))
XCTAssertEqual(result, expected)
class EnumAssociatedValueTestComposite: XCTestCase {
var encoder: XMLEncoder {
let encoder = XMLEncoder()
encoder.outputFormatting = [.prettyPrinted]
return encoder
}

func testArrayOfIntOrStringWrappers() throws {
let xml = """
<container>
<string>
<wrapped>A Word About Woke Times</wrapped>
</string>
<int>
<wrapped>9000</wrapped>
</int>
<string>
<wrapped>A Word About Woke Tomes</wrapped>
</string>
</container>
"""
let result = try XMLDecoder().decode([IntOrStringWrapper].self, from: xml.data(using: .utf8)!)
let expected: [IntOrStringWrapper] = [
.string(StringWrapper(wrapped: "A Word About Woke Times")),
.int(IntWrapper(wrapped: 9000)),
.string(StringWrapper(wrapped: "A Word About Woke Tomes")),
]
XCTAssertEqual(result, expected)
private let simpleString = IntOrStringWrapper.string(StringWrapper(wrapped: "A Word About Woke Times"))

private let xmlSimpleString = """
<container>
<string>
<wrapped>A Word About Woke Times</wrapped>
</string>
</container>
"""

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 = """
<container>
<string>
<wrapped>A Word About Woke Times</wrapped>
</string>
<int>
<wrapped>9000</wrapped>
</int>
<string>
<wrapped>A Word About Woke Tomes</wrapped>
</string>
</container>
"""

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)
}
}
134 changes: 76 additions & 58 deletions Tests/XMLCoderTests/NestingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,107 +25,125 @@ final class NestingTests: XCTestCase {
[1, 2, 3],
]

let xmlUnkeyedWithinUnkeyed =
"""
<element>
<element>
<element>1</element>
<element>2</element>
<element>3</element>
</element>
<element>
<element>1</element>
<element>2</element>
<element>3</element>
</element>
</element>
"""

let unkeyedWithinKeyed: [String: [Int]] = [
"first": [1, 2, 3],
"second": [1, 2, 3],
]

let xmlUnkeyedWithinKeyed =
"""
<element>
<first>1</first>
<first>2</first>
<first>3</first>
<second>1</second>
<second>2</second>
<second>3</second>
</element>
"""

let keyedWithinUnkeyed: [[String: Int]] = [
["first": 1],
["second": 2],
]

let xmlKeyedWithinUnkeyed =
"""
<element>
<element>
<first>1</first>
</element>
<element>
<second>2</second>
</element>
</element>
"""

let keyedWithinKeyed: [String: [String: Int]] = [
"first": ["a": 1, "b": 2],
"second": ["c": 3, "d": 4],
]

let xmlKeyedWithinKeyed =
"""
<element>
<first>
<b>2</b>
<a>1</a>
</first>
<second>
<c>3</c>
<d>4</d>
</second>
</element>
"""

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 =
"""
<element>
<element>
<element>1</element>
<element>2</element>
<element>3</element>
</element>
<element>
<element>1</element>
<element>2</element>
<element>3</element>
</element>
</element>
"""
let encoded = xml.data(using: .utf8)!
let encoded = xmlUnkeyedWithinUnkeyed.data(using: .utf8)!
let expected = [[1, 2, 3], [1, 2, 3]]
let decoded = try decoder.decode([[Int]].self, from: encoded)

XCTAssertNoThrow(try decoder.decode(type(of: unkeyedWithinUnkeyed), from: encoded))
}

func testDecodeUnkeyedWithinKeyed() throws {
let xml =
"""
<element>
<first>1</first>
<first>2</first>
<first>3</first>
<second>1</second>
<second>2</second>
<second>3</second>
</element>
"""
let encoded = xml.data(using: .utf8)!
let encoded = xmlUnkeyedWithinKeyed.data(using: .utf8)!
let expected = ["first": [1, 2, 3], "second": [1, 2, 3]]
let decoded = try decoder.decode([String: [Int]].self, from: encoded)

XCTAssertNoThrow(try decoder.decode(type(of: unkeyedWithinKeyed), from: encoded))
}

func testDecodeKeyedWithinUnkeyed() throws {
let xml =
"""
<element>
<element>
<first>1</first>
</element>
<element>
<second>2</second>
</element>
</element>
"""
let encoded = xml.data(using: .utf8)!
let encoded = xmlKeyedWithinUnkeyed.data(using: .utf8)!
let expected = [["first": 1], ["second": 2]]
let decoded = try decoder.decode([[String: Int]].self, from: encoded)

XCTAssertNoThrow(try decoder.decode(type(of: keyedWithinUnkeyed), from: encoded))
}

func testDecodeKeyedWithinKeyed() throws {
let xml =
"""
<element>
<first>
<b>2</b>
<a>1</a>
</first>
<second>
<c>3</c>
<d>4</d>
</second>
</element>
"""
let encoded = xml.data(using: .utf8)!
let encoded = xmlKeyedWithinKeyed.data(using: .utf8)!
let expected = ["first": ["a": 1, "b": 2], "second": ["c": 3, "d": 4]]
let decoded = try decoder.decode([String: [String: Int]].self, from: encoded)

XCTAssertNoThrow(try decoder.decode(type(of: keyedWithinKeyed), from: encoded))
}
Expand Down