import Testing @testable import NorgKit struct DetachedModifierTests { private let markers = ASCIIByteSet("*-~>$^:") @Test func parsesMarkerLevelAndContent() { let m = DetachedModifier.parse("** heading"[...], accepting: markers) #expect(m?.marker == "*") #expect(m?.level == 2) #expect(m?.content == "heading") #expect(m?.status == nil) } @Test func skipsLeadingWhitespace() { let m = DetachedModifier.parse(" - item"[...], accepting: markers) #expect(m?.marker == "-") #expect(m?.level == 1) #expect(m?.content == "item") } @Test func parsesStatusAndStatusIndex() { let line = "- (x) done" let m = DetachedModifier.parse(line[...], accepting: markers) #expect(m?.status == .done) #expect(m?.content == "done") if let index = m?.statusIndex { #expect(line[index] == "x") } else { Issue.record("Expected a status index") } } @Test func returnsNilForUnacceptedMarker() { #expect(DetachedModifier.parse("+ item"[...], accepting: markers) == nil) } @Test func returnsNilWithoutWhitespaceAfterMarker() { #expect(DetachedModifier.parse("*bold*"[...], accepting: markers) == nil) } @Test func returnsNilForEmptyAndBlankLines() { #expect(DetachedModifier.parse(""[...], accepting: markers) == nil) #expect(DetachedModifier.parse(" "[...], accepting: markers) == nil) } @Test func unterminatedStatusParenIsTreatedAsContent() { let m = DetachedModifier.parse("- (x oops"[...], accepting: markers) #expect(m?.status == nil) #expect(m?.content == "(x oops") } @Test func unknownStatusCharInParensIsContent() { let m = DetachedModifier.parse("- (z) text"[...], accepting: markers) #expect(m?.status == nil) #expect(m?.content == "(z) text") } }