Skip to content

Commit 0cc934e

Browse files
committed
refactor-tests: Move blocks and variables into G8RecognitionTestsHelper
1 parent d709799 commit 0cc934e

File tree

3 files changed

+177
-157
lines changed

3 files changed

+177
-157
lines changed

TestsProject/TestsProjectTests/G8RecognitionTestsHelper.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,22 @@ typedef NS_ENUM(NSUInteger, G8CustomPreprocessing) {
1717

1818
@interface G8RecognitionTestsHelper : NSObject <G8TesseractDelegate>
1919

20+
@property (nonatomic, strong, readonly) G8Tesseract *tesseract;
21+
22+
@property (nonatomic, assign) G8OCREngineMode engineMode;
23+
@property (nonatomic, assign) G8PageSegmentationMode pageSegmentationMode;
24+
@property (nonatomic, copy) NSString *charWhitelist;
25+
@property (nonatomic, assign) NSTimeInterval waitDeadline;
26+
@property (nonatomic, assign) NSTimeInterval maxExpectedRecognitionTime;
27+
@property (nonatomic, assign) CGRect rect;
28+
@property (nonatomic, assign) NSInteger sourceResolution;
29+
@property (nonatomic, strong) UIImage *image;
30+
2031
@property (nonatomic, assign) CGSize boundingSizeForResizing;
2132
@property (nonatomic, assign) G8CustomPreprocessing customPreprocessingType;
2233

34+
- (void)recognizeImage;
35+
- (void)recognizeImageUsingOperation;
36+
- (UIImage *)thresholdedImageForImage:(UIImage *)sourceImage;
37+
2338
@end

TestsProject/TestsProjectTests/G8RecognitionTestsHelper.m

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,121 @@
88

99
#import "G8RecognitionTestsHelper.h"
1010

11+
static NSString *const kG8Languages = @"eng";
12+
13+
@interface G8RecognitionTestsHelper ()
14+
15+
@property (nonatomic, strong, readwrite) G8Tesseract *tesseract;
16+
17+
@end
18+
1119
@implementation G8RecognitionTestsHelper
1220

1321
- (id)init
1422
{
1523
self = [super init];
1624
if (self != nil) {
25+
_engineMode = G8OCREngineModeTesseractOnly;
26+
_pageSegmentationMode = G8PageSegmentationModeAuto;
27+
_charWhitelist = @"";
28+
_waitDeadline = 180.0;
29+
_maxExpectedRecognitionTime = 185.0;
30+
_rect = CGRectZero;
31+
_sourceResolution = 0;
32+
1733
_customPreprocessingType = G8CustomPreprocessingNone;
1834
_boundingSizeForResizing = CGSizeMake(700.0f, 700.0f);
1935
}
2036
return self;
2137
}
2238

39+
- (void)waitTimeLmit:(NSTimeInterval)maximumWait whileTrue:(BOOL (^)())shouldKeepRunning
40+
{
41+
NSDate *deadlineDate = [NSDate dateWithTimeInterval:maximumWait sinceDate:[NSDate date]];
42+
BOOL isDeadline = NO;
43+
while (shouldKeepRunning != nil && shouldKeepRunning() && isDeadline == NO) {
44+
if ([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:deadlineDate] == NO) {
45+
break;
46+
}
47+
isDeadline = [[NSDate date] compare:deadlineDate] == NSOrderedDescending;
48+
}
49+
};
50+
51+
- (void)setupTesseract
52+
{
53+
self.tesseract.delegate = self;
54+
55+
self.tesseract.language = kG8Languages;
56+
self.tesseract.engineMode = self.engineMode;
57+
self.tesseract.pageSegmentationMode = self.pageSegmentationMode;
58+
59+
self.tesseract.charWhitelist = self.charWhitelist;
60+
self.tesseract.maximumRecognitionTime = self.waitDeadline;
61+
};
62+
63+
- (void)setupImage
64+
{
65+
self.tesseract.image = [self.image g8_blackAndWhite];
66+
67+
if (CGRectEqualToRect(self.rect, CGRectZero) == NO) {
68+
self.tesseract.rect = self.rect;
69+
}
70+
71+
if (self.sourceResolution > 0) {
72+
self.tesseract.sourceResolution = self.sourceResolution;
73+
}
74+
}
75+
76+
- (void)recognizeImage
77+
{
78+
self.tesseract = [[G8Tesseract alloc] init];
79+
[self setupTesseract];
80+
[self setupImage];
81+
82+
[self.tesseract recognize];
83+
};
84+
85+
- (void)recognizeImageUsingOperation
86+
{
87+
G8RecognitionOperation *operation = [[G8RecognitionOperation alloc] init];
88+
self.tesseract = operation.tesseract;
89+
[self setupTesseract];
90+
91+
[self setupImage];
92+
93+
__weak __typeof(self) weakSelf = self;
94+
95+
self.tesseract = nil;
96+
operation.recognitionCompleteBlock = ^(G8Tesseract *recognizedTesseract) {
97+
__strong __typeof(weakSelf) strongSelf = weakSelf;
98+
99+
strongSelf.tesseract = recognizedTesseract;
100+
};
101+
102+
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
103+
[queue addOperation:operation];
104+
105+
[self waitTimeLmit:self.maxExpectedRecognitionTime whileTrue:^BOOL{
106+
__strong __typeof(weakSelf) strongSelf = weakSelf;
107+
108+
return (BOOL)(strongSelf.tesseract == nil);
109+
}];
110+
111+
if (self.tesseract == nil) {
112+
[NSException raise:@"Tesseract stopped" format:@"Tesseract worked too long"];
113+
}
114+
};
115+
116+
- (UIImage *)thresholdedImageForImage:(UIImage *)sourceImage
117+
{
118+
self.tesseract = [[G8Tesseract alloc] init];
119+
[self setupTesseract];
120+
121+
self.tesseract.image = [sourceImage g8_blackAndWhite];
122+
123+
return self.tesseract.thresholdedImage;
124+
};
125+
23126
- (UIImage *)preprocessedImageForTesseract:(G8Tesseract *)tesseract sourceImage:(UIImage *)sourceImage
24127
{
25128
switch (self.customPreprocessingType) {

0 commit comments

Comments
 (0)