@testable import PureYAML import Testing /// Verifies the ported character-class predicates match libyaml's `IS_*` macros, /// including end-of-input as `nil` and the multi-byte line breaks. @Suite("LibYAML Character Class") struct LibYAMLCharacterClassTests { private typealias Classify = PureYAML.Parsing.LibYAML.CharacterClass @Test("end of input is Z and a break, nothing else") func test_endOfInput() { #expect(Classify.isZ(nil)) #expect(Classify.isBreakZ(nil)) #expect(Classify.isBlankZ(nil)) #expect(!Classify.isBreak(nil)) #expect(!Classify.isBlank(nil)) #expect(!Classify.isAlpha(nil)) } @Test("blanks are space and tab only") func test_blank() { #expect(Classify.isSpace(" ")) #expect(Classify.isTab("\t")) #expect(Classify.isBlank(" ")) #expect(Classify.isBlank("\t")) #expect(!Classify.isBlank("\n")) #expect(!Classify.isBlank("x")) } @Test("line breaks include CR, LF, NEL, LS, PS") func test_break() { for scalar in ["\r", "\n", "\u{85}", "\u{2028}", "\u{2029}"] as [Unicode.Scalar] { #expect(Classify.isBreak(scalar)) #expect(Classify.isBreakZ(scalar)) #expect(Classify.isBlankZ(scalar)) } #expect(!Classify.isBreak(" ")) #expect(!Classify.isBreak("x")) } @Test("alpha is alnum plus underscore and hyphen") func test_alpha() { for scalar in ["0", "9", "A", "Z", "a", "z", "_", "-"] as [Unicode.Scalar] { #expect(Classify.isAlpha(scalar)) } #expect(!Classify.isAlpha(".")) #expect(!Classify.isAlpha(" ")) #expect(Classify.isDigit("5")) #expect(!Classify.isDigit("a")) #expect(Classify.isHex("f")) #expect(Classify.isHex("9")) #expect(!Classify.isHex("g")) } @Test("ascii and printable boundaries") func test_asciiPrintable() { #expect(Classify.isASCII("\u{7F}")) #expect(!Classify.isASCII("\u{80}")) #expect(Classify.isPrintable("\t")) #expect(Classify.isPrintable("A")) #expect(Classify.isPrintable("\u{85}")) #expect(!Classify.isPrintable("\u{0}")) #expect(!Classify.isPrintable("\u{1F}")) } }