mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-02-26 08:22:31 +00:00
155 lines
3.9 KiB
C++
155 lines
3.9 KiB
C++
#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]));
|
|
}
|
|
|
|
}
|