Authored by Bogdan Poplauschi

Refactored the `SDWebImageDecoderTests` a bit. Per DRY, created `verifyCoder:wit…

…hLocalImageURL:isAnimatedImage:` method that will take a imageURL and a coder and will check decoding and encoding back and forth, sizes and so. Reusing this method for the static WebP image, for the animated WebP image and for the GIF.
@@ -47,7 +47,7 @@ NSString *kImageTestKey = @"TestImageKey.jpg"; @@ -47,7 +47,7 @@ NSString *kImageTestKey = @"TestImageKey.jpg";
47 [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) { 47 [self.sharedImageCache diskImageExistsWithKey:kImageTestKey completion:^(BOOL isInCache) {
48 if (!isInCache) { 48 if (!isInCache) {
49 [self.sharedImageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) { 49 [self.sharedImageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
50 - expect(fileCount).to.beLessThan(100); 50 + expect(fileCount).to.equal(0);
51 [expectation fulfill]; 51 [expectation fulfill];
52 }]; 52 }];
53 } else { 53 } else {
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 #import <SDWebImage/SDWebImageWebPCoder.h> 12 #import <SDWebImage/SDWebImageWebPCoder.h>
13 #import <SDWebImage/UIImage+ForceDecode.h> 13 #import <SDWebImage/UIImage+ForceDecode.h>
14 #import <SDWebImage/SDWebImageGIFCoder.h> 14 #import <SDWebImage/SDWebImageGIFCoder.h>
  15 +#import <SDWebImage/NSData+ImageContentType.h>
15 16
16 @interface SDWebImageDecoderTests : SDTestCase 17 @interface SDWebImageDecoderTests : SDTestCase
17 18
@@ -97,65 +98,63 @@ @@ -97,65 +98,63 @@
97 98
98 - (void)test09ThatStaticWebPCoderWorks { 99 - (void)test09ThatStaticWebPCoderWorks {
99 NSURL *staticWebPURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImageStatic" withExtension:@"webp"]; 100 NSURL *staticWebPURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImageStatic" withExtension:@"webp"];
100 - NSData *staticWebPData = [NSData dataWithContentsOfURL:staticWebPURL];  
101 - expect([[SDWebImageWebPCoder sharedCoder] canDecodeFromData:staticWebPData]).to.beTruthy();  
102 - expect([[SDWebImageImageIOCoder sharedCoder] canDecodeFromData:staticWebPData]).to.beFalsy();  
103 - UIImage *staticWebPImage = [[SDWebImageWebPCoder sharedCoder] decodedImageWithData:staticWebPData];  
104 - expect(staticWebPImage).toNot.beNil();  
105 -  
106 - expect([[SDWebImageWebPCoder sharedCoder] canEncodeToFormat:SDImageFormatWebP]).to.beTruthy();  
107 - expect([[SDWebImageImageIOCoder sharedCoder] canEncodeToFormat:SDImageFormatWebP]).to.beFalsy();  
108 - NSData *outputData = [[SDWebImageWebPCoder sharedCoder] encodedDataWithImage:staticWebPImage format:SDImageFormatWebP];  
109 - expect(outputData).toNot.beNil(); 101 + [self verifyCoder:[SDWebImageWebPCoder sharedCoder]
  102 + withLocalImageURL:staticWebPURL
  103 + isAnimatedImage:NO];
110 } 104 }
111 105
112 - (void)test10ThatAnimatedWebPCoderWorks { 106 - (void)test10ThatAnimatedWebPCoderWorks {
113 NSURL *animatedWebPURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImageAnimated" withExtension:@"webp"]; 107 NSURL *animatedWebPURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImageAnimated" withExtension:@"webp"];
114 - NSData *animatedWebPData = [NSData dataWithContentsOfURL:animatedWebPURL];  
115 - expect([[SDWebImageWebPCoder sharedCoder] canDecodeFromData:animatedWebPData]).to.beTruthy();  
116 - UIImage *animatedWebPImage = [[SDWebImageWebPCoder sharedCoder] decodedImageWithData:animatedWebPData];  
117 - expect(animatedWebPImage).toNot.beNil();  
118 - expect(animatedWebPImage.images.count).to.beGreaterThan(0);  
119 - CGSize imageSize = animatedWebPImage.size;  
120 - CGFloat imageScale = animatedWebPImage.scale;  
121 - [animatedWebPImage.images enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {  
122 - CGSize size = image.size;  
123 - CGFloat scale = image.scale;  
124 - expect(imageSize.width).to.equal(size.width);  
125 - expect(imageSize.height).to.equal(size.height);  
126 - expect(imageScale).to.equal(scale);  
127 - }];  
128 -  
129 - expect([[SDWebImageWebPCoder sharedCoder] canEncodeToFormat:SDImageFormatWebP]).to.beTruthy();  
130 - NSData *outputData = [[SDWebImageWebPCoder sharedCoder] encodedDataWithImage:animatedWebPImage format:SDImageFormatWebP];  
131 - expect(outputData).toNot.beNil(); 108 + [self verifyCoder:[SDWebImageWebPCoder sharedCoder]
  109 + withLocalImageURL:animatedWebPURL
  110 + isAnimatedImage:YES];
132 } 111 }
133 112
134 - (void)test20ThatOurGIFCoderWorksNotFLAnimatedImage { 113 - (void)test20ThatOurGIFCoderWorksNotFLAnimatedImage {
135 NSURL *gifURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImage" withExtension:@"gif"]; 114 NSURL *gifURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TestImage" withExtension:@"gif"];
136 - NSData *gifData = [NSData dataWithContentsOfURL:gifURL];  
137 - expect([[SDWebImageGIFCoder sharedCoder] canDecodeFromData:gifData]).to.beTruthy();  
138 - // the IOCoder can also decode GIF  
139 - expect([[SDWebImageImageIOCoder sharedCoder] canDecodeFromData:gifData]).to.beTruthy();  
140 - UIImage *gifImage = [[SDWebImageGIFCoder sharedCoder] decodedImageWithData:gifData];  
141 - expect(gifImage).toNot.beNil();  
142 - expect(gifImage.images.count).to.beGreaterThan(0);  
143 - CGSize imageSize = gifImage.size;  
144 - CGFloat imageScale = gifImage.scale;  
145 - [gifImage.images enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) {  
146 - CGSize size = image.size;  
147 - CGFloat scale = image.scale;  
148 - expect(imageSize.width).to.equal(size.width);  
149 - expect(imageSize.height).to.equal(size.height);  
150 - expect(imageScale).to.equal(scale);  
151 - }]; 115 + [self verifyCoder:[SDWebImageGIFCoder sharedCoder]
  116 + withLocalImageURL:gifURL
  117 + isAnimatedImage:YES];
  118 +}
  119 +
  120 +- (void)verifyCoder:(id<SDWebImageCoder>)coder
  121 + withLocalImageURL:(NSURL *)imageUrl
  122 + isAnimatedImage:(BOOL)isAnimated {
  123 + NSData *inputImageData = [NSData dataWithContentsOfURL:imageUrl];
  124 + expect(inputImageData).toNot.beNil();
  125 + SDImageFormat inputImageFormat = [NSData sd_imageFormatForImageData:inputImageData];
  126 + expect(inputImageFormat).toNot.equal(SDImageFormatUndefined);
  127 +
  128 + // 1 - check if we can decode - should be true
  129 + expect([coder canDecodeFromData:inputImageData]).to.beTruthy();
  130 +
  131 + // 2 - decode from NSData to UIImage and check it
  132 + UIImage *inputImage = [coder decodedImageWithData:inputImageData];
  133 + expect(inputImage).toNot.beNil();
  134 +
  135 + if (isAnimated) {
  136 + // 2a - check images count > 0 (only for animated images)
  137 + expect(inputImage.images.count).to.beGreaterThan(0);
  138 +
  139 + // 2b - check image size and scale for each frameImage (only for animated images)
  140 + CGSize imageSize = inputImage.size;
  141 + CGFloat imageScale = inputImage.scale;
  142 + [inputImage.images enumerateObjectsUsingBlock:^(UIImage * frameImage, NSUInteger idx, BOOL * stop) {
  143 + expect(imageSize).to.equal(frameImage.size);
  144 + expect(imageScale).to.equal(frameImage.scale);
  145 + }];
  146 + }
152 147
153 - expect([[SDWebImageGIFCoder sharedCoder] decompressedImageWithImage:gifImage data:nil options:nil]).to.equal(gifImage); 148 + // 3 - check if we can encode to the original format
  149 + expect([coder canEncodeToFormat:inputImageFormat]).to.beTruthy();
154 150
155 - expect([[SDWebImageGIFCoder sharedCoder] canEncodeToFormat:SDImageFormatGIF]).to.beTruthy();  
156 - expect([[SDWebImageImageIOCoder sharedCoder] canEncodeToFormat:SDImageFormatGIF]).to.beTruthy();  
157 - NSData *outputData = [[SDWebImageGIFCoder sharedCoder] encodedDataWithImage:gifImage format:SDImageFormatGIF];  
158 - expect(outputData).toNot.beNil(); 151 + // 4 - encode from UIImage to NSData using the inputImageFormat and check it
  152 + NSData *outputImageData = [coder encodedDataWithImage:inputImage format:inputImageFormat];
  153 + expect(outputImageData).toNot.beNil();
  154 + UIImage *outputImage = [coder decodedImageWithData:outputImageData];
  155 + expect(outputImage.size).to.equal(inputImage.size);
  156 + expect(outputImage.scale).to.equal(inputImage.scale);
  157 + expect(outputImage.images.count).to.equal(inputImage.images.count);
159 } 158 }
160 159
161 @end 160 @end