149 lines
3.8 KiB
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"],
|
|
),
|
|
]
|