import XCTest import ImageIO @testable import Gifu private let imageData = testImageDataNamed("mugen.gif") private let staticImage = UIImage(data: imageData)! private let preloadFrameCount = 20 class GifuTests: XCTestCase { var animator: Animator! var originalFrameCount: Int! override func setUp() { super.setUp() animator = Animator(data: imageData, size: CGSize.zero, contentMode: .scaleToFill, framePreloadCount: preloadFrameCount) originalFrameCount = Int(CGImageSourceGetCount(animator.imageSource)) } func testIsAnimatable() { XCTAssertTrue(animator.isAnimatable) } func testCurrentFrame() { XCTAssertEqual(animator.currentFrameIndex, 0) XCTAssertEqual(animator.currentFrameDuration, TimeInterval.infinity) XCTAssertNil(animator.currentFrameImage) } func testFramePreload() { let expectation = self.expectation(description: "frameDuration") animator.prepareFrames { let animatedFrameCount = self.animator.animatedFrames.count XCTAssertEqual(animatedFrameCount, self.originalFrameCount) XCTAssertNotNil(self.animator.frame(at: preloadFrameCount - 1)) XCTAssertNil(self.animator.frame(at: preloadFrameCount + 1)?.images) XCTAssertEqual(self.animator.currentFrameIndex, 0) self.animator.shouldChangeFrame(with: 1.0) { hasNewFrame in XCTAssertTrue(hasNewFrame) XCTAssertEqual(self.animator.currentFrameIndex, 1) expectation.fulfill() } } waitForExpectations(timeout: 1.0) { error in if let error = error { print("Error: \(error.localizedDescription)") } } } func testFrameInfo() { let expectation = self.expectation(description: "testFrameInfoIsAccurate") animator.prepareFrames { let frameDuration = self.animator.frame(at: 5)?.duration ?? 0 XCTAssertTrue((frameDuration - 0.05) < 0.00001) let imageSize = self.animator.frame(at: 5)?.size ?? CGSize.zero XCTAssertEqual(imageSize, staticImage.size) expectation.fulfill() } waitForExpectations(timeout: 1.0) { error in if let error = error { print("Error: \(error.localizedDescription)") } } } } private func testImageDataNamed(_ name: String) -> Data { let testBundle = Bundle(for: GifuTests.self) let imagePath = testBundle.bundleURL.appendingPathComponent(name) return (try! Data(contentsOf: imagePath)) }