Extensions
Test Extension
Simple wrapper functions to make assertions a bit more readable at call sites and so we don't have to constantly prefix assertions with XCT
.
Assert
public struct Assert<TestValueType> {
private let testValue: TestValueType
public init(_ testValue: TestValueType) {
self.testValue = testValue
}
}
Identity
// MARK: - Identity
extension Assert where TestValueType == Optional<AnyObject> {
public func isIdentical<R>(to expression: @autoclosure () throws -> R, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) where R == TestValueType {
XCTAssertIdentical(testValue, try expression(), message(), file: file, line: line)
}
public func isNotIdentical<R>(to expression: @autoclosure () throws -> R, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) where R == TestValueType {
XCTAssertNotIdentical(testValue, try expression(), message(), file: file, line: line)
}
}
Optional
// MARK: - Optional
extension Assert where TestValueType == Optional<Any> {
public func isNil(message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNil(testValue, message(), file: file, line: line)
}
public func isNotNil(message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNotNil(testValue, message(), file: file, line: line)
}
}
Equatable
// MARK: - Equatable
extension Assert where TestValueType: Equatable {
public func isEqual(to expression: @autoclosure () throws -> TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertEqual(testValue, try expression(), message(), file: file, line: line)
}
public func isNotEqual(to expression: @autoclosure () throws -> TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNotEqual(testValue, try expression(), message(), file: file, line: line)
}
}
Floating Point
// MARK: - Floating Point
extension Assert where TestValueType: FloatingPoint {
public func isEqual(to expression: @autoclosure () throws -> TestValueType, withAccuracy accuracy: TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertEqual(testValue, try expression(), accuracy: accuracy, message(), file: file, line: line)
}
public func isNotEqual(to expression: @autoclosure () throws -> TestValueType, withAccuracy accuracy: TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNotEqual(testValue, try expression(), accuracy: accuracy, message(), file: file, line: line)
}
}
Numeric
// MARK: - Numeric
extension Assert where TestValueType: Numeric {
public func isEqual(to expression1: @autoclosure () throws -> TestValueType, withAccuracy accuracy: TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertEqual(testValue, try expression1(), accuracy: accuracy, message(), file: file, line: line)
}
public func isNotEqual(to expression1: @autoclosure () throws -> TestValueType, withAccuracy accuracy: TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNotEqual(testValue, try expression1(), accuracy: accuracy, message(), file: file, line: line)
}
}
Boolean
// MARK: - Boolean
extension Assert where TestValueType == Optional<Bool> {
public func isFalse(message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertFalse(testValue ?? true, message(), file: file, line: line)
}
public func isTrue(message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertTrue(testValue ?? false, message(), file: file, line: line)
}
}
Comparable
// MARK: - Comparable
extension Assert where TestValueType: Comparable {
public func isGreaterThan(_ expression: @autoclosure () throws -> TestValueType, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertGreaterThan(testValue, try expression(), message(), file: file, line: line)
}
public func isGreaterThanOrEqual(to expression: @autoclosure () throws -> TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertGreaterThanOrEqual(testValue, try expression(), message(), file: file, line: line)
}
public func isLessThan(_ expression: @autoclosure () throws -> TestValueType, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertLessThan(testValue, try expression(), message(), file: file, line: line)
}
public func isLessThanOrEqual(to expression: @autoclosure () throws -> TestValueType, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertLessThanOrEqual(testValue, try expression(), message(), file: file, line: line)
}
}
Throwing
// MARK: - Throwing
extension Assert {
public struct Function<ReturnType> {
private let testExpression: () throws -> ReturnType
init(_ testExpression: @autoclosure @escaping () throws -> ReturnType) {
self.testExpression = testExpression
}
}
}
extension Assert.Function {
public func doesNotThrow(message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertNoThrow(testExpression, message(), file: file, line: line)
}
public func throwsError(errorHandler: (_ error: Error) -> Void = { _ in }, message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
XCTAssertThrowsError(testExpression, message(), file: file, line: line, errorHandler)
}
}
public func Unwrap<T>(_ expression: @autoclosure () throws -> T?, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) throws -> T {
return try XCTUnwrap(expression())
}