import AppKit import ConjureKit import Testing @testable import Conjure @Test @MainActor func numberedMarkersShareTheBodyTextBaseline() throws { _ = NSApplication.shared let editor = NotesTextView(frame: NSRect(x: 0, y: 0, width: 400, height: 200)) editor.drawsBackground = false let window = NSWindow(contentRect: editor.frame, styleMask: .borderless, backing: .buffered, defer: false) window.contentView = editor defer { window.orderOut(nil) } for source in ["1. 1", "123. 123", " 12. 12"] { editor.setDocumentContents(NoteDocument.importMarkdown(NSAttributedString(string: source))) let layout = try #require(editor.layoutManager) let container = try #require(editor.textContainer) layout.ensureLayout(for: container) let glyph = layout.glyphIndexForCharacter(at: 0) let fragment = layout.lineFragmentRect(forGlyphAt: glyph, effectiveRange: nil) let bodyX = editor.textContainerOrigin.x + fragment.minX + layout.location(forGlyphAt: glyph).x let bitmap = try #require(NSBitmapImageRep(bitmapDataPlanes: nil, pixelsWide: 400, pixelsHigh: 200, bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bytesPerRow: 0, bitsPerPixel: 0)) let bitmapContext = try #require(NSGraphicsContext(bitmapImageRep: bitmap)) bitmapContext.cgContext.translateBy(x: 0, y: 200) bitmapContext.cgContext.scaleBy(x: 1, y: -1) let context = NSGraphicsContext(cgContext: bitmapContext.cgContext, flipped: true) NSGraphicsContext.saveGraphicsState() NSGraphicsContext.current = context context.cgContext.clear(CGRect(x: 0, y: 0, width: 400, height: 200)) editor.draw(editor.bounds) NSGraphicsContext.restoreGraphicsState() var markerBottom = -1, bodyBottom = -1 for y in 0..<200 { for x in 0..<400 where (bitmap.colorAt(x: x, y: y)?.alphaComponent ?? 0) > 0.2 { if CGFloat(x) < bodyX - 1 { markerBottom = y } else { bodyBottom = y } } } try #require(markerBottom >= 0 && bodyBottom >= 0) #expect(abs(markerBottom - bodyBottom) <= 1, "Marker/body ink baseline for \(source)") #expect(!editor.string.contains("\u{fffc}")) } }