Signal-iOS/Signal/test/ViewControllers/JournalingOrderedDictionaryTests.swift
george-signal 7a49a0fa82
Adopt JournalingOrderedDictionary. (#5405)
This change also moves mutation to the ordered
dictionary into a separate queue. There is no
change to behavior yet because the queue is only
dispatched to synchronously so far. Doing this
forces changes to how database transactions are
acquired since they must be used on the same queue
where they orignated.
2022-11-16 17:31:23 -08:00

109 lines
3.3 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
@testable import Signal
private enum StringChange: CustomDebugStringConvertible, Equatable {
var debugDescription: String {
switch self {
case .replace(let value): return "replace(\(value))"
}
}
case replace(String)
}
enum Letter: Hashable {
case a
case b
}
class JournalingOrderedDictionaryTest: SignalBaseTest {
func testPrepend() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.prepend(key: .a, value: "a")
sut.prepend(key: .b, value: "b")
XCTAssertEqual(sut.orderedKeys, [.b, .a])
XCTAssertEqual(sut[.b], "b")
XCTAssertEqual(sut[.a], "a")
XCTAssertEqual(sut[0].value, "b")
XCTAssertEqual(sut[1].value, "a")
XCTAssertEqual(sut.journal, [
.prepend,
.prepend])
}
func testAppend() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.append(key: .a, value: "a")
sut.append(key: .b, value: "b")
XCTAssertEqual(sut.orderedKeys, [.a, .b])
XCTAssertEqual(sut[.a], "a")
XCTAssertEqual(sut[.b], "b")
XCTAssertEqual(sut[0].value, "a")
XCTAssertEqual(sut[1].value, "b")
XCTAssertEqual(sut.journal, [
.append,
.append])
}
func testReplace() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.append(key: .a, value: "a")
sut.append(key: .b, value: "b")
sut.replaceValue(at: sut.orderedKeys.firstIndex(of: .a)!,
value: "A",
changes: [.replace("A")])
XCTAssertEqual(sut.orderedKeys, [.a, .b])
XCTAssertEqual(sut[.a], "A")
XCTAssertEqual(sut[.b], "b")
XCTAssertEqual(sut[0].value, "A")
XCTAssertEqual(sut[1].value, "b")
XCTAssertEqual(sut.journal, [
.append,
.append,
.modify(index: 0, changes: [.replace("A")])])
}
func testRemove() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.append(key: .a, value: "a")
sut.append(key: .b, value: "b")
sut.remove(at: 0)
XCTAssertEqual(sut.orderedKeys, [.b])
XCTAssertEqual(sut[.b], "b")
XCTAssertEqual(sut[0].value, "b")
XCTAssertEqual(sut.journal, [
.append,
.append,
.remove(index: 0)])
}
func testRemoveAll() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.append(key: .a, value: "a")
sut.append(key: .b, value: "b")
sut.removeAll()
XCTAssertEqual(sut.orderedKeys, [])
XCTAssertEqual(sut.journal, [.removeAll])
}
func testTakeJournal() {
var sut = JournalingOrderedDictionary<Letter, String, StringChange>()
sut.append(key: .a, value: "a")
sut.append(key: .b, value: "b")
let journal = sut.takeJournal()
XCTAssertEqual(journal, [.append, .append])
XCTAssertEqual(sut.orderedKeys, [.a, .b])
XCTAssertEqual(sut[.a], "a")
XCTAssertEqual(sut[.b], "b")
XCTAssertEqual(sut[0].value, "a")
XCTAssertEqual(sut[1].value, "b")
XCTAssertEqual(sut.journal, [])
}
}