PlayerPreferencesTests.swift (1949B)
1 import Foundation 2 import Testing 3 4 @testable import Crossmate 5 6 @Suite("Player preferences", .serialized) 7 @MainActor 8 struct PlayerPreferencesTests { 9 @Test("Movement preferences have expected defaults") 10 func movementPreferencesHaveExpectedDefaults() throws { 11 let defaults = try makeDefaults() 12 13 let preferences = PlayerPreferences(local: defaults, cloud: nil) 14 15 #expect(preferences.skipsFilledCells) 16 #expect(preferences.answerEndMovement == .moveToNextAnswer) 17 } 18 19 @Test("Movement preferences persist locally") 20 func movementPreferencesPersistLocally() throws { 21 let defaults = try makeDefaults() 22 let preferences = PlayerPreferences(local: defaults, cloud: nil) 23 24 preferences.skipsFilledCells = false 25 preferences.answerEndMovement = .doNothing 26 let restored = PlayerPreferences(local: defaults, cloud: nil) 27 28 #expect(!restored.skipsFilledCells) 29 #expect(restored.answerEndMovement == .doNothing) 30 } 31 32 @Test("Legacy wrapping preference migrates to answer-end movement") 33 func legacyWrappingPreferenceMigrates() throws { 34 let defaults = try makeDefaults() 35 defaults.set(true, forKey: "wrapsToFirstBlank") 36 37 let preferences = PlayerPreferences(local: defaults, cloud: nil) 38 39 #expect(preferences.answerEndMovement == .wrapInCurrentAnswer) 40 } 41 42 @Test("Legacy disabled movement preferences migrate to do nothing") 43 func legacyDisabledMovementPreferencesMigrate() throws { 44 let defaults = try makeDefaults() 45 defaults.set(false, forKey: "wrapsToFirstBlank") 46 defaults.set(false, forKey: "movesToNextClue") 47 48 let preferences = PlayerPreferences(local: defaults, cloud: nil) 49 50 #expect(preferences.answerEndMovement == .doNothing) 51 } 52 53 private func makeDefaults() throws -> UserDefaults { 54 try #require(UserDefaults(suiteName: "test-pref-\(UUID().uuidString)")) 55 } 56 }