/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
- // Copyright 2017 The Chromium OS Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include <cstring>
- #include "gtest/gtest.h"
- #include "puffin/src/bit_reader.h"
- #include "puffin/src/bit_writer.h"
- #include "puffin/src/logging.h"
- #include "puffin/src/unittest_common.h"
- namespace puffin {
- // Testing |BufferBitReader| and |BufferBitWriter|.
- TEST(BitIOTest, BitWriterAndBitReaderTest) {
- static const size_t kSize = 5;
- uint8_t buf[kSize];
- puffin::BufferBitWriter bw(buf, kSize);
- ASSERT_TRUE(bw.WriteBits(0, 0x05));
- ASSERT_TRUE(bw.WriteBits(3, 0x05));
- ASSERT_TRUE(bw.WriteBits(8, 0xFF));
- ASSERT_TRUE(bw.WriteBoundaryBits(0x0F));
- uint8_t tmp[] = {1, 2};
- size_t index = 0;
- ASSERT_TRUE(bw.WriteBytes(2, [&tmp, &index](uint8_t* buffer, size_t count) {
- if (count > 2 - index)
- return false;
- memcpy(buffer, &tmp[index], count);
- return true;
- }));
- ASSERT_FALSE(bw.WriteBits(9, 0x1C));
- ASSERT_TRUE(bw.WriteBits(4, 0x0A));
- ASSERT_TRUE(bw.WriteBoundaryBits(0xBB));
- ASSERT_TRUE(bw.Flush());
- ASSERT_EQ(5, bw.Size());
- puffin::BufferBitReader br(buf, kSize);
- ASSERT_TRUE(br.CacheBits(11));
- ASSERT_EQ(br.ReadBits(3), 0x05);
- br.DropBits(3);
- ASSERT_EQ(br.ReadBits(8), 0xFF);
- br.DropBits(8);
- ASSERT_EQ(br.ReadBoundaryBits(), 0x0F);
- ASSERT_EQ(br.SkipBoundaryBits(), 5);
- std::function<bool(uint8_t*, size_t)> read_fn;
- ASSERT_TRUE(br.GetByteReaderFn(2, &read_fn));
- ASSERT_TRUE(read_fn(tmp, 2));
- ASSERT_EQ(br.Offset(), 4);
- ASSERT_TRUE(read_fn(tmp, 0));
- ASSERT_FALSE(read_fn(tmp, 1));
- ASSERT_FALSE(br.CacheBits(9));
- ASSERT_TRUE(br.CacheBits(8));
- ASSERT_EQ(br.ReadBits(4), 0x0A);
- br.DropBits(4);
- ASSERT_EQ(br.ReadBoundaryBits(), 0x0B);
- ASSERT_EQ(br.SkipBoundaryBits(), 4);
- ASSERT_EQ(br.ReadBoundaryBits(), 0);
- ASSERT_EQ(br.SkipBoundaryBits(), 0);
- ASSERT_FALSE(br.CacheBits(1));
- }
- TEST(BitIOTest, BitsRemaining) {
- const size_t kSize = 5;
- uint8_t buf[kSize];
- BufferBitReader br(buf, kSize);
- EXPECT_EQ(br.BitsRemaining(), 40);
- ASSERT_TRUE(br.CacheBits(1));
- br.DropBits(1);
- EXPECT_EQ(br.BitsRemaining(), 39);
- ASSERT_TRUE(br.CacheBits(7));
- br.DropBits(7);
- EXPECT_EQ(br.BitsRemaining(), 32);
- ASSERT_TRUE(br.CacheBits(31));
- br.DropBits(31);
- EXPECT_EQ(br.BitsRemaining(), 1);
- ASSERT_TRUE(br.CacheBits(1));
- br.DropBits(1);
- EXPECT_EQ(br.BitsRemaining(), 0);
- }
- } // namespace puffin