2021-05-16 20:21:17 +08:00
|
|
|
import Foundation
|
2024-09-26 05:17:26 +08:00
|
|
|
import Testing
|
2021-05-16 20:21:17 +08:00
|
|
|
import Defaults
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
private let suite_ = createSuite()
|
|
|
|
|
2021-05-16 20:21:17 +08:00
|
|
|
struct DefaultsSetAlgebra<Element: Defaults.Serializable & Hashable>: SetAlgebra {
|
|
|
|
var store = Set<Element>()
|
|
|
|
|
|
|
|
init() {}
|
|
|
|
|
2022-09-05 15:05:41 +08:00
|
|
|
init(_ sequence: __owned some Sequence<Element>) {
|
2021-05-16 20:21:17 +08:00
|
|
|
self.store = Set(sequence)
|
|
|
|
}
|
|
|
|
|
|
|
|
init(_ store: Set<Element>) {
|
|
|
|
self.store = store
|
|
|
|
}
|
|
|
|
|
|
|
|
func contains(_ member: Element) -> Bool {
|
|
|
|
store.contains(member)
|
|
|
|
}
|
|
|
|
|
2022-11-18 20:22:02 +08:00
|
|
|
func union(_ other: Self) -> Self {
|
|
|
|
Self(store.union(other.store))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2022-11-18 20:22:02 +08:00
|
|
|
func intersection(_ other: Self) -> Self {
|
|
|
|
var defaultsSetAlgebra = Self()
|
2021-05-16 20:21:17 +08:00
|
|
|
defaultsSetAlgebra.store = store.intersection(other.store)
|
|
|
|
return defaultsSetAlgebra
|
|
|
|
}
|
|
|
|
|
2022-11-18 20:22:02 +08:00
|
|
|
func symmetricDifference(_ other: Self) -> Self {
|
|
|
|
var defaultedSetAlgebra = Self()
|
2021-05-16 20:21:17 +08:00
|
|
|
defaultedSetAlgebra.store = store.symmetricDifference(other.store)
|
|
|
|
return defaultedSetAlgebra
|
|
|
|
}
|
|
|
|
|
|
|
|
@discardableResult
|
2021-08-17 07:05:17 +08:00
|
|
|
mutating func insert(_ newMember: Element) -> (inserted: Bool, memberAfterInsert: Element) {
|
2021-05-16 20:21:17 +08:00
|
|
|
store.insert(newMember)
|
|
|
|
}
|
|
|
|
|
|
|
|
mutating func remove(_ member: Element) -> Element? {
|
|
|
|
store.remove(member)
|
|
|
|
}
|
|
|
|
|
|
|
|
mutating func update(with newMember: Element) -> Element? {
|
|
|
|
store.update(with: newMember)
|
|
|
|
}
|
|
|
|
|
2023-09-03 14:39:57 +08:00
|
|
|
mutating func formUnion(_ other: Self) {
|
2021-05-16 20:21:17 +08:00
|
|
|
store.formUnion(other.store)
|
|
|
|
}
|
|
|
|
|
2023-09-03 14:39:57 +08:00
|
|
|
mutating func formSymmetricDifference(_ other: Self) {
|
2021-05-16 20:21:17 +08:00
|
|
|
store.formSymmetricDifference(other.store)
|
|
|
|
}
|
|
|
|
|
2023-09-03 14:39:57 +08:00
|
|
|
mutating func formIntersection(_ other: Self) {
|
2021-05-16 20:21:17 +08:00
|
|
|
store.formIntersection(other.store)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension DefaultsSetAlgebra: Defaults.SetAlgebraSerializable {
|
|
|
|
func toArray() -> [Element] {
|
|
|
|
Array(store)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private let fixtureSetAlgebra = 0
|
|
|
|
private let fixtureSetAlgebra1 = 1
|
|
|
|
private let fixtureSetAlgebra2 = 2
|
|
|
|
private let fixtureSetAlgebra3 = 3
|
|
|
|
|
|
|
|
extension Defaults.Keys {
|
2024-09-26 05:17:26 +08:00
|
|
|
fileprivate static let setAlgebra = Key<DefaultsSetAlgebra<Int>>("setAlgebra", default: .init([fixtureSetAlgebra]), suite: suite_)
|
|
|
|
fileprivate static let setAlgebraArray = Key<[DefaultsSetAlgebra<Int>]>("setAlgebraArray", default: [.init([fixtureSetAlgebra])], suite: suite_)
|
|
|
|
fileprivate static let setAlgebraDictionary = Key<[String: DefaultsSetAlgebra<Int>]>("setAlgebraDictionary", default: ["0": .init([fixtureSetAlgebra])], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Suite(.serialized)
|
|
|
|
final class DefaultsSetAlgebraTests {
|
|
|
|
init() {
|
|
|
|
Defaults.removeAll(suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
deinit {
|
|
|
|
Defaults.removeAll(suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<DefaultsSetAlgebra<Int>>("independentSetAlgebraKey", default: .init([fixtureSetAlgebra]), suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key].insert(fixtureSetAlgebra)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key] == .init([fixtureSetAlgebra]))
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key].insert(fixtureSetAlgebra1)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testOptionalKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<DefaultsSetAlgebra<Int>?>("independentSetAlgebraOptionalKey", suite: suite_)
|
|
|
|
#expect(Defaults[key] == nil)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key] = .init([fixtureSetAlgebra])
|
|
|
|
Defaults[key]?.insert(fixtureSetAlgebra)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key] == .init([fixtureSetAlgebra]))
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key]?.insert(fixtureSetAlgebra1)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testArrayKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[DefaultsSetAlgebra<Int>]>("independentSetAlgebraArrayKey", default: [.init([fixtureSetAlgebra])], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key][0].insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key].append(.init([fixtureSetAlgebra2]))
|
|
|
|
Defaults[key][1].insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key][0] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key][1] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testArrayOptionalKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[DefaultsSetAlgebra<Int>]?>("independentSetAlgebraArrayOptionalKey", suite: suite_) // swiftlint:disable:this discouraged_optional_collection
|
|
|
|
#expect(Defaults[key] == nil)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key] = [.init([fixtureSetAlgebra])]
|
|
|
|
Defaults[key]?[0].insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key]?.append(.init([fixtureSetAlgebra2]))
|
|
|
|
Defaults[key]?[1].insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key]?[0] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key]?[1] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testNestedArrayKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[[DefaultsSetAlgebra<Int>]]>("independentSetAlgebraNestedArrayKey2", default: [[.init([fixtureSetAlgebra])]], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key][0][0].insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key][0].append(.init([fixtureSetAlgebra1]))
|
|
|
|
Defaults[key][0][1].insert(fixtureSetAlgebra2)
|
|
|
|
Defaults[key].append([.init([fixtureSetAlgebra3])])
|
|
|
|
Defaults[key][1][0].insert(fixtureSetAlgebra2)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key][0][0] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key][0][1] == .init([fixtureSetAlgebra1, fixtureSetAlgebra2]))
|
|
|
|
#expect(Defaults[key][1][0] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testArrayDictionaryKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[[String: DefaultsSetAlgebra<Int>]]>("independentSetAlgebraArrayDictionaryKey", default: [["0": .init([fixtureSetAlgebra])]], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key][0]["0"]?.insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key][0]["1"] = .init([fixtureSetAlgebra1])
|
|
|
|
Defaults[key][0]["1"]?.insert(fixtureSetAlgebra2)
|
|
|
|
Defaults[key].append(["0": .init([fixtureSetAlgebra3])])
|
|
|
|
Defaults[key][1]["0"]?.insert(fixtureSetAlgebra2)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key][0]["0"] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key][0]["1"] == .init([fixtureSetAlgebra1, fixtureSetAlgebra2]))
|
|
|
|
#expect(Defaults[key][1]["0"] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testDictionaryKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[String: DefaultsSetAlgebra<Int>]>("independentSetAlgebraDictionaryKey", default: ["0": .init([fixtureSetAlgebra])], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key]["0"]?.insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key]["1"] = .init([fixtureSetAlgebra2])
|
|
|
|
Defaults[key]["1"]?.insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key]["0"] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key]["1"] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testDictionaryOptionalKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[String: DefaultsSetAlgebra<Int>]?>("independentSetAlgebraDictionaryOptionalKey", suite: suite_) // swiftlint:disable:this discouraged_optional_collection
|
|
|
|
#expect(Defaults[key] == nil)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key] = ["0": .init([fixtureSetAlgebra])]
|
|
|
|
Defaults[key]?["0"]?.insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key]?["1"] = .init([fixtureSetAlgebra2])
|
|
|
|
Defaults[key]?["1"]?.insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key]?["0"] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key]?["1"] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testDictionaryArrayKey() {
|
2024-09-26 05:17:26 +08:00
|
|
|
let key = Defaults.Key<[String: [DefaultsSetAlgebra<Int>]]>("independentSetAlgebraDictionaryArrayKey", default: ["0": [.init([fixtureSetAlgebra])]], suite: suite_)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[key]["0"]?[0].insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[key]["0"]?.append(.init([fixtureSetAlgebra1]))
|
|
|
|
Defaults[key]["0"]?[1].insert(fixtureSetAlgebra2)
|
|
|
|
Defaults[key]["1"] = [.init([fixtureSetAlgebra3])]
|
|
|
|
Defaults[key]["1"]?[0].insert(fixtureSetAlgebra2)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[key]["0"]?[0] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[key]["0"]?[1] == .init([fixtureSetAlgebra1, fixtureSetAlgebra2]))
|
|
|
|
#expect(Defaults[key]["1"]?[0] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testType() {
|
|
|
|
let (inserted, _) = Defaults[.setAlgebra].insert(fixtureSetAlgebra)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(!inserted)
|
2021-05-16 20:21:17 +08:00
|
|
|
Defaults[.setAlgebra].insert(fixtureSetAlgebra1)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[.setAlgebra] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testArrayType() {
|
|
|
|
Defaults[.setAlgebraArray][0].insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[.setAlgebraArray].append(.init([fixtureSetAlgebra2]))
|
|
|
|
Defaults[.setAlgebraArray][1].insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[.setAlgebraArray][0] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[.setAlgebraArray][1] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
|
2024-09-26 05:17:26 +08:00
|
|
|
@Test
|
2021-05-16 20:21:17 +08:00
|
|
|
func testDictionaryType() {
|
|
|
|
Defaults[.setAlgebraDictionary]["0"]?.insert(fixtureSetAlgebra1)
|
|
|
|
Defaults[.setAlgebraDictionary]["1"] = .init([fixtureSetAlgebra2])
|
|
|
|
Defaults[.setAlgebraDictionary]["1"]?.insert(fixtureSetAlgebra3)
|
2024-09-26 05:17:26 +08:00
|
|
|
#expect(Defaults[.setAlgebraDictionary]["0"] == .init([fixtureSetAlgebra, fixtureSetAlgebra1]))
|
|
|
|
#expect(Defaults[.setAlgebraDictionary]["1"] == .init([fixtureSetAlgebra2, fixtureSetAlgebra3]))
|
2021-05-16 20:21:17 +08:00
|
|
|
}
|
|
|
|
}
|