30 lines
1.6 KiB
Swift
30 lines
1.6 KiB
Swift
import AppKit
|
|
import ConjureKit
|
|
import Testing
|
|
@testable import Conjure
|
|
|
|
@Test @MainActor func emojiDownNavigationFollowsRenderedColumns() throws {
|
|
_ = NSApplication.shared
|
|
let suite = "EmojiGrid.\(UUID().uuidString)"
|
|
let defaults = UserDefaults(suiteName: suite)!
|
|
let pasteboard = NSPasteboard.withUniqueName()
|
|
defer { defaults.removePersistentDomain(forName: suite); pasteboard.releaseGlobally() }
|
|
let picker = EmojiPickerController(defaults: defaults, pasteboard: pasteboard)
|
|
let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 750, height: 400),
|
|
styleMask: [.borderless], backing: .buffered, defer: false)
|
|
window.contentView = picker.view
|
|
picker.view.layoutSubtreeIfNeeded()
|
|
let scroll = try #require(picker.view.subviews.compactMap { $0 as? NSScrollView }.first)
|
|
let grid = try #require(scroll.documentView as? NSCollectionView)
|
|
let layout = try #require(grid.collectionViewLayout)
|
|
let first = try #require(layout.layoutAttributesForItem(at: IndexPath(item: 0, section: 0)))
|
|
let nextRow = try #require((1..<EmojiCatalog.all.count).first { index in
|
|
guard let frame = layout.layoutAttributesForItem(at: IndexPath(item: index, section: 0))?.frame else { return false }
|
|
return frame.minY > first.frame.minY
|
|
})
|
|
#expect(picker.handle(#selector(NSResponder.moveDown(_:))))
|
|
picker.copySelection()
|
|
#expect(pasteboard.string(forType: .string) == EmojiCatalog.all[nextRow].value)
|
|
print("Emoji grid: \(nextRow) columns at 750 points; down navigation follows the rendered row.")
|
|
}
|