PureYAML/Tests/LibYAMLReaderTests.swift
Mihaela Mihaljevic 7f94e17e2f feat(parsing): port libyaml input reader to Swift
Stage 3 foundation of the faithful libyaml scanner port. Translates libyaml's input buffer and position tracking (the buffer/mark fields and the PEEK/SKIP/SKIP_LINE macros) into PureYAML.Parsing.LibYAML.Reader. It iterates Unicode scalars rather than grapheme clusters so a CR and an LF are distinct, matching libyaml's byte-oriented scanning (a CR+LF pair is still one line break), and tracks the mark in libyaml's 0-based line and column convention. Unit-tested for peek/skip column tracking and LF and CRLF line breaks. This is the input layer the token fetchers consume.
2026-06-24 03:04:08 +02:00

47 lines
1.5 KiB
Swift

@testable import PureYAML
import Testing
/// Verifies the ported reader iterates Unicode scalars with libyaml's mark and
/// `SKIP` / `SKIP_LINE` semantics: CR and LF are distinct scalars, a CR+LF pair
/// is one line break, and the column is 0-based.
@Suite("LibYAML Reader")
struct LibYAMLReaderTests {
@Test("peek and skip advance the column scalar by scalar")
func test_peekAndSkip() {
var reader = PureYAML.Parsing.LibYAML.Reader("ab")
#expect(reader.peek() == "a")
#expect(reader.peek(1) == "b")
#expect(reader.peek(2) == nil)
reader.skip()
#expect(reader.peek() == "b")
#expect(reader.column == 1)
#expect(reader.line == 0)
reader.skip()
#expect(reader.isAtEnd)
#expect(reader.peek() == nil)
}
@Test("skipLine starts a new line and resets the column")
func test_skipLineLF() {
var reader = PureYAML.Parsing.LibYAML.Reader("a\nb")
reader.skip()
reader.skipLine()
#expect(reader.line == 1)
#expect(reader.column == 0)
#expect(reader.peek() == "b")
}
@Test("a CR+LF pair is a single line break")
func test_skipLineCRLF() {
var reader = PureYAML.Parsing.LibYAML.Reader("a\r\nb")
reader.skip()
// CR and LF are distinct scalars but one break.
#expect(reader.peek() == "\r")
#expect(reader.peek(1) == "\n")
reader.skipLine()
#expect(reader.line == 1)
#expect(reader.column == 0)
#expect(reader.peek() == "b")
}
}