Gifu/GifuTests/GifuTests.swift

99 lines
2.8 KiB
Swift

import XCTest
import ImageIO
@testable import Gifu
private let imageData = testImageDataNamed("mugen.gif")
private let staticImage = UIImage(data: imageData)!
private let preloadFrameCount = 20
class DummyAnimatable: GIFAnimatable {
init() {}
var animator: Animator? = nil
var image: UIImage? = nil
var layer = CALayer()
var frame: CGRect = .zero
var contentMode: UIViewContentMode = .scaleToFill
func animatorHasNewFrame() {}
}
class GifuTests: XCTestCase {
var animator: Animator!
var originalFrameCount: Int!
let delegate = DummyAnimatable()
override func setUp() {
super.setUp()
animator = Animator(withDelegate: delegate)
animator.prepareForAnimation(withGIFData: imageData, size: staticImage.size, contentMode: .scaleToFill)
originalFrameCount = 44
}
func testIsAnimatable() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
XCTAssertTrue(store.isAnimatable)
}
func testCurrentFrame() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
XCTAssertEqual(store.currentFrameIndex, 0)
}
func testFramePreload() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
let expectation = self.expectation(description: "frameDuration")
store.prepareFrames {
let animatedFrameCount = store.animatedFrames.count
XCTAssertEqual(animatedFrameCount, self.originalFrameCount)
XCTAssertNotNil(store.frame(at: preloadFrameCount - 1))
XCTAssertNil(store.frame(at: preloadFrameCount + 1)?.images)
XCTAssertEqual(store.currentFrameIndex, 0)
store.shouldChangeFrame(with: 1.0) { hasNewFrame in
XCTAssertTrue(hasNewFrame)
XCTAssertEqual(store.currentFrameIndex, 1)
expectation.fulfill()
}
}
waitForExpectations(timeout: 1.0) { error in
if let error = error {
print("Error: \(error.localizedDescription)")
}
}
}
func testFrameInfo() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
let expectation = self.expectation(description: "testFrameInfoIsAccurate")
store.prepareFrames {
let frameDuration = store.frame(at: 5)?.duration ?? 0
XCTAssertTrue((frameDuration - 0.05) < 0.00001)
let imageSize = store.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))
}