Changelog-Added: Add trie-based user search cache to replace non-performant linear scans Bounty: lnbc500u1pj2pj5upp5mgcxn3893hayv839vqhxsljk337zf3e4xswde2eschd802x696esdqqcqzzsxqyz5vqsp5s28vfqgu9tqhamuu2hn4mltmhhznhcjsh7fjnm696z0n5naf046s9qyyssq6ylrtgtqzkxz8xc00as887qzsxzwgjrl3wz08r8n223lcmq7y2qsskgtmt9hwgzgxa37g7ajwm9uvejwkctjuz636fh7gr2lm0jymqqqmk7fyg
80 lines
2.3 KiB
Swift
80 lines
2.3 KiB
Swift
//
|
|
// TrieTests.swift
|
|
// damusTests
|
|
//
|
|
// Created by Terry Yiu on 6/26/23.
|
|
//
|
|
|
|
import XCTest
|
|
@testable import damus
|
|
|
|
final class TrieTests: XCTestCase {
|
|
|
|
func testFind() throws {
|
|
let trie = Trie<String>()
|
|
|
|
let keys = ["foobar", "food", "foo", "somethingelse", "duplicate", "duplicate"]
|
|
keys.forEach {
|
|
trie.insert(key: $0, value: $0)
|
|
}
|
|
|
|
let allResults = trie.find(key: "")
|
|
XCTAssertEqual(Set(allResults), Set(["foobar", "food", "foo", "somethingelse", "duplicate"]))
|
|
|
|
let fooResults = trie.find(key: "foo")
|
|
XCTAssertEqual(fooResults.first, "foo")
|
|
XCTAssertEqual(Set(fooResults), Set(["foobar", "food", "foo"]))
|
|
|
|
let foodResults = trie.find(key: "food")
|
|
XCTAssertEqual(foodResults, ["food"])
|
|
|
|
let ooResults = trie.find(key: "oo")
|
|
XCTAssertEqual(Set(ooResults), Set(["foobar", "food", "foo"]))
|
|
|
|
let aResults = trie.find(key: "a")
|
|
XCTAssertEqual(Set(aResults), Set(["foobar", "duplicate"]))
|
|
|
|
let notFoundResults = trie.find(key: "notfound")
|
|
XCTAssertEqual(notFoundResults, [])
|
|
|
|
// Sanity check that the root node has children.
|
|
XCTAssertTrue(trie.hasChildren)
|
|
|
|
// Sanity check that the root node has no values.
|
|
XCTAssertFalse(trie.hasValues)
|
|
}
|
|
|
|
func testRemove() {
|
|
let trie = Trie<String>()
|
|
|
|
let keys = ["foobar", "food", "foo", "somethingelse", "duplicate", "duplicate"]
|
|
keys.forEach {
|
|
trie.insert(key: $0, value: $0)
|
|
}
|
|
|
|
keys.forEach {
|
|
trie.remove(key: $0, value: $0)
|
|
}
|
|
|
|
let allResults = trie.find(key: "")
|
|
XCTAssertTrue(allResults.isEmpty)
|
|
|
|
let fooResults = trie.find(key: "foo")
|
|
XCTAssertTrue(fooResults.isEmpty)
|
|
|
|
let foodResults = trie.find(key: "food")
|
|
XCTAssertTrue(foodResults.isEmpty)
|
|
|
|
let ooResults = trie.find(key: "oo")
|
|
XCTAssertTrue(ooResults.isEmpty)
|
|
|
|
let aResults = trie.find(key: "a")
|
|
XCTAssertTrue(aResults.isEmpty)
|
|
|
|
// Verify that removal of values from all the keys that were inserted in the trie previously also resulted in the cleanup of the trie.
|
|
XCTAssertFalse(trie.hasChildren)
|
|
XCTAssertFalse(trie.hasValues)
|
|
}
|
|
|
|
}
|