mkvtoolnix/tests/unit/common/bit_writer.cpp

155 lines
3.9 KiB
C++
Raw Normal View History

#include "common/common_pch.h"
#include "common/bit_reader.h"
#include "common/bit_writer.h"
#include "common/endian.h"
#include "gtest/gtest.h"
namespace {
// 0xf 7 2 3 4 a 8 1
// 1111 0111 0010 0011 0100 1010 1000 0001
TEST(BitWriter, PutBit) {
auto b = bit_writer_c{};
// f
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
// 7
EXPECT_NO_THROW(b.put_bit(0));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
// 2
EXPECT_NO_THROW(b.put_bit(0));
EXPECT_NO_THROW(b.put_bit(0));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(0));
// 3
EXPECT_NO_THROW(b.put_bit(0));
EXPECT_NO_THROW(b.put_bit(0));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_NO_THROW(b.put_bit(1));
EXPECT_EQ(16, b.get_bit_position());
auto buffer = b.get_buffer();
ASSERT_EQ(2, buffer->get_size());
EXPECT_EQ(0xf723, get_uint16_be(buffer->get_buffer()));
}
TEST(BitWriter, PutBits) {
auto b = bit_writer_c{};
// f7
EXPECT_NO_THROW(b.put_bits(4, 0x0f));
EXPECT_NO_THROW(b.put_bits(4, 0x07));
auto buffer = b.get_buffer();
ASSERT_EQ(1, buffer->get_size());
EXPECT_EQ(0xf7, buffer->get_buffer()[0]);
// 234
EXPECT_NO_THROW(b.put_bits(12, 0x234));
buffer = b.get_buffer();
ASSERT_EQ(3, buffer->get_size());
EXPECT_EQ(0xf72340, get_uint24_be(buffer->get_buffer()));
// a81 = 101 010 000…
EXPECT_NO_THROW(b.put_bits(3, 0x05));
EXPECT_NO_THROW(b.put_bits(3, 0x02));
EXPECT_NO_THROW(b.put_bits(3, 0x00));
EXPECT_EQ(29, b.get_bit_position());
buffer = b.get_buffer();
ASSERT_EQ(4, buffer->get_size());
EXPECT_EQ(0xf7234a80, get_uint32_be(buffer->get_buffer()));
}
TEST(BitWriter, ByteAlign) {
auto b = bit_writer_c{};
// f7
b.byte_align();
EXPECT_EQ(0, b.get_bit_position());
ASSERT_EQ(0, b.get_buffer()->get_size());
EXPECT_NO_THROW(b.put_bits(2, 0x03));
b.byte_align();
auto buffer = b.get_buffer();
EXPECT_EQ(8, b.get_bit_position());
ASSERT_EQ(1, buffer->get_size());
EXPECT_EQ(0xc0, buffer->get_buffer()[0]);
EXPECT_NO_THROW(b.put_bits(7, 0x11));
b.byte_align();
buffer = b.get_buffer();
EXPECT_EQ( 16, b.get_bit_position());
ASSERT_EQ(2, buffer->get_size());
EXPECT_EQ(0xc022, get_uint16_be(buffer->get_buffer()));
}
TEST(BitWriter, SkipBits) {
auto b = bit_writer_c{};
EXPECT_EQ(0, b.get_bit_position());
EXPECT_NO_THROW(b.skip_bits(3));
EXPECT_EQ(3, b.get_bit_position());
EXPECT_NO_THROW(b.skip_bits(7));
EXPECT_EQ(10, b.get_bit_position());
EXPECT_NO_THROW(b.skip_bit());
EXPECT_EQ(11, b.get_bit_position());
ASSERT_EQ(0, b.get_buffer()->get_size());
}
TEST(BitWriter, SetBitPosition) {
auto b = bit_writer_c{};
EXPECT_EQ(0, b.get_bit_position());
EXPECT_NO_THROW(b.set_bit_position(0));
EXPECT_EQ(0, b.get_bit_position());
EXPECT_NO_THROW(b.set_bit_position(8));
EXPECT_EQ(8, b.get_bit_position());
EXPECT_NO_THROW(b.set_bit_position(0));
EXPECT_EQ(0, b.get_bit_position());
EXPECT_NO_THROW(b.set_bit_position(31));
EXPECT_EQ(31, b.get_bit_position());
ASSERT_EQ(0, b.get_buffer()->get_size());
EXPECT_NO_THROW(b.put_bit(1));
auto buffer = b.get_buffer();
ASSERT_EQ(4, buffer->get_size());
EXPECT_EQ(0x00000001, get_uint32_be(buffer->get_buffer()));
}
TEST(BitWriter, ExtendingTheBuffer) {
auto b = bit_writer_c{};
for (int idx = 0; idx < 24; ++idx)
ASSERT_NO_THROW(b.put_bits(32, 0x01234567u));
ASSERT_EQ(96 * 8, b.get_bit_position());
ASSERT_NO_THROW(b.put_bits(64, 0x0123456789abcdefull));
ASSERT_EQ(104 * 8, b.get_bit_position());
auto buffer = b.get_buffer();
ASSERT_EQ(104, buffer->get_size());
EXPECT_EQ(0x01234567u, get_uint32_be(&buffer->get_buffer()[92]));
EXPECT_EQ(0x01234567u, get_uint32_be(&buffer->get_buffer()[96]));
EXPECT_EQ(0x89abcdefu, get_uint32_be(&buffer->get_buffer()[100]));
}
}