/third_party/puffin/src/bit_io_unittest.cc

https://github.com/chromium/chromium · C++ · 87 lines · 71 code · 12 blank · 4 comment · 1 complexity · 7f6219f7fcf81fea90fbf20826ce6519 MD5 · raw file

  1. // Copyright 2017 The Chromium OS Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <cstring>
  5. #include "gtest/gtest.h"
  6. #include "puffin/src/bit_reader.h"
  7. #include "puffin/src/bit_writer.h"
  8. #include "puffin/src/logging.h"
  9. #include "puffin/src/unittest_common.h"
  10. namespace puffin {
  11. // Testing |BufferBitReader| and |BufferBitWriter|.
  12. TEST(BitIOTest, BitWriterAndBitReaderTest) {
  13. static const size_t kSize = 5;
  14. uint8_t buf[kSize];
  15. puffin::BufferBitWriter bw(buf, kSize);
  16. ASSERT_TRUE(bw.WriteBits(0, 0x05));
  17. ASSERT_TRUE(bw.WriteBits(3, 0x05));
  18. ASSERT_TRUE(bw.WriteBits(8, 0xFF));
  19. ASSERT_TRUE(bw.WriteBoundaryBits(0x0F));
  20. uint8_t tmp[] = {1, 2};
  21. size_t index = 0;
  22. ASSERT_TRUE(bw.WriteBytes(2, [&tmp, &index](uint8_t* buffer, size_t count) {
  23. if (count > 2 - index)
  24. return false;
  25. memcpy(buffer, &tmp[index], count);
  26. return true;
  27. }));
  28. ASSERT_FALSE(bw.WriteBits(9, 0x1C));
  29. ASSERT_TRUE(bw.WriteBits(4, 0x0A));
  30. ASSERT_TRUE(bw.WriteBoundaryBits(0xBB));
  31. ASSERT_TRUE(bw.Flush());
  32. ASSERT_EQ(5, bw.Size());
  33. puffin::BufferBitReader br(buf, kSize);
  34. ASSERT_TRUE(br.CacheBits(11));
  35. ASSERT_EQ(br.ReadBits(3), 0x05);
  36. br.DropBits(3);
  37. ASSERT_EQ(br.ReadBits(8), 0xFF);
  38. br.DropBits(8);
  39. ASSERT_EQ(br.ReadBoundaryBits(), 0x0F);
  40. ASSERT_EQ(br.SkipBoundaryBits(), 5);
  41. std::function<bool(uint8_t*, size_t)> read_fn;
  42. ASSERT_TRUE(br.GetByteReaderFn(2, &read_fn));
  43. ASSERT_TRUE(read_fn(tmp, 2));
  44. ASSERT_EQ(br.Offset(), 4);
  45. ASSERT_TRUE(read_fn(tmp, 0));
  46. ASSERT_FALSE(read_fn(tmp, 1));
  47. ASSERT_FALSE(br.CacheBits(9));
  48. ASSERT_TRUE(br.CacheBits(8));
  49. ASSERT_EQ(br.ReadBits(4), 0x0A);
  50. br.DropBits(4);
  51. ASSERT_EQ(br.ReadBoundaryBits(), 0x0B);
  52. ASSERT_EQ(br.SkipBoundaryBits(), 4);
  53. ASSERT_EQ(br.ReadBoundaryBits(), 0);
  54. ASSERT_EQ(br.SkipBoundaryBits(), 0);
  55. ASSERT_FALSE(br.CacheBits(1));
  56. }
  57. TEST(BitIOTest, BitsRemaining) {
  58. const size_t kSize = 5;
  59. uint8_t buf[kSize];
  60. BufferBitReader br(buf, kSize);
  61. EXPECT_EQ(br.BitsRemaining(), 40);
  62. ASSERT_TRUE(br.CacheBits(1));
  63. br.DropBits(1);
  64. EXPECT_EQ(br.BitsRemaining(), 39);
  65. ASSERT_TRUE(br.CacheBits(7));
  66. br.DropBits(7);
  67. EXPECT_EQ(br.BitsRemaining(), 32);
  68. ASSERT_TRUE(br.CacheBits(31));
  69. br.DropBits(31);
  70. EXPECT_EQ(br.BitsRemaining(), 1);
  71. ASSERT_TRUE(br.CacheBits(1));
  72. br.DropBits(1);
  73. EXPECT_EQ(br.BitsRemaining(), 0);
  74. }
  75. } // namespace puffin