crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

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 }