mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 16:24:11 +00:00
203 lines
6.0 KiB
Swift
203 lines
6.0 KiB
Swift
//
|
|
// Copyright 2025 Element Creations Ltd.
|
|
// Copyright 2023-2025 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
@testable import ElementX
|
|
import Foundation
|
|
import Testing
|
|
|
|
struct UserPreferenceTests {
|
|
@Test
|
|
func storePlistValue() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.plist = "Hello"
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
|
|
#expect(value.plist == "Hello")
|
|
#expect(testDefaults.object(forKey: TestsKey.key2.rawValue) is String)
|
|
#expect(testDefaults.data(forKey: TestsKey.key2.rawValue) == nil)
|
|
}
|
|
|
|
@Test
|
|
func storeCodableValue() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let storedType = CodableTestType(a: "some", b: [1, 2, 3])
|
|
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.codable = storedType
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
|
|
#expect(value.codable == storedType)
|
|
#expect(testDefaults.data(forKey: TestsKey.key3.rawValue) != nil)
|
|
}
|
|
|
|
@Test
|
|
func storePlistValueOnVolatileStorage() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.volatileVar = "Hello"
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
|
|
#expect(value.volatileVar == nil)
|
|
}
|
|
|
|
@Test
|
|
func storeCodableValueOnVolatileStorage() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let storedType = CodableTestType(a: "some", b: [1, 2, 3])
|
|
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.volatileCodable = storedType
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
|
|
#expect(value.volatileCodable == nil)
|
|
#expect(testDefaults.data(forKey: TestsKey.key4.rawValue) == nil)
|
|
}
|
|
|
|
@Test
|
|
func storePlistArray() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.plistArray = [1, 2, 3]
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
|
|
#expect(value.plistArray == [1, 2, 3])
|
|
#expect(testDefaults.object(forKey: TestsKey.key5.rawValue) as? [Int] == [1, 2, 3])
|
|
#expect(testDefaults.data(forKey: TestsKey.key5.rawValue) == nil)
|
|
}
|
|
|
|
@Test
|
|
func assignNilToPlistType() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.plist = "Hello"
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
value.plist = nil
|
|
|
|
#expect(value.plist == nil)
|
|
#expect(testDefaults.object(forKey: TestsKey.key2.rawValue) as? String == nil)
|
|
}
|
|
|
|
@Test
|
|
func assignNilToCodableType() {
|
|
let testDefaults = VolatileUserDefaults()
|
|
let storedType = CodableTestType(a: "some", b: [1, 2, 3])
|
|
|
|
let setPreference = {
|
|
let value = TestPreferences(testDefaults)
|
|
value.codable = storedType
|
|
}
|
|
|
|
setPreference()
|
|
|
|
let value = TestPreferences(testDefaults)
|
|
value.codable = nil
|
|
|
|
#expect(value.codable == nil)
|
|
#expect(testDefaults.data(forKey: TestsKey.key3.rawValue) == nil)
|
|
}
|
|
|
|
@Test
|
|
func localOverRemoteValue() {
|
|
let storage = VolatileUserDefaults()
|
|
let preference = UserPreference(key: TestsKey.testKey, defaultValue: "", storage: storage)
|
|
#expect(preference.wrappedValue == "")
|
|
|
|
preference.remoteValue = "remote"
|
|
#expect(preference.wrappedValue == "remote")
|
|
|
|
preference.wrappedValue = "local"
|
|
#expect(preference.wrappedValue == "local")
|
|
}
|
|
|
|
@Test
|
|
func remoteOverLocalValue() {
|
|
let storage = VolatileUserDefaults()
|
|
let preference = UserPreference(key: TestsKey.testKey, defaultValue: "", storage: storage, mode: .remoteOverLocal)
|
|
#expect(preference.wrappedValue == "")
|
|
|
|
preference.remoteValue = "remote"
|
|
#expect(preference.wrappedValue == "remote")
|
|
|
|
preference.wrappedValue = "local"
|
|
#expect(preference.wrappedValue == "remote")
|
|
#expect(preference.isLockedToRemote)
|
|
}
|
|
}
|
|
|
|
private nonisolated struct TestPreferences {
|
|
@UserPreference
|
|
var volatileVar: String?
|
|
|
|
@UserPreference
|
|
var plist: String?
|
|
|
|
@UserPreference
|
|
var codable: CodableTestType?
|
|
|
|
@UserPreference
|
|
var volatileCodable: CodableTestType?
|
|
|
|
@UserPreference
|
|
var plistArray: [Int]?
|
|
|
|
init(_ storage: UserDefaultsProtocol) {
|
|
_volatileVar = UserPreference(key: TestsKey.key1, storage: VolatileUserDefaults())
|
|
_plist = UserPreference(key: TestsKey.key2, storage: storage)
|
|
_codable = UserPreference(key: TestsKey.key3, storage: storage)
|
|
_volatileCodable = UserPreference(key: TestsKey.key4, storage: VolatileUserDefaults())
|
|
_plistArray = UserPreference(key: TestsKey.key5, storage: storage)
|
|
}
|
|
}
|
|
|
|
private struct CodableTestType: Equatable, Codable {
|
|
let a: String
|
|
let b: [Int]
|
|
}
|
|
|
|
private nonisolated struct TestsKey: PreferenceKeyable, RawRepresentable {
|
|
static let testKey = Self(rawValue: "testKey")
|
|
static let key1 = Self(rawValue: "foo.volatile")
|
|
static let key2 = Self(rawValue: "foo.plist")
|
|
static let key3 = Self(rawValue: "foo.codable")
|
|
static let key4 = Self(rawValue: "foo.volatile.codable")
|
|
static let key5 = Self(rawValue: "foo.plist.array")
|
|
|
|
let rawValue: String
|
|
}
|