170 lines
5.0 KiB
Swift
170 lines
5.0 KiB
Swift
import XCTest
|
|
@testable import Schedule
|
|
|
|
final class TaskTests: XCTestCase {
|
|
|
|
let leeway = 0.01.second
|
|
|
|
func testMetrics() {
|
|
let e = expectation(description: "testMetrics")
|
|
let date = Date()
|
|
|
|
let task = Plan.after(0.01.second, repeating: 0.01.second).do(queue: .global()) {
|
|
e.fulfill()
|
|
}
|
|
XCTAssertTrue(task.creationDate.interval(since: date).isAlmostEqual(to: 0.second, leeway: leeway))
|
|
|
|
waitForExpectations(timeout: 0.1)
|
|
|
|
XCTAssertNotNil(task.firstExecutionDate)
|
|
XCTAssertTrue(task.firstExecutionDate!.interval(since: date).isAlmostEqual(to: 0.01.second, leeway: leeway))
|
|
|
|
XCTAssertNotNil(task.lastExecutionDate)
|
|
XCTAssertTrue(task.lastExecutionDate!.interval(since: date).isAlmostEqual(to: 0.01.second, leeway: leeway))
|
|
|
|
XCTAssertEqual(task.executionDates!.count, 1)
|
|
}
|
|
|
|
func testAfter() {
|
|
let e = expectation(description: "testSchedule")
|
|
let date = Date()
|
|
let task = Plan.after(0.01.second).do(queue: .global()) {
|
|
XCTAssertTrue(Date().interval(since: date).isAlmostEqual(to: 0.01.second, leeway: self.leeway))
|
|
e.fulfill()
|
|
}
|
|
waitForExpectations(timeout: 0.1)
|
|
|
|
_ = task
|
|
}
|
|
|
|
func testRepeat() {
|
|
let e = expectation(description: "testRepeat")
|
|
var count = 0
|
|
let task = Plan.every(0.01.second).first(3).do(queue: .global()) {
|
|
count += 1
|
|
if count == 3 { e.fulfill() }
|
|
}
|
|
waitForExpectations(timeout: 0.1)
|
|
|
|
_ = task
|
|
}
|
|
|
|
func testTaskCenter() {
|
|
let task = Plan.never.do { }
|
|
XCTAssertTrue(task.taskCenter === TaskCenter.default)
|
|
|
|
task.removeFromTaskCenter()
|
|
XCTAssertNil(task.taskCenter)
|
|
|
|
let center = TaskCenter()
|
|
task.addToTaskCenter(center)
|
|
XCTAssertTrue(task.taskCenter === center)
|
|
}
|
|
|
|
func testDispatchQueue() {
|
|
let e = expectation(description: "testQueue")
|
|
let q = DispatchQueue(label: UUID().uuidString)
|
|
|
|
let task = Plan.after(0.01.second).do(queue: q) {
|
|
XCTAssertTrue(DispatchQueue.is(q))
|
|
e.fulfill()
|
|
}
|
|
waitForExpectations(timeout: 0.1)
|
|
|
|
_ = task
|
|
}
|
|
|
|
func testThread() {
|
|
let e = expectation(description: "testThread")
|
|
DispatchQueue.global().async {
|
|
let thread = Thread.current
|
|
let task = Plan.after(0.01.second).do { task in
|
|
XCTAssertTrue(thread === Thread.current)
|
|
e.fulfill()
|
|
task.cancel()
|
|
}
|
|
_ = task
|
|
RunLoop.current.run()
|
|
}
|
|
waitForExpectations(timeout: 0.1)
|
|
}
|
|
|
|
func testExecuteNow() {
|
|
let e = expectation(description: "testExecuteNow")
|
|
let task = Plan.never.do {
|
|
e.fulfill()
|
|
}
|
|
task.executeNow()
|
|
waitForExpectations(timeout: 0.1)
|
|
}
|
|
|
|
func testReschedule() {
|
|
let e = expectation(description: "testReschedule")
|
|
var i = 0
|
|
let task = Plan.after(0.01.second).do(queue: .global()) { (task) in
|
|
i += 1
|
|
if task.executionCount == 3 && task.estimatedNextExecutionDate == nil {
|
|
e.fulfill()
|
|
}
|
|
if task.executionCount > 3 {
|
|
XCTFail("should never come here")
|
|
}
|
|
}
|
|
DispatchQueue.global().async(after: 0.02.second) {
|
|
task.reschedule(Plan.every(0.01.second).first(2))
|
|
}
|
|
waitForExpectations(timeout: 0.1)
|
|
}
|
|
|
|
func testSuspendResume() {
|
|
let task = Plan.never.do { }
|
|
XCTAssertEqual(task.suspensionCount, 0)
|
|
task.suspend()
|
|
task.suspend()
|
|
task.suspend()
|
|
XCTAssertEqual(task.suspensionCount, 3)
|
|
task.resume()
|
|
XCTAssertEqual(task.suspensionCount, 2)
|
|
}
|
|
|
|
func testCancel() {
|
|
let task = Plan.never.do { }
|
|
XCTAssertFalse(task.isCancelled)
|
|
task.cancel()
|
|
XCTAssertTrue(task.isCancelled)
|
|
}
|
|
|
|
func testAddAndRemoveActions() {
|
|
let e = expectation(description: "testAddAndRemoveActions")
|
|
let task = Plan.after(0.1.second).do { }
|
|
let date = Date()
|
|
let key = task.addAction { _ in
|
|
XCTAssertTrue(Date().timeIntervalSince(date).isAlmostEqual(to: 0.1, leeway: 0.1))
|
|
e.fulfill()
|
|
}
|
|
XCTAssertEqual(task.actionCount, 2)
|
|
waitForExpectations(timeout: 0.5)
|
|
|
|
task.removeAction(byKey: key)
|
|
XCTAssertEqual(task.actionCount, 1)
|
|
|
|
task.cancel()
|
|
|
|
task.removeAllActions()
|
|
XCTAssertEqual(task.actionCount, 0)
|
|
}
|
|
|
|
static var allTests = [
|
|
("testAfter", testAfter),
|
|
("testRepeat", testRepeat),
|
|
("testTaskCenter", testTaskCenter),
|
|
("testDispatchQueue", testDispatchQueue),
|
|
("testThread", testThread),
|
|
("testExecuteNow", testExecuteNow),
|
|
("testReschedule", testReschedule),
|
|
("testSuspendResume", testSuspendResume),
|
|
("testCancel", testCancel),
|
|
("testAddAndRemoveActions", testAddAndRemoveActions)
|
|
]
|
|
}
|