import Foundation import XCTest @testable import DocsKit final class DocumentCompositionTests: XCTestCase { @MainActor func testCommittedReplacementUsesScalarSafeUTF16() throws { let (range, text) = try XCTUnwrap(DocumentComposition.replacement(before: "AπŸ˜€draftZ", after: "AπŸ˜€ζ—₯本θͺžZ")) XCTAssertEqual(range, NSRange(location: 3, length: 5)) XCTAssertEqual(text, "ζ—₯本θͺž") XCTAssertNil(DocumentComposition.replacement(before: "πŸ˜€", after: "πŸ˜€")) let changed = try XCTUnwrap(DocumentComposition.replacement(before: "πŸ˜€", after: "😁")) XCTAssertEqual(changed.0, NSRange(location: 0, length: 2)) XCTAssertEqual(changed.1, "😁") } #if os(macOS) @MainActor func testNativeMarkedTextCommitsOnceAgainstOriginalString() { let view = DocsTextView(frame: .zero) view.textStorage?.setAttributedString(NSAttributedString(string: "AπŸ˜€Z")) view.setSelectedRange(NSRange(location: 3, length: 0)) var states: [Bool] = []; var commits: [(String, String)] = [] view.compositionChanged = { states.append($0) } view.compositionCommitted = { before, after in commits.append((before.string, after)); return true } view.setMarkedText("に", selectedRange: NSRange(location: 1, length: 0), replacementRange: NSRange(location: NSNotFound, length: 0)) view.setMarkedText("ζ—₯本", selectedRange: NSRange(location: 2, length: 0), replacementRange: NSRange(location: NSNotFound, length: 0)) XCTAssertTrue(view.isComposing) XCTAssertEqual(commits.count, 0) view.unmarkText() XCTAssertEqual(states, [true, false]) XCTAssertEqual(commits.count, 1) XCTAssertEqual(commits.first?.0, "AπŸ˜€Z") XCTAssertEqual(commits.first?.1, "AπŸ˜€ζ—₯本Z") } #endif }