import XCTest import GRDB private struct TestError : Error { } class AnyCursorTests: GRDBTestCase { func testAnyCursorFromClosure() { var i = 0 let cursor: AnyCursor = AnyCursor { guard i < 2 else { return nil } defer { i += 1 } return i } XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) XCTAssertTrue(try cursor.next() == nil) // end } func testAnyCursorFromThrowingClosure() { var i = 0 let cursor: AnyCursor = AnyCursor { guard i < 2 else { throw TestError() } defer { i += 1 } return i } XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) do { _ = try cursor.next() XCTFail() } catch is TestError { } catch { XCTFail() } } func testAnyCursorFromCursor() { let base = AnyCursor([0, 1]) // This helper function makes sure AnyCursor initializer accepts any cursor, // and not only AnyCursor: func makeAnyCursor(_ cursor: C) -> AnyCursor where C.Element == Int { AnyCursor(cursor) } let cursor = AnyCursor(base) XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) XCTAssertTrue(try cursor.next() == nil) // end } func testAnyCursorFromThrowingCursor() { var i = 0 let base: AnyCursor = AnyCursor { guard i < 2 else { throw TestError() } defer { i += 1 } return i } func makeAnyCursor(_ cursor: C) -> AnyCursor where C.Element == Int { AnyCursor(cursor) } let cursor = makeAnyCursor(base) XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) do { _ = try cursor.next() XCTFail() } catch is TestError { } catch { XCTFail() } } func testAnyCursorFromIterator() { let cursor = AnyCursor(iterator: [0, 1].makeIterator()) XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) XCTAssertTrue(try cursor.next() == nil) // end XCTAssertTrue(try cursor.next() == nil) // past the end } func testAnyCursorFromSequence() { let cursor = AnyCursor([0, 1]) XCTAssertEqual(try cursor.next()!, 0) XCTAssertEqual(try cursor.next()!, 1) XCTAssertTrue(try cursor.next() == nil) // end XCTAssertTrue(try cursor.next() == nil) // past the end } }