/* HBJobUndoTests.m
This file is part of the HandBrake source code.
Homepage: .
It may be used under the terms of the GNU General Public License. */
#import
#import "HBCore.h"
#import "HBTitle.h"
#import "HBJob.h"
#import "HBChapter.h"
#import "HBAudioTrack.h"
#import "HBSubtitlesTrack.h"
#import "HBPicture.h"
#import "HBPresetsManager.h"
#import "HBPreset.h"
@interface HBJobUndoTests : XCTestCase
@property (nonatomic, readonly) HBPresetsManager *manager;
@property (nonatomic, readwrite) HBPreset *preset;
@property (nonatomic, readwrite) dispatch_queue_t queue;
@property (nonatomic, readwrite) HBCore *core;
@property (nonatomic, readwrite) HBTitle *title;
@property (nonatomic, readwrite) HBJob *job;
@property (nonatomic, readwrite) HBJob *modifiedJob;
@end
@implementation HBJobUndoTests
- (void)setUp
{
[super setUp];
_manager = [[HBPresetsManager alloc] init];
[_manager generateBuiltInPresets];
self.preset = self.manager.defaultPreset;
NSURL *sampleURL = [NSURL fileURLWithPath:@"/test.mp4" isDirectory:NO];
self.queue = dispatch_queue_create("fr.handbrake.testQueue", DISPATCH_QUEUE_SERIAL);
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
self.core = [[HBCore alloc] initWithLogLevel:1 queue:self.queue];
[self.core scanURL:sampleURL titleIndex:0 previews:1 minDuration:0 keepPreviews:NO progressHandler:^(HBState state, HBProgress progress, NSString * _Nonnull info) {
} completionHandler:^(HBCoreResult result) {
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
self.title = self.core.titles.firstObject;
self.job = [[HBJob alloc] initWithTitle:self.title andPreset:self.preset];
self.job.outputURL = [NSURL fileURLWithPath:@"/" isDirectory:YES];
self.job.outputFileName = @"Dest.mp4";
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
undoManager.groupsByEvent = NO;
self.modifiedJob = [self.job copy];
self.modifiedJob.title = self.job.title;
self.modifiedJob.undo = undoManager;
[self.manager.root enumerateObjectsUsingBlock:^(HBPreset * _Nonnull obj, NSIndexPath * _Nonnull idx, BOOL * _Nonnull stop)
{
if (obj.isLeaf)
{
[undoManager beginUndoGrouping];
[self.modifiedJob applyPreset:obj];
[undoManager endUndoGrouping];
}
}];
// Container changed
[undoManager beginUndoGrouping];
self.modifiedJob.container = 0x200000;
[undoManager endUndoGrouping];
// Chapters changed
[undoManager beginUndoGrouping];
self.modifiedJob.chapterTitles[0].title = @"Test chapter";
self.modifiedJob.range.type = HBRangeTypeFrames;
[undoManager endUndoGrouping];
// Undo, redo and undo again the whole thing one time
while (undoManager.canUndo)
{
[undoManager undo];
}
while (undoManager.canRedo)
{
[undoManager redo];
}
while (undoManager.canUndo)
{
[undoManager undo];
}
}
- (void)tearDown {
[super tearDown];
}
- (void)testJob
{
XCTAssertEqualObjects(self.job.presetName, self.modifiedJob.presetName);
XCTAssertEqual(self.job.container, self.modifiedJob.container);
XCTAssertEqual(self.job.mp4HttpOptimize, self.modifiedJob.mp4HttpOptimize);
XCTAssertEqual(self.job.mp4iPodCompatible, self.modifiedJob.mp4iPodCompatible);
XCTAssertEqual(self.job.angle, self.modifiedJob.angle);
}
- (void)testAudio
{
XCTAssertEqual([self.job.audio countOfTracks], [self.modifiedJob.audio countOfTracks]);
for (NSUInteger idx = 0; idx < [self.job.audio countOfTracks]; idx++)
{
HBAudioTrack *t1 = self.job.audio.tracks[idx];
HBAudioTrack *t2 = self.modifiedJob.audio.tracks[idx];
XCTAssertEqual(t1.sourceTrackIdx, t2.sourceTrackIdx);
}
}
- (void)testRange
{
XCTAssertEqual(self.job.range.type, self.modifiedJob.range.type);
}
- (void)testPicture
{
XCTAssertEqual(self.job.picture.width, self.modifiedJob.picture.width);
XCTAssertEqual(self.job.picture.height, self.modifiedJob.picture.height);
XCTAssertEqual(self.job.picture.displayWidth, self.modifiedJob.picture.displayWidth);
XCTAssertEqual(self.job.picture.parWidth, self.modifiedJob.picture.parWidth);
XCTAssertEqual(self.job.picture.parHeight, self.modifiedJob.picture.parHeight);
XCTAssertEqual(self.job.picture.autocrop, self.modifiedJob.picture.autocrop);
XCTAssertEqual(self.job.picture.cropTop, self.modifiedJob.picture.cropTop);
XCTAssertEqual(self.job.picture.cropBottom, self.modifiedJob.picture.cropBottom);
XCTAssertEqual(self.job.picture.cropLeft, self.modifiedJob.picture.cropLeft);
XCTAssertEqual(self.job.picture.cropRight, self.modifiedJob.picture.cropRight);
}
- (void)testFilters
{
XCTAssertEqualObjects(self.job.filters.deinterlace, self.modifiedJob.filters.deinterlace);
XCTAssertEqualObjects(self.job.filters.deinterlacePreset, self.modifiedJob.filters.deinterlacePreset);
XCTAssertEqualObjects(self.job.filters.deinterlaceCustomString, self.modifiedJob.filters.deinterlaceCustomString);
XCTAssertEqualObjects(self.job.filters.detelecine, self.modifiedJob.filters.detelecine);
XCTAssertEqualObjects(self.job.filters.detelecineCustomString, self.modifiedJob.filters.detelecineCustomString);
XCTAssertEqualObjects(self.job.filters.denoise, self.modifiedJob.filters.denoise);
XCTAssertEqualObjects(self.job.filters.denoisePreset, self.modifiedJob.filters.denoisePreset);
XCTAssertEqualObjects(self.job.filters.denoiseTune, self.modifiedJob.filters.denoiseTune);
XCTAssertEqualObjects(self.job.filters.denoiseCustomString, self.modifiedJob.filters.denoiseCustomString);
XCTAssertEqualObjects(self.job.filters.sharpen, self.modifiedJob.filters.sharpen);
XCTAssertEqualObjects(self.job.filters.sharpenPreset, self.modifiedJob.filters.sharpenPreset);
XCTAssertEqualObjects(self.job.filters.sharpenTune, self.modifiedJob.filters.sharpenTune);
XCTAssertEqualObjects(self.job.filters.sharpenCustomString, self.modifiedJob.filters.sharpenCustomString);
XCTAssertEqual(self.job.filters.deblock, self.modifiedJob.filters.deblock);
XCTAssertEqual(self.job.filters.grayscale, self.modifiedJob.filters.grayscale);
}
- (void)testSubtitles
{
XCTAssertEqual([self.job.subtitles countOfTracks], [self.modifiedJob.subtitles countOfTracks]);
for (NSUInteger idx = 0; idx < [self.job.subtitles countOfTracks]; idx++)
{
HBSubtitlesTrack *t1 = self.job.subtitles.tracks[idx];
HBSubtitlesTrack *t2 = self.modifiedJob.subtitles.tracks[idx];
XCTAssertEqual(t1.sourceTrackIdx, t2.sourceTrackIdx);
XCTAssertEqual(t1.type, t2.type);
XCTAssertEqual(t1.burnedIn, t2.burnedIn);
XCTAssertEqual(t1.forcedOnly, t2.forcedOnly);
XCTAssertEqual(t1.def, t2.def);
}
}
- (void)testChapters
{
XCTAssertEqual(self.job.chaptersEnabled, self.modifiedJob.chaptersEnabled);
for (NSUInteger idx = 0; idx < [self.job.subtitles countOfTracks]; idx++)
{
XCTAssertEqualObjects(self.job.chapterTitles[idx].title, self.modifiedJob.chapterTitles[idx].title);
}
}
@end