Files
Termind/FrameworkTests/TerminalMousePreferencesTests.swift

77 lines
3.9 KiB
Swift

// SPDX-FileCopyrightText: 2026 Kaede Akino
// SPDX-License-Identifier: GPL-3.0-only
import Foundation
import TermindApplication
import TermindDomain
import TermindPersistence
import Testing
@Suite @MainActor
struct TerminalMousePreferencesTests {
@Test func mousePreferencesDefaultOffAndChangeIndependently() {
let model = TerminalSettingsModel()
#expect(!model.preferences.copyOnSelect)
#expect(!model.preferences.pasteOnRightClick)
#expect(model.set(true, for: \.copyOnSelect))
#expect(model.preferences.copyOnSelect)
#expect(!model.preferences.pasteOnRightClick)
#expect(model.set(true, for: \.pasteOnRightClick))
#expect(model.set(false, for: \.copyOnSelect))
#expect(!model.preferences.copyOnSelect)
#expect(model.preferences.pasteOnRightClick)
}
@Test func oldLocalBlobsAndSyncPayloadsDecodeWithMousePreferencesOff() throws {
let data = Data(
#"{"fontSize":18,"fontFollowTheme":false,"darkTheme":"Termind Dark","lightTheme":"Termind Light","darkCustomEnabled":true,"lightCustomEnabled":false,"darkCustomConfiguration":"background = 112233","lightCustomConfiguration":"","shellIntegration":false,"remoteWindowTitleInMenuBar":false}"#
.utf8)
let row = try PersistentTerminalPreferences(.init(copyOnSelect: true, pasteOnRightClick: true))
row.data = data
let value = try row.load()
#expect(!value.copyOnSelect)
#expect(!value.pasteOnRightClick)
#expect(value.darkCustomConfiguration == "background = 112233")
#expect(!value.shellIntegration)
let payload = Data(#"{"terminal":{"_0": "#.utf8) + data + Data("}}".utf8)
#expect(try JSONDecoder().decode(SettingsRecordPayload.self, from: payload) == .terminal(value))
}
@Test func mousePreferencesRoundTripAndMirrorWithoutLosingOtherSettings() throws {
let domain = "TerminalMousePreferencesTests.\(UUID())"
let defaults = try #require(UserDefaults(suiteName: domain))
defer { defaults.removePersistentDomain(forName: domain) }
let original = TerminalPreferences(copyOnSelect: true, pasteOnRightClick: true)
let row = try PersistentTerminalPreferences(original)
#expect(try row.load() == original)
original.mirror(to: defaults)
#expect(defaults.bool(forKey: SettingsKey.terminalCopyOnSelect))
#expect(defaults.bool(forKey: SettingsKey.terminalPasteOnRightClick))
#expect(TerminalPreferences(defaults: defaults) == original)
}
@Test func mobileStyleTerminalEditPreservesSyncedDesktopMousePreferences() throws {
let container = try TermindPersistence.makeContainer(inMemory: true)
let domain = "TerminalMouseMobileEdit.\(UUID())"
let defaults = try #require(UserDefaults(suiteName: domain))
defer { defaults.removePersistentDomain(forName: domain) }
let store = SettingsSyncPersistence(context: container.mainContext, defaults: defaults)
try store.prepare()
let preferences = TerminalPreferences(copyOnSelect: true, pasteOnRightClick: true)
let payload = SettingsRecordPayload.terminal(preferences)
let envelope = SettingsEnvelope(
key: payload.key, version: .next(after: nil, writerID: UUID(), now: .now), payload: payload)
let snapshot = try store.applyRemote([envelope]).snapshot
let model = TerminalSettingsModel(persistence: store)
model.applyRemoteSnapshot(snapshot.terminal)
#expect(model.set("GitHub Light", for: \.lightTheme))
let saved = try store.loadTerminal()
#expect(saved.lightTheme == "GitHub Light")
#expect(saved.copyOnSelect)
#expect(saved.pasteOnRightClick)
let pending = try #require(try store.journal.pendingEnvelopes().first { $0.key.kind == .terminal })
#expect(pending.payload == .terminal(saved))
}
}