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.
47 lines
1.5 KiB
Swift
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")
|
|
}
|
|
}
|