Files
SwiftAudioEx/Example/Tests/QueueManagerTests.swift
2018-12-23 14:28:44 +01:00

489 lines
19 KiB
Swift

import Quick
import Nimble
@testable import SwiftAudio
class QueueManagerTests: QuickSpec {
let dummyItem = 0
let dummyItems: [Int] = [0, 1, 2, 3, 4, 5, 6]
override func spec() {
describe("A QueueManager") {
var manager: QueueManager<Int>!
beforeEach {
manager = QueueManager()
}
describe("its current item", {
it("should be nil", closure: {
expect(manager.current).to(beNil())
})
context("when one item is added", closure: {
beforeEach {
manager.addItem(self.dummyItem)
}
it("should not be nil", closure: {
expect(manager.current).toNot(beNil())
})
it("should be the added item", closure: {
expect(manager.current).to(equal(self.dummyItem))
})
context("then replaced", closure: {
beforeEach {
manager.replaceCurrentItem(with: 1)
}
it("should be the new item", closure: {
expect(manager.current).to(equal(1))
})
})
})
context("when replaced", closure: {
beforeEach {
manager.replaceCurrentItem(with: 1)
}
it("should not be nil", closure: {
expect(manager.current).toNot(beNil())
})
})
context("when mulitple items are added", {
beforeEach {
manager.addItems(self.dummyItems)
}
it("should not be nil", closure: {
expect(manager.current).toNot(beNil())
})
})
})
context("when adding one item", {
beforeEach {
manager.addItem(self.dummyItem)
}
it("should have an item in the queue", closure: {
expect(manager.items).notTo(beEmpty())
})
context("then replacing the item", closure: {
beforeEach {
manager.replaceCurrentItem(with: 1)
}
it("should have replaced the current item", closure: {
expect(manager.current).to(equal(1))
})
})
context("then calling next", {
var nextItem: Int?
beforeEach {
nextItem = try? manager.next()
}
it("should not return", closure: {
expect(nextItem).to(beNil())
})
})
context("then calling previous", {
var previousItem: Int?
beforeEach {
previousItem = try? manager.previous()
}
it("should not return", closure: {
expect(previousItem).to(beNil())
})
})
})
context("when adding multiple items", {
beforeEach {
manager.addItems(self.dummyItems)
}
it("should have items in the queue", closure: {
expect(manager.items.count).to(equal(self.dummyItems.count))
})
it("should have the first item as a current item", closure: {
expect(manager.current).toNot(beNil())
expect(manager.current).to(equal(self.dummyItems.first))
})
it("should have next items", closure: {
expect(manager.nextItems).toNot(beNil())
expect(manager.nextItems.count).to(equal(self.dummyItems.count - 1))
})
context("then calling next", {
var nextItem: Int?
beforeEach {
nextItem = try? manager.next()
}
it("should return the next item", closure: {
expect(nextItem).toNot(beNil())
expect(nextItem).to(equal(self.dummyItems[1]))
})
it("should have next current item", closure: {
expect(manager.current).to(equal(self.dummyItems[1]))
})
it("should have previous items", closure: {
expect(manager.previousItems).toNot(beNil())
})
context("then calling previous", {
var previousItem: Int?
beforeEach {
previousItem = try? manager.previous()
}
it("should return the first item", closure: {
expect(previousItem).toNot(beNil())
expect(previousItem).to(equal(self.dummyItems.first))
})
it("should have the previous current item", closure: {
expect(manager.current).to(equal(self.dummyItems.first))
})
})
context("then removing previous items", {
beforeEach {
manager.removePreviousItems()
}
it("should have no previous items", closure: {
expect(manager.previousItems.count).to(equal(0))
})
it("should have current index zero", closure: {
expect(manager.currentIndex).to(equal(0))
})
})
})
context("adding more items", {
var initialItemCount: Int!
let newItems: [Int] = [10, 11, 12, 13]
beforeEach {
initialItemCount = manager.items.count
try? manager.addItems(newItems, at: manager.items.endIndex - 1)
}
it("should have more items", closure: {
expect(manager.items.count).to(equal(initialItemCount + newItems.count))
})
})
context("adding more items at a smaller index than currentIndex", {
var initialCurrentIndex: Int!
let newItems: [Int] = [10, 11, 12, 13]
beforeEach {
initialCurrentIndex = manager.currentIndex
try? manager.addItems(newItems, at: initialCurrentIndex)
}
it("currentIndex should increase by number of new items", closure: {
expect(manager.currentIndex).to(equal(initialCurrentIndex + newItems.count))
})
})
// MARK: - Removal
context("then removing a item with index less than currentIndex", {
beforeEach {
var removed: Int?
var initialCurrentIndex: Int!
beforeEach {
let _ = try? manager.jump(to: 3)
initialCurrentIndex = manager.currentIndex
removed = try? manager.removeItem(at: initialCurrentIndex - 1)
}
it("should remove an item", closure: {
expect(removed).toNot(beNil())
})
it("should decrement the currentIndex", closure: {
expect(manager.currentIndex).to(equal(initialCurrentIndex - 1))
})
}
})
context("then removing the second item", {
var removed: Int?
beforeEach {
removed = try? manager.removeItem(at: 1)
}
it("should have one less item", closure: {
expect(removed).toNot(beNil())
expect(manager.items.count).to(equal(self.dummyItems.count - 1))
})
})
context("then removing the last item", {
var removed: Int?
beforeEach {
removed = try? manager.removeItem(at: self.dummyItems.count - 1)
}
it("should have one less item", closure: {
expect(removed).toNot(beNil())
expect(manager.items.count).to(equal(self.dummyItems.count - 1))
})
})
context("then removing the current item", {
var removed: Int?
beforeEach {
removed = try? manager.removeItem(at: manager.currentIndex)
}
it("should not remove any items", closure: {
expect(removed).to(beNil())
expect(manager.items.count).to(equal(self.dummyItems.count))
})
})
context("then removing with too large index", {
var removed: Int?
beforeEach {
removed = try? manager.removeItem(at: self.dummyItems.count)
}
it("should not remove any items", closure: {
expect(removed).to(beNil())
expect(manager.items.count).to(equal(self.dummyItems.count))
})
})
context("then removing with too small index", {
var removed: Int?
beforeEach {
removed = try? manager.removeItem(at: -1)
}
it("should not remove any items", closure: {
expect(removed).to(beNil())
expect(manager.items.count).to(equal(self.dummyItems.count))
})
})
context("then removing upcoming items", {
beforeEach {
manager.removeUpcomingItems()
}
it("should have no next items", closure: {
expect(manager.nextItems.count).to(equal(0))
})
})
// MARK: - Jumping
context("then jumping to the current item", {
var error: Error?
var item: Int?
beforeEach {
do {
item = try manager.jump(to: manager.currentIndex)
}
catch let err {
error = err
}
}
it("should not return an item", closure: {
expect(item).to(beNil())
})
it("should throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("then jumping to the second item", {
var jumped: Int?
beforeEach {
try? jumped = manager.jump(to: 1)
}
it("should return the current item", closure: {
expect(jumped).toNot(beNil())
expect(jumped).to(equal(manager.current))
})
it("should move the current index", closure: {
expect(manager.currentIndex).to(equal(1))
})
})
context("then jumping to last item", closure: {
var jumped: Int?
beforeEach {
try? jumped = manager.jump(to: manager.items.count - 1)
}
it("should return the current item", closure: {
expect(jumped).toNot(beNil())
expect(jumped).to(equal(manager.current))
})
it("should move the current index", closure: {
expect(manager.currentIndex).to(equal(manager.items.count - 1))
})
})
context("then jumping to a negative index", closure: {
var jumped: Int?
beforeEach {
jumped = try? manager.jump(to: -1)
}
it("should not return", closure: {
expect(jumped).to(beNil())
})
it("should not move the current index", closure: {
expect(manager.currentIndex).to(equal(0))
})
})
context("then jumping with too large index", closure: {
var jumped: Int?
beforeEach {
jumped = try? manager.jump(to: manager.items.count)
}
it("should not return", closure: {
expect(jumped).to(beNil())
})
it("should not move the current index", closure: {
expect(manager.currentIndex).to(equal(0))
})
})
// MARK: - Moving
context("moving from current index", {
var error: Error?
beforeEach {
do {
try manager.moveItem(fromIndex: manager.currentIndex, toIndex: manager.currentIndex + 1)
}
catch let err { error = err }
}
it("throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("moving from a negative index", {
var error: Error?
beforeEach {
do {
try manager.moveItem(fromIndex: -1, toIndex: manager.currentIndex + 1)
}
catch let err { error = err }
}
it("should throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("moving from a too large index", {
var error: Error?
beforeEach {
do {
try manager.moveItem(fromIndex: manager.items.count, toIndex: manager.currentIndex + 1)
}
catch let err { error = err }
}
it("should throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("moving to a negative index", {
var error: Error?
beforeEach {
do {
try manager.moveItem(fromIndex: manager.currentIndex + 1, toIndex: -1)
}
catch let err { error = err }
}
it("should throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("moving to a too large index", {
var error: Error?
beforeEach {
do {
try manager.moveItem(fromIndex: manager.currentIndex + 1, toIndex: manager.items.count)
}
catch let err { error = err }
}
it("should throw an error", closure: {
expect(error).toNot(beNil())
})
})
context("then moving 2nd to 4th", closure: {
let afterMoving: [Int] = [0, 2, 3, 1, 4, 5, 6]
beforeEach {
try? manager.moveItem(fromIndex: 1, toIndex: 3)
}
it("should move the item", closure: {
expect(manager.items).to(equal(afterMoving))
})
})
// MARK: - Clear
context("when queue is cleared", {
beforeEach {
manager.clearQueue()
}
it("should have currentIndex 0", closure: {
expect(manager.currentIndex).to(equal(0))
})
it("should have no items", closure: {
expect(manager.items.count).to(equal(0))
})
})
})
}
}
}