|
@@ -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 |