spiegel-keyman/ios/engine/KMEI/KeymanEngineTests/TestUtils/UserDefaults.swift

92 lines
3.1 KiB
Swift

//
// UserDefaults.swift
// KeymanEngineTests
//
// Created by Joshua Horton on 2/19/20.
// Copyright © 2020 SIL International. All rights reserved.
//
import Foundation
import XCTest
@testable import KeymanEngine
extension TestUtils {
class UserDefaults {
static func getAndResetDictionary(from storage: Storage) -> [String: Any] {
let userDefaults = storage.userDefaults
var currentDictionary = userDefaults.dictionaryRepresentation()
clear(from: storage)
let baseDict = userDefaults.dictionaryRepresentation()
baseDict.forEach({ pair in
currentDictionary.removeValue(forKey: pair.key)
})
return currentDictionary
}
static func addDictionary(_ dictionary: [String: Any], storage: Storage) {
//userDefaults.register(defaults: currentDictionary) // adds them in an unclearable way!
dictionary.forEach({ pair in
storage.userDefaults.set(pair.value, forKey: pair.key)
})
}
static func getDictionary(from storage: Storage) -> [String: Any] {
let currentDictionary = getAndResetDictionary(from: storage)
// The return value is now properly constructed. Now to put the defaults back in place before we leave.
addDictionary(currentDictionary, storage: storage)
return currentDictionary
}
static func clear(from storage: Storage) {
let userDefaults = storage.userDefaults
let domain = Bundle.main.bundleIdentifier!
userDefaults.synchronize()
userDefaults.removePersistentDomain(forName: domain)
}
static func addKeyboard(_ keyboard: InstallableKeyboard) {
// Lifted from Manager.addKeyboard
let userDefaults = Storage.active.userDefaults
var userKeyboards = userDefaults.userKeyboards ?? []
// Update keyboard if it exists
if let index = userKeyboards.firstIndex(where: { $0.fullID == keyboard.fullID }) {
userKeyboards[index] = keyboard
} else {
userKeyboards.append(keyboard)
}
userDefaults.userKeyboards = userKeyboards
}
static func addLexicalModel(_ lexicalModel: InstallableLexicalModel) {
// Lifted from Manager.addKeyboard
let userDefaults = Storage.active.userDefaults
var userModels = userDefaults.userLexicalModels ?? []
// Update keyboard if it exists
if let index = userModels.firstIndex(where: { $0.fullID == lexicalModel.fullID }) {
userModels[index] = lexicalModel
} else {
userModels.append(lexicalModel)
}
userDefaults.userLexicalModels = userModels
}
// Adapted from https://stackoverflow.com/a/39453212.
static func setFromPlist(atPath path: String, for storage: Storage) throws {
var propertyListFormat = PropertyListSerialization.PropertyListFormat.xml
let xml = FileManager.default.contents(atPath: path)!
let plistDict = try PropertyListSerialization.propertyList(from: xml, options: .mutableContainersAndLeaves, format: &propertyListFormat) as! [String: Any]
plistDict.forEach({key, value in
storage.userDefaults.set(value, forKey: key)
})
}
}
}