/***************************************************************************** * VLCMediaThumbnailerTest.swift ***************************************************************************** * Copyright (C) 2018 VLC authors and VideoLAN * $Id$ * * Authors: Mike JS. Choi * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ import XCTest class MockThumbnailerDelegate: NSObject, VLCMediaThumbnailerDelegate { var timedOutExpectation: XCTestExpectation? var finishedExpectation: XCTestExpectation? func mediaThumbnailerDidTimeOut(_ mediaThumbnailer: VLCMediaThumbnailer!) { timedOutExpectation?.fulfill() } func mediaThumbnailer(_ mediaThumbnailer: VLCMediaThumbnailer!, didFinishThumbnail thumbnail: CGImage!) { finishedExpectation?.fulfill() } } class VLCMediaThumbnailerTest: XCTestCase { // MARK: Initializers func testInitWithMediaAndDelegate() throws { let tests = Video.standards.map{ $0.media } for media in tests { let delegate = MockThumbnailerDelegate() let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: media, andDelegate: delegate)) XCTAssertNil(thumbnailer.thumbnail) XCTAssertNotNil(thumbnailer.delegate) XCTAssertEqual(thumbnailer.media, media) XCTAssertEqual(thumbnailer.libVLCinstance, VLCLibrary.shared().instance) } } func testInitWithMediaDelegateAndLibrary() throws { let sharedLibrary = VLCLibrary.shared() let customLibrary = VLCLibrary(options: []) let tests: [(library: VLCLibrary?, expected: VLCLibrary?)] = [ (sharedLibrary, sharedLibrary), (customLibrary, customLibrary), (nil, sharedLibrary) ] for (library, expected) in tests { let delegate = MockThumbnailerDelegate() let media = Video.test1.media let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: media, delegate: delegate, andVLCLibrary: library)) XCTAssertNil(thumbnailer.thumbnail) XCTAssertNotNil(thumbnailer.delegate) XCTAssertEqual(thumbnailer.media, media) XCTAssertEqual(thumbnailer.libVLCinstance, expected?.instance) } } func testFetchThumbnail() throws { let skipMediaParse: (XCTestExpectation) -> (VLCMedia) = { expectation in expectation.fulfill() return Video.test1.media } let completeMediaParse: (XCTestExpectation) -> (VLCMedia) = { expectation in let media = Video.test1.media media.lengthWait(until: Date.distantFuture) expectation.fulfill() return media } let tests: [(parseFunc: ((XCTestExpectation) -> (VLCMedia)), expectation: XCTestExpectation)] = [ (skipMediaParse, expectation(description: "Skipped parsing media")), (completeMediaParse, expectation(description: "Completed parsing media")) ] for (parseFunc, parseExpectation) in tests { let media = parseFunc(parseExpectation) wait(for: [parseExpectation], timeout: STANDARD_TIME_OUT) let delegate = MockThumbnailerDelegate() let fetched = expectation(description: "delegate::didFinishThumbnail called") delegate.finishedExpectation = fetched let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: media, andDelegate: delegate)) thumbnailer.fetchThumbnail() wait(for: [fetched], timeout: STANDARD_TIME_OUT) XCTAssertNotNil(thumbnailer.thumbnail) XCTAssertEqual(thumbnailer.thumbnailWidth, 417) XCTAssertEqual(thumbnailer.thumbnailHeight, 240) XCTAssertEqual(thumbnailer.snapshotPosition, 0.3) } } // MARK: Delegate callbacks func testDelegateDidFinishThumbnail() throws { let tests: [(video: Video, width: CGFloat, height: CGFloat)] = [ (Video.test1, 417, 240), (Video.test2, 427, 240), (Video.test3, 427, 240), (Video.test4, 427, 240) ] for (video, width, height) in tests { let delegate = MockThumbnailerDelegate() let fetched = expectation(description: "delegate::didFinishThumbnail called") delegate.finishedExpectation = fetched let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: video.media, andDelegate: delegate)) thumbnailer.fetchThumbnail() wait(for: [fetched], timeout: STANDARD_TIME_OUT) XCTAssertNotNil(thumbnailer.thumbnail) XCTAssertEqual(thumbnailer.thumbnailWidth, width) XCTAssertEqual(thumbnailer.thumbnailHeight, height) XCTAssertEqual(thumbnailer.snapshotPosition, 0.3) } } func testDelegateMediaThumbnailerDidTimeOut() throws { let media = Video.invalid let delegate = MockThumbnailerDelegate() let timedOut = expectation(description: "delegate::mediaThumbnailerDidTimeOut called") delegate.timedOutExpectation = timedOut let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: media.media, andDelegate: delegate)) thumbnailer.fetchThumbnail() let internalWaitDuration = 10.0 wait(for: [timedOut], timeout: internalWaitDuration + STANDARD_TIME_OUT) XCTAssertNil(thumbnailer.thumbnail) XCTAssertEqual(thumbnailer.thumbnailWidth, 0) XCTAssertEqual(thumbnailer.thumbnailHeight, 0) } func testCustomThumbnailOptions() throws { let tests: [(video: Video, height: CGFloat, width: CGFloat, position: Float)] = [ (Video.test1, 320, 184, 0.5), (Video.test2, 327, 184, 0.6), (Video.test3, 500, 281, 0.7), (Video.test4, 711, 400, 0.8) ] for (video, width, height, position) in tests { let delegate = MockThumbnailerDelegate() let fetched = expectation(description: "delegate::didFinishThumbnail called") delegate.finishedExpectation = fetched let thumbnailer = try XCTAssertNotNilAndUnwrap(VLCMediaThumbnailer(media: video.media, andDelegate: delegate)) thumbnailer.thumbnailWidth = width thumbnailer.thumbnailHeight = height thumbnailer.snapshotPosition = position thumbnailer.fetchThumbnail() wait(for: [fetched], timeout: STANDARD_TIME_OUT) XCTAssertNotNil(thumbnailer.thumbnail) XCTAssertEqual(thumbnailer.thumbnailWidth, width) XCTAssertEqual(thumbnailer.thumbnailHeight, height) XCTAssertEqual(thumbnailer.snapshotPosition, position) } } }