From 7349f69cc67a0228c03b754b49bf5943b9cec23f Mon Sep 17 00:00:00 2001 From: Cyril Makankov Date: Wed, 22 Apr 2015 12:34:19 +0300 Subject: [PATCH 1/2] G8RecognitionOperation 100% tests covering --- TesseractOCR/G8RecognitionOperation.m | 6 +-- .../G8RecognitionTestsHelper.m | 39 +++++++++++++++---- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/TesseractOCR/G8RecognitionOperation.m b/TesseractOCR/G8RecognitionOperation.m index f7561633..31f45a8f 100644 --- a/TesseractOCR/G8RecognitionOperation.m +++ b/TesseractOCR/G8RecognitionOperation.m @@ -11,9 +11,9 @@ #import "TesseractOCR.h" -@interface G8RecognitionOperation() - -@property (nonatomic, strong, readwrite) G8Tesseract *tesseract; +@interface G8RecognitionOperation() { + G8Tesseract *_tesseract; +} @property (nonatomic, assign, readwrite) CGFloat progress; @end diff --git a/TestsProject/TestsProjectTests/G8RecognitionTestsHelper.m b/TestsProject/TestsProjectTests/G8RecognitionTestsHelper.m index cd18c291..ea918e38 100644 --- a/TestsProject/TestsProjectTests/G8RecognitionTestsHelper.m +++ b/TestsProject/TestsProjectTests/G8RecognitionTestsHelper.m @@ -54,8 +54,6 @@ - (void)setupTesseract self.tesseract = [[G8Tesseract alloc] initWithLanguage:kG8Languages]; } - self.tesseract.delegate = self; - self.tesseract.language = kG8Languages; self.tesseract.engineMode = self.engineMode; self.tesseract.pageSegmentationMode = self.pageSegmentationMode; @@ -81,6 +79,8 @@ - (void)recognizeImage { self.tesseract = [[G8Tesseract alloc] initWithLanguage:kG8Languages]; [self setupTesseract]; + self.tesseract.delegate = self; + [self setupImage]; [self.tesseract recognize]; @@ -89,18 +89,25 @@ - (void)recognizeImage - (void)recognizeImageUsingOperation { G8RecognitionOperation *operation = [[G8RecognitionOperation alloc] initWithLanguage:kG8Languages]; + operation.delegate = self; self.tesseract = operation.tesseract; [self setupTesseract]; - + [self setupImage]; - - __weak __typeof(self) weakSelf = self; + + __block BOOL recognitionCompleteBlockInvoked = NO; + __block BOOL progressCallbackBlockInvoked = NO; + // Set up callbacks to test that it's being called + operation.progressCallbackBlock = ^(G8Tesseract *tesseract){ + progressCallbackBlockInvoked = YES; + }; self.tesseract = nil; + __weak __typeof(self) weakSelf = self; operation.recognitionCompleteBlock = ^(G8Tesseract *recognizedTesseract) { __strong __typeof(weakSelf) strongSelf = weakSelf; - strongSelf.tesseract = recognizedTesseract; + recognitionCompleteBlockInvoked = YES; }; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; @@ -111,22 +118,38 @@ - (void)recognizeImageUsingOperation return (BOOL)(strongSelf.tesseract == nil); }]; - + if (self.tesseract == nil) { [NSException raise:@"Tesseract stopped" format:@"Tesseract worked too long"]; } + + NSAssert(recognitionCompleteBlockInvoked == YES, @"Error! recognitionCompleteBlock has not been invoked"); + NSAssert(progressCallbackBlockInvoked == YES, @"Error! progressCallbackBlock has not been invoked"); }; - (UIImage *)thresholdedImageForImage:(UIImage *)sourceImage { self.tesseract = [[G8Tesseract alloc] initWithLanguage:kG8Languages]; [self setupTesseract]; - + self.tesseract.delegate = self; + self.tesseract.image = [sourceImage g8_blackAndWhite]; return self.tesseract.thresholdedImage; }; +#pragma mark - G8TesseractDelegate methods + +- (void)progressImageRecognitionForTesseract:(G8Tesseract *)tesseract +{ + +} + +- (BOOL)shouldCancelImageRecognitionForTesseract:(G8Tesseract *)tesseract +{ + return NO; +} + - (UIImage *)preprocessedImageForTesseract:(G8Tesseract *)tesseract sourceImage:(UIImage *)sourceImage { switch (self.customPreprocessingType) { From ccbc68ef9aac27f7df59980ebf7e3a65c4dfa5b0 Mon Sep 17 00:00:00 2001 From: Cyril Makankov Date: Wed, 22 Apr 2015 12:54:47 +0300 Subject: [PATCH 2/2] g8_grayScale test --- .../TestsProject.xcodeproj/project.pbxproj | 4 ++++ TestsProject/TestsProject/grayscaledImage.png | Bin 0 -> 26677 bytes .../TestsProjectTests/InitializationTests.m | 12 ++++++++++++ 3 files changed, 16 insertions(+) create mode 100644 TestsProject/TestsProject/grayscaledImage.png diff --git a/TestsProject/TestsProject.xcodeproj/project.pbxproj b/TestsProject/TestsProject.xcodeproj/project.pbxproj index 103d9700..22dc904e 100644 --- a/TestsProject/TestsProject.xcodeproj/project.pbxproj +++ b/TestsProject/TestsProject.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 73BE4C351A5BD324002C15F1 /* image_sample.hOCR in Resources */ = {isa = PBXBuildFile; fileRef = 73BE4C341A5BD324002C15F1 /* image_sample.hOCR */; }; 73BE4C441A5DADDD002C15F1 /* TesseractOCR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73BE4C431A5DADDD002C15F1 /* TesseractOCR.framework */; }; 8FA2F9CE23919BEC8C64A5EA /* libPods-TestsProjectTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CD3C116A45C293ADAC81D1B /* libPods-TestsProjectTests.a */; }; + F18F53451AE7A6C9005F3843 /* grayscaledImage.png in Resources */ = {isa = PBXBuildFile; fileRef = F18F53441AE7A6C9005F3843 /* grayscaledImage.png */; }; F1DF11991AE5772400FA6F5D /* rotated_image_sample.jpg in Resources */ = {isa = PBXBuildFile; fileRef = F1DF11981AE5772400FA6F5D /* rotated_image_sample.jpg */; }; /* End PBXBuildFile section */ @@ -88,6 +89,7 @@ 73BE4C431A5DADDD002C15F1 /* TesseractOCR.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TesseractOCR.framework; path = "../build/Debug-iphoneos/TesseractOCR.framework"; sourceTree = ""; }; 73C0A7BC1A59561F00D823D4 /* TesseractOCR.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TesseractOCR.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8CA185A06F5E788CE0DC28EB /* Pods-TestsProjectTests.coverage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TestsProjectTests.coverage.xcconfig"; path = "../Pods/Target Support Files/Pods-TestsProjectTests/Pods-TestsProjectTests.coverage.xcconfig"; sourceTree = ""; }; + F18F53441AE7A6C9005F3843 /* grayscaledImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = grayscaledImage.png; sourceTree = ""; }; F1DF11981AE5772400FA6F5D /* rotated_image_sample.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rotated_image_sample.jpg; sourceTree = ""; }; /* End PBXFileReference section */ @@ -213,6 +215,7 @@ 73BE4C341A5BD324002C15F1 /* image_sample.hOCR */, 4141211D1A4B1E3900583ED4 /* image_blank.png */, F1DF11981AE5772400FA6F5D /* rotated_image_sample.jpg */, + F18F53441AE7A6C9005F3843 /* grayscaledImage.png */, ); name = Images; sourceTree = ""; @@ -317,6 +320,7 @@ 4115B96C1A3EF8E90004EC0A /* Images.xcassets in Resources */, 4115B9851A3EF9920004EC0A /* Launch Screen.xib in Resources */, 4141211E1A4B1E3900583ED4 /* image_blank.png in Resources */, + F18F53451AE7A6C9005F3843 /* grayscaledImage.png in Resources */, 41C68DB51A41854600848AE1 /* image_sample_tr.png in Resources */, 41184B591A3EFD41007F5923 /* tessdata in Resources */, 736EFF271A5882730031B432 /* tessdata-rus in Resources */, diff --git a/TestsProject/TestsProject/grayscaledImage.png b/TestsProject/TestsProject/grayscaledImage.png new file mode 100644 index 0000000000000000000000000000000000000000..e558a6ec562cf5eeb1c91edc59b35eb31c7ced36 GIT binary patch literal 26677 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 literal 0 HcmV?d00001 diff --git a/TestsProject/TestsProjectTests/InitializationTests.m b/TestsProject/TestsProjectTests/InitializationTests.m index e31039b0..b580b915 100644 --- a/TestsProject/TestsProjectTests/InitializationTests.m +++ b/TestsProject/TestsProjectTests/InitializationTests.m @@ -12,6 +12,7 @@ #import #import "Defaults.h" #import "G8RecognitionTestsHelper.h" +#import "UIImage+G8Equal.h" @interface G8Tesseract (Tests) + (void)didReceiveMemoryWarningNotification:(NSNotification*)notification; @@ -102,6 +103,17 @@ - (void*)pixForImage:(UIImage *)image; tesseract.image = [UIImage imageNamed:@"image_sample.jpg"]; }); + it(@"Should grayscale", ^{ + UIImage *image = [UIImage imageNamed:@"image_sample_bl.png"]; + UIImage *grayscaledImage = [image g8_grayScale]; + + UIImage *patternImage = [UIImage imageNamed:@"grayscaledImage.png"]; + NSAssert(patternImage, @"Error! Pattern image doesn't exist"); + + BOOL equal = [grayscaledImage g8_isEqualToImage:patternImage]; + [[theValue(equal) should] beYes]; + }); + it(@"Should test pixForImage with zero image size", ^{ G8Tesseract *tesseract = [[G8Tesseract alloc] initWithLanguage:kG8Languages];