PureYAML/Tests/UnkeyedEncodingFixtures.swift

149 lines
3.8 KiB
Swift

@testable import PureYAML
import Testing
struct SequenceEncodeFixture: CustomStringConvertible {
enum Subject {
case integers([Int])
case optionalStrings([String?])
case nestedIntegers([[Int]])
case articles([SequenceArticle])
case catalog(SequenceCatalog)
}
var name: String
var subject: Subject
var expectedValue: PureYAML.Model.Value
var expectedYAML: String
var forbiddenYAMLFragments: [String]
var description: String {
name
}
func expectEncodedValue() throws {
switch subject {
case let .integers(value):
#expect(try PureYAML.encode(value) == expectedValue)
case let .optionalStrings(value):
#expect(try PureYAML.encode(value) == expectedValue)
case let .nestedIntegers(value):
#expect(try PureYAML.encode(value) == expectedValue)
case let .articles(value):
#expect(try PureYAML.encode(value) == expectedValue)
case let .catalog(value):
#expect(try PureYAML.encode(value) == expectedValue)
}
}
func expectEncodedYAML() throws {
let yaml = try encodedYAML()
#expect(yaml == expectedYAML)
for fragment in forbiddenYAMLFragments {
#expect(!yaml.contains(fragment))
}
}
private func encodedYAML() throws -> String {
switch subject {
case let .integers(value):
try PureYAML.encodeToYAML(value)
case let .optionalStrings(value):
try PureYAML.encodeToYAML(value)
case let .nestedIntegers(value):
try PureYAML.encodeToYAML(value)
case let .articles(value):
try PureYAML.encodeToYAML(value)
case let .catalog(value):
try PureYAML.encodeToYAML(value)
}
}
}
let sequenceEncodeFixtures: [SequenceEncodeFixture] = [
.init(
name: "integer sequence",
subject: .integers([1, 2, 3]),
expectedValue: .sequence([.int(1), .int(2), .int(3)]),
expectedYAML: """
- 1
- 2
- 3
""",
forbiddenYAMLFragments: ["null", "title:"],
),
.init(
name: "optional string sequence",
subject: .optionalStrings(["one", nil, "three"]),
expectedValue: .sequence([
.string("one"),
.null,
.string("three"),
]),
expectedYAML: """
- "one"
- null
- "three"
""",
forbiddenYAMLFragments: ["- 0"],
),
.init(
name: "nested integer sequence",
subject: .nestedIntegers([[1, 2], []]),
expectedValue: .sequence([
.sequence([.int(1), .int(2)]),
.sequence([]),
]),
expectedYAML: """
-
- 1
- 2
- []
""",
forbiddenYAMLFragments: ["null"],
),
.init(
name: "sequence of keyed articles",
subject: .articles([sequenceArticle]),
expectedValue: .sequence([sequenceArticleValue]),
expectedYAML: """
-
title: "Typed YAML"
tags:
- "Swift"
- "YAML"
ranks:
- 1
- null
- 3
""",
forbiddenYAMLFragments: ["missing:", "empty:"],
),
.init(
name: "keyed catalog with sequence properties",
subject: .catalog(sequenceCatalog),
expectedValue: sequenceCatalogValue,
expectedYAML: """
articles:
-
title: "Typed YAML"
tags:
- "Swift"
- "YAML"
ranks:
- 1
- null
- 3
featured:
- "Typed YAML"
- null
empty: []
""",
forbiddenYAMLFragments: ["missing:", "- 0"],
),
]