fix(ipad): ship iPad P0 layout/globe fixes, edit-last-input, drop clipboard commands

Adapt typing/voice surfaces for iPad width and height, add the system globe
key and last-input editing flow, harden host-only Rime deployment, and remove
clipboard voice commands. Bump build to 61.
This commit is contained in:
Rocky
2026-08-10 13:50:50 +08:00
parent 53abad2050
commit 2bc8c1b87d
85 changed files with 5703 additions and 3997 deletions
@@ -0,0 +1,82 @@
import XCTest
@testable import OSGKeyboardShared
final class EditTransactionStoreTests: XCTestCase {
func testHistoryMutationOutboxIsOrderedAndIdempotent() throws {
let suite = "EditTransactionStoreTests.\(UUID().uuidString)"
let defaults = try XCTUnwrap(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
let entryID = UUID()
let later = HistoryMutation(
sequence: 2,
action: .update,
entryID: entryID,
text: "later"
)
let earlier = HistoryMutation(
sequence: 1,
action: .update,
entryID: entryID,
text: "earlier"
)
HistoryMutationOutbox.enqueue(later, defaults: defaults)
HistoryMutationOutbox.enqueue(earlier, defaults: defaults)
HistoryMutationOutbox.enqueue(earlier, defaults: defaults)
XCTAssertEqual(
HistoryMutationOutbox.pending(defaults: defaults).map(\.id),
[earlier.id, later.id]
)
HistoryMutationOutbox.acknowledge(earlier.id, defaults: defaults)
XCTAssertEqual(
HistoryMutationOutbox.pending(defaults: defaults).map(\.id),
[later.id]
)
}
func testPendingTransactionRoundTrip() throws {
let suite = "PendingTextEditTransactionTests.\(UUID().uuidString)"
let defaults = try XCTUnwrap(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
let mutation = HistoryMutation(
action: .update,
entryID: UUID(),
expectedRevision: 3,
text: "after"
)
let transaction = PendingTextEditTransaction(
deliveryMode: .replace,
beforeText: "before",
afterText: "after",
expectedFieldFingerprint: "field",
historyMutation: mutation
)
PendingTextEditTransactionStore.save(transaction, defaults: defaults)
XCTAssertEqual(
PendingTextEditTransactionStore.load(defaults: defaults),
transaction
)
PendingTextEditTransactionStore.clear(defaults: defaults)
XCTAssertNil(PendingTextEditTransactionStore.load(defaults: defaults))
}
func testHistoryMutationReceiptRoundTrip() throws {
let suite = "HistoryMutationReceiptTests.\(UUID().uuidString)"
let defaults = try XCTUnwrap(UserDefaults(suiteName: suite))
defer { defaults.removePersistentDomain(forName: suite) }
let receipt = HistoryMutationReceipt(
mutationID: UUID(),
entryID: UUID(),
revision: 4
)
HistoryMutationReceiptStore.save(receipt, defaults: defaults)
XCTAssertEqual(
HistoryMutationReceiptStore.receipt(
for: receipt.mutationID,
defaults: defaults
),
receipt
)
}
}