PageRenderTime 51ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/third_party/gif_decoder/src/androidTest/java/com/bumptech/glide/gifdecoder/GifHeaderParserTest.java

https://gitlab.com/Liang1Zhang/glide
Java | 228 lines | 185 code | 35 blank | 8 comment | 1 complexity | 7aa5f4b54c25190b352b9aff93665d30 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.bumptech.glide.gifdecoder;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNotNull;
  5. import static org.junit.Assert.assertNull;
  6. import com.bumptech.glide.gifdecoder.test.GifBytesTestUtil;
  7. import com.bumptech.glide.testutil.TestUtil;
  8. import org.junit.Before;
  9. import org.junit.Test;
  10. import org.junit.runner.RunWith;
  11. import org.junit.runners.JUnit4;
  12. import java.io.IOException;
  13. import java.nio.ByteBuffer;
  14. import java.nio.ByteOrder;
  15. /**
  16. * Tests for {@link com.bumptech.glide.gifdecoder.GifHeaderParser}.
  17. */
  18. @RunWith(JUnit4.class)
  19. public class GifHeaderParserTest {
  20. private GifHeaderParser parser;
  21. @Before
  22. public void setUp() {
  23. parser = new GifHeaderParser();
  24. }
  25. @Test
  26. public void testReturnsHeaderWithFormatErrorIfDoesNotStartWithGifHeader() {
  27. parser.setData("wrong_header".getBytes());
  28. GifHeader result = parser.parseHeader();
  29. assertEquals(GifDecoder.STATUS_FORMAT_ERROR, result.status);
  30. }
  31. @Test
  32. public void testCanReadValidHeaderAndLSD() {
  33. final int width = 10;
  34. final int height = 20;
  35. ByteBuffer buffer = ByteBuffer.allocate(GifBytesTestUtil.HEADER_LENGTH).order(ByteOrder.LITTLE_ENDIAN);
  36. GifBytesTestUtil.writeHeaderAndLsd(buffer, width, height, false, 0);
  37. parser.setData(buffer.array());
  38. GifHeader header = parser.parseHeader();
  39. assertEquals(width, header.width);
  40. assertEquals(height, header.height);
  41. assertFalse(header.gctFlag);
  42. // 2^(1+0) == 2^1 == 2.
  43. assertEquals(2, header.gctSize);
  44. assertEquals(0, header.bgIndex);
  45. assertEquals(0, header.pixelAspect);
  46. }
  47. @Test
  48. public void testCanParseHeaderOfTestImageWithoutGraphicalExtension() throws IOException {
  49. byte[] data = TestUtil.resourceToBytes(getClass(), "gif_without_graphical_control_extension.gif");
  50. parser.setData(data);
  51. GifHeader header = parser.parseHeader();
  52. assertEquals(1, header.frameCount);
  53. assertNotNull(header.frames.get(0));
  54. assertEquals(GifDecoder.STATUS_OK, header.status);
  55. }
  56. @Test
  57. public void testCanReadImageDescriptorWithoutGraphicalExtension() {
  58. final int lzwMinCodeSize = 2;
  59. ByteBuffer buffer = ByteBuffer.allocate(
  60. GifBytesTestUtil.HEADER_LENGTH
  61. + GifBytesTestUtil.IMAGE_DESCRIPTOR_LENGTH
  62. + GifBytesTestUtil.getImageDataSize(lzwMinCodeSize)
  63. ).order(ByteOrder.LITTLE_ENDIAN);
  64. GifBytesTestUtil.writeHeaderAndLsd(buffer, 1, 1, false, 0);
  65. GifBytesTestUtil.writeImageDescriptor(buffer, 0, 0, 1, 1, false /*hasLct*/, 0);
  66. GifBytesTestUtil.writeFakeImageData(buffer, lzwMinCodeSize);
  67. parser.setData(buffer.array());
  68. GifHeader header = parser.parseHeader();
  69. assertEquals(1, header.width);
  70. assertEquals(1, header.height);
  71. assertEquals(1, header.frameCount);
  72. assertNotNull(header.frames.get(0));
  73. }
  74. private static ByteBuffer writeHeaderWithGceAndFrameDelay(short frameDelay) {
  75. final int lzwMinCodeSize = 2;
  76. ByteBuffer buffer = ByteBuffer.allocate(
  77. GifBytesTestUtil.HEADER_LENGTH
  78. + GifBytesTestUtil.GRAPHICS_CONTROL_EXTENSION_LENGTH
  79. + GifBytesTestUtil.IMAGE_DESCRIPTOR_LENGTH
  80. + GifBytesTestUtil.getImageDataSize(lzwMinCodeSize)
  81. ).order(ByteOrder.LITTLE_ENDIAN);
  82. GifBytesTestUtil.writeHeaderAndLsd(buffer, 1, 1, false, 0);
  83. GifBytesTestUtil.writeGraphicsControlExtension(buffer, frameDelay);
  84. GifBytesTestUtil.writeImageDescriptor(buffer, 0, 0, 1, 1, false /*hasLct*/, 0);
  85. GifBytesTestUtil.writeFakeImageData(buffer, lzwMinCodeSize);
  86. return buffer;
  87. }
  88. @Test
  89. public void testCanParseFrameDelay() {
  90. final short frameDelay = 50;
  91. ByteBuffer buffer = writeHeaderWithGceAndFrameDelay(frameDelay);
  92. parser.setData(buffer.array());
  93. GifHeader header = parser.parseHeader();
  94. GifFrame frame = header.frames.get(0);
  95. // Convert delay in 100ths of a second to ms.
  96. assertEquals(frameDelay * 10, frame.delay);
  97. }
  98. @Test
  99. public void testSetsDefaultFrameDelayIfFrameDelayIsZero() {
  100. ByteBuffer buffer = writeHeaderWithGceAndFrameDelay((short) 0);
  101. parser.setData(buffer.array());
  102. GifHeader header = parser.parseHeader();
  103. GifFrame frame = header.frames.get(0);
  104. // Convert delay in 100ths of a second to ms.
  105. assertEquals(GifHeaderParser.DEFAULT_FRAME_DELAY * 10, frame.delay);
  106. }
  107. @Test
  108. public void testSetsDefaultFrameDelayIfFrameDelayIsLessThanMinimum() {
  109. final short frameDelay = GifHeaderParser.MIN_FRAME_DELAY - 1;
  110. ByteBuffer buffer = writeHeaderWithGceAndFrameDelay(frameDelay);
  111. parser.setData(buffer.array());
  112. GifHeader header = parser.parseHeader();
  113. GifFrame frame = header.frames.get(0);
  114. // Convert delay in 100ths of a second to ms.
  115. assertEquals(GifHeaderParser.DEFAULT_FRAME_DELAY * 10, frame.delay);
  116. }
  117. @Test
  118. public void testObeysFrameDelayIfFrameDelayIsAtMinimum() {
  119. final short frameDelay = GifHeaderParser.MIN_FRAME_DELAY;
  120. ByteBuffer buffer = writeHeaderWithGceAndFrameDelay(frameDelay);
  121. parser.setData(buffer.array());
  122. GifHeader header = parser.parseHeader();
  123. GifFrame frame = header.frames.get(0);
  124. // Convert delay in 100ths of a second to ms.
  125. assertEquals(frameDelay * 10, frame.delay);
  126. }
  127. @Test
  128. public void testSetsFrameLocalColorTableToNullIfNoColorTable() {
  129. final int lzwMinCodeSize = 2;
  130. ByteBuffer buffer = ByteBuffer.allocate(
  131. GifBytesTestUtil.HEADER_LENGTH
  132. + GifBytesTestUtil.IMAGE_DESCRIPTOR_LENGTH
  133. + GifBytesTestUtil.getImageDataSize(lzwMinCodeSize)
  134. ).order(ByteOrder.LITTLE_ENDIAN);
  135. GifBytesTestUtil.writeHeaderAndLsd(buffer, 1, 1, false, 0);
  136. GifBytesTestUtil.writeImageDescriptor(buffer, 0, 0, 1, 1, false /*hasLct*/, 0);
  137. GifBytesTestUtil.writeFakeImageData(buffer, lzwMinCodeSize);
  138. parser.setData(buffer.array());
  139. GifHeader header = parser.parseHeader();
  140. assertEquals(1, header.width);
  141. assertEquals(1, header.height);
  142. assertEquals(1, header.frameCount);
  143. assertNotNull(header.frames.get(0));
  144. assertNull(header.frames.get(0).lct);
  145. }
  146. @Test
  147. public void testSetsFrameLocalColorTableIfHasColorTable() {
  148. final int lzwMinCodeSize = 2;
  149. final int numColors = 4;
  150. ByteBuffer buffer = ByteBuffer.allocate(
  151. GifBytesTestUtil.HEADER_LENGTH
  152. + GifBytesTestUtil.IMAGE_DESCRIPTOR_LENGTH
  153. + GifBytesTestUtil.getImageDataSize(lzwMinCodeSize)
  154. + GifBytesTestUtil.getColorTableLength(numColors)
  155. ).order(ByteOrder.LITTLE_ENDIAN);
  156. GifBytesTestUtil.writeHeaderAndLsd(buffer, 1, 1, false, 0);
  157. GifBytesTestUtil.writeImageDescriptor(buffer, 0, 0, 1, 1, true /*hasLct*/, numColors);
  158. GifBytesTestUtil.writeColorTable(buffer, numColors);
  159. GifBytesTestUtil.writeFakeImageData(buffer, 2);
  160. parser.setData(buffer.array());
  161. GifHeader header = parser.parseHeader();
  162. assertEquals(1, header.width);
  163. assertEquals(1, header.height);
  164. assertEquals(1, header.frameCount);
  165. assertNotNull(header.frames.get(0));
  166. GifFrame frame = header.frames.get(0);
  167. assertNotNull(frame.lct);
  168. }
  169. @Test
  170. public void testCanParseMultipleFrames() {
  171. final int lzwMinCodeSize = 2;
  172. final int expectedFrames = 3;
  173. final int frameSize = GifBytesTestUtil.IMAGE_DESCRIPTOR_LENGTH
  174. + GifBytesTestUtil.getImageDataSize(lzwMinCodeSize);
  175. ByteBuffer buffer = ByteBuffer.allocate(
  176. GifBytesTestUtil.HEADER_LENGTH + expectedFrames * frameSize
  177. ).order(ByteOrder.LITTLE_ENDIAN);
  178. GifBytesTestUtil.writeHeaderAndLsd(buffer, 1, 1, false, 0);
  179. for (int i = 0; i < expectedFrames; i++) {
  180. GifBytesTestUtil.writeImageDescriptor(buffer, 0, 0, 1, 1, false /*hasLct*/, 0 /*numColors*/);
  181. GifBytesTestUtil.writeFakeImageData(buffer, 2);
  182. }
  183. parser.setData(buffer.array());
  184. GifHeader header = parser.parseHeader();
  185. assertEquals(expectedFrames, header.frameCount);
  186. assertEquals(expectedFrames, header.frames.size());
  187. }
  188. @Test(expected = IllegalStateException.class)
  189. public void testThrowsIfParseHeaderCalledBeforeSetData() {
  190. GifHeaderParser parser = new GifHeaderParser();
  191. parser.parseHeader();
  192. }
  193. }