import PureYAML @testable import PureYAMLJSON import Testing @Suite("JSON representability rules") struct JSONRuleTests { private func mapping(_ pairs: [PureYAML.Model.Pair]) -> PureYAML.Model.Value { .mapping(.init(pairs)) } @Test("mappingKeysAreStrings fails on a complex key") func test_mappingKeysAreStrings_fails() { let document = mapping([.init(keyNode: .sequence([.int(1)]), value: .int(2))]) let issues = PureYAML.Validation.Validator(checks: [PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.mappingKeysAreStrings)]).collect(document).issues #expect(issues.count == 1) #expect(issues.first?.reason == "Mapping key '[1]' is not a string") } @Test("mappingKeysAreStrings passes when every key is a string") func test_mappingKeysAreStrings_passes() { let document = mapping([.init(key: "a", value: .int(1))]) let issues = PureYAML.Validation.Validator(checks: [PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.mappingKeysAreStrings)]).collect(document).issues #expect(issues.isEmpty) } @Test("numbersAreFinite fails on infinity at the value's path") func test_numbersAreFinite_fails() { let document = mapping([.init(key: "x", value: .double(.infinity))]) let issues = PureYAML.Validation.Validator(checks: [PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.numbersAreFinite)]).collect(document).issues #expect(issues.count == 1) #expect(issues.first?.reason == "Number 'inf' is not finite") } @Test("numbersAreFinite passes on a large finite double") func test_numbersAreFinite_passes() { let document = mapping([.init(key: "x", value: .double(.greatestFiniteMagnitude))]) let issues = PureYAML.Validation.Validator(checks: [PureYAML.Validation.AnyCheck(PureYAML.Validation.BuiltinCheck.numbersAreFinite)]).collect(document).issues #expect(issues.isEmpty) } @Test("The representability set catches a duplicate key") func test_representability_catchesDuplicate() { let document = mapping([.init(key: "a", value: .int(1)), .init(key: "a", value: .int(2))]) #expect(!PureYAML.JSON.Validator.isRepresentable(document)) } @Test("A plain string-keyed finite tree is representable") func test_representability_acceptsPlainTree() { let document = mapping([.init(key: "a", value: .int(1)), .init(key: "b", value: .double(1.5))]) #expect(PureYAML.JSON.Validator.isRepresentable(document)) #expect(PureYAML.JSON.Validator.issues(for: document).isEmpty) } }