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