CacheCreek/CacheCreekTests/LRUCacheTests.swift

260 lines
7 KiB
Swift

//
// CacheCreekTests.swift
// CacheCreekTests
//
// Created by Christopher Luu on 1/26/16.
//
//
import XCTest
@testable import CacheCreek
class CacheCreekTests: XCTestCase {
typealias Node = DoublyLinkedListNode
func testSettingAndGettingItems() {
let cache = LRUCache()
cache.set(item: 123, forKey: "123")
XCTAssert(cache.count == 1)
XCTAssert(cache.item(forKey: "123") == 123)
XCTAssert(cache[123] == nil)
cache[234] = "234"
XCTAssert(cache.count == 2)
XCTAssert(cache.item(forKey: 234) == "234")
// Test setting/getting an array
let array = [1, 2, 3, 4, 5]
cache[5] = array
XCTAssert(cache.count == 3)
if let fetchedArray: [Int] = cache.item(forKey: 5) {
XCTAssert(fetchedArray == array)
}
else {
XCTFail("Expected an int array")
}
let testStruct = TestStruct(name: "Testing", value: Int(arc4random_uniform(100000)))
cache["TestingStruct"] = testStruct
guard let fetchedStruct: TestStruct = cache.item(forKey: "TestingStruct") else {
XCTFail()
return
}
XCTAssert(testStruct.name == fetchedStruct.name)
XCTAssert(testStruct.value == fetchedStruct.value)
}
func testDifferentKindsOfKeys() {
let cache = LRUCache()
let floatKey: Float = 123.456
cache.set(item: 123.456, forKey: floatKey)
XCTAssert(cache.item(forKey: floatKey) as Double? == .Some(123.456))
cache[floatKey] = 456.789
XCTAssert(cache.count == 1)
XCTAssert(cache[floatKey] as? Double == .Some(456.789))
cache.set(item: "123.456", forKey: "123.456")
XCTAssert(cache.count == 2)
XCTAssert(cache.item(forKey: "123.456") as String? == .Some("123.456"))
let boolKey = true
cache.set(item: true, forKey: boolKey)
XCTAssert(cache.count == 3)
XCTAssert(cache.item(forKey: boolKey) as Bool? == .Some(true))
cache.removeItem(forKey: boolKey)
XCTAssert(cache.count == 2)
XCTAssert(cache.item(forKey: boolKey) as Bool? == .None)
}
func testSettingAndGettingEnum() {
let cache = LRUCache()
cache["ABC"] = TestEnum.ABC
cache["DEF"] = TestEnum.DEF("BlahBlahBlah")
cache["GHI"] = TestEnum.GHI(-500)
guard let abc: TestEnum = cache.item(forKey: "ABC"),
def: TestEnum = cache.item(forKey: "DEF"),
ghi: TestEnum = cache.item(forKey: "GHI")
else {
XCTFail()
return
}
switch (abc, def, ghi) {
case (.ABC, .DEF(let stringValue), .GHI(let intValue)):
XCTAssert(stringValue == "BlahBlahBlah")
XCTAssert(intValue == -500)
default:
XCTFail()
}
}
func testSubscripts() {
let cache = LRUCache()
// Int subscript
cache[123] = 123
XCTAssert(cache[123] as? Int == .Some(123))
XCTAssert(cache.count == 1)
cache[123] = nil
XCTAssert(cache[123] as? Int == .None)
XCTAssert(cache.count == 0)
// String subscript
cache["123"] = 123
XCTAssert(cache["123"] as? Int == .Some(123))
XCTAssert(cache.count == 1)
cache["123"] = nil
XCTAssert(cache["123"] as? Int == .None)
XCTAssert(cache.count == 0)
// Float subscript
let floatKey: Float = 3.14
cache[floatKey] = 123
XCTAssert(cache[floatKey] as? Int == .Some(123))
XCTAssert(cache.count == 1)
cache[floatKey] = nil
XCTAssert(cache[floatKey] as? Int == .None)
XCTAssert(cache.count == 0)
}
func testRemovingItems() {
let cache = LRUCache()
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 4)
cache.removeItem(forKey: 123)
XCTAssert(cache.count == 3)
XCTAssert(cache[123] == nil)
cache[234] = nil
XCTAssert(cache.count == 2)
XCTAssert(cache[234] == nil)
cache.removeAllItems()
XCTAssert(cache.count == 0)
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 4)
NSNotificationCenter.defaultCenter().postNotificationName(UIApplicationDidReceiveMemoryWarningNotification, object: UIApplication.sharedApplication())
XCTAssert(cache.count == 0)
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 4)
NSNotificationCenter.defaultCenter().postNotificationName(UIApplicationDidEnterBackgroundNotification, object: UIApplication.sharedApplication())
XCTAssert(cache.count == 0)
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 4)
// Make sure an unknown key doesn't have any weird side effects
cache[567] = nil
XCTAssert(cache.count == 4)
cache.removeItem(forKey: 999)
XCTAssert(cache.count == 4)
}
func testCountLimit() {
let cache = LRUCache()
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 4)
cache.countLimit = 3
XCTAssert(cache.count == 3)
cache.removeAllItems()
XCTAssert(cache.count == 0)
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
XCTAssert(cache.count == 3)
cache[567] = 567
XCTAssert(cache.count == 3)
cache.removeAllItems()
cache.set(item: 123, forKey: 123)
cache.set(item: 234, forKey: 234)
cache.set(item: 345, forKey: 345)
cache.set(item: 456, forKey: 456)
cache.countLimit = 2
XCTAssert(cache.count == 2)
}
func testEmptyEviction() {
// Make sure that an eviction on an empty dictionary doesn't crash
let cache = LRUCache()
cache.evictItems()
}
func testObjCObjects() {
let cache = LRUCache()
let oldCache = NSCache()
cache.set(item: oldCache, forKey: "InceptionCache")
guard let _: NSCache = cache.item(forKey: "InceptionCache") else {
XCTFail("Expected an NSCache object")
return
}
}
}
private struct TestStruct {
let name: String
let value: Int
}
private enum TestEnum {
case ABC
case DEF(String)
case GHI(Int)
}