util: Improve test coverage for BitBuffer/BitStream

This commit is contained in:
Joshua Scott 2018-12-01 17:17:19 +00:00
parent 6a213c18d4
commit 24d3c0f146
3 changed files with 185 additions and 12 deletions

View File

@ -1 +1 @@
UUUU UUUU<EFBFBD>V<EFBFBD><EFBFBD>

Binary file not shown.

View File

@ -12,15 +12,29 @@
#define KI_TEST_BITSTREAM_BUI5 0b10101 #define KI_TEST_BITSTREAM_BUI5 0b10101
#define KI_TEST_BITSTREAM_BUI6 0b101010 #define KI_TEST_BITSTREAM_BUI6 0b101010
#define KI_TEST_BITSTREAM_BUI7 0b0101010 #define KI_TEST_BITSTREAM_BUI7 0b0101010
#define KI_TEST_BITSTREAM_BI1 -1
#define KI_TEST_BITSTREAM_BI2 -2
#define KI_TEST_BITSTREAM_BI3 -3
#define KI_TEST_BITSTREAM_BI4 -6
#define KI_TEST_BITSTREAM_BI5 -11
#define KI_TEST_BITSTREAM_BI6 -22
#define KI_TEST_BITSTREAM_BI7 -43
#define KI_TEST_BITSTREAM_BOOL true #define KI_TEST_BITSTREAM_BOOL true
#define KI_TEST_BITSTREAM_U8 0x01 #define KI_TEST_BITSTREAM_U8 0x01
#define KI_TEST_BITSTREAM_U16 0x0302 #define KI_TEST_BITSTREAM_U16 0x0302
#define KI_TEST_BITSTREAM_U24 0x060504 #define KI_TEST_BITSTREAM_U24 0x060504
#define KI_TEST_BITSTREAM_U32 0x0A090807 #define KI_TEST_BITSTREAM_U32 0x0A090807
#define KI_TEST_BITSTREAM_U64 0x1211100F0E0D0C0BL #define KI_TEST_BITSTREAM_U64 0x1211100F0E0D0C0BL
#define KI_TEST_BITSTREAM_I8 -8
#define KI_TEST_BITSTREAM_I16 -2048
#define KI_TEST_BITSTREAM_I24 -524288
#define KI_TEST_BITSTREAM_I32 -134217728
#define KI_TEST_BITSTREAM_I64 -576460752303423488L
#define KI_TEST_WRITE_BUI(n) bit_stream.write<bui<n>>(KI_TEST_BITSTREAM_BUI##n) #define KI_TEST_WRITE_BUI(n) bit_stream.write<bui<n>>(KI_TEST_BITSTREAM_BUI##n)
#define KI_TEST_READ_BUI(n) bit_stream.read<bui<n>>() == KI_TEST_BITSTREAM_BUI##n #define KI_TEST_READ_BUI(n) bit_stream.read<bui<n>>() == KI_TEST_BITSTREAM_BUI##n
#define KI_TEST_WRITE_BI(n) bit_stream.write<bi<n>>(KI_TEST_BITSTREAM_BI##n)
#define KI_TEST_READ_BI(n) bit_stream.read<bi<n>>() == KI_TEST_BITSTREAM_BI##n
using namespace ki; using namespace ki;
@ -30,16 +44,48 @@ TEST_CASE("BitStream::stream_pos Functionality", "[bit-stream]")
SECTION("Increment single bit") SECTION("Increment single bit")
{ {
++position; const auto position1 = ++position;
REQUIRE(position.get_byte() == 1); REQUIRE(position.get_byte() == 1);
REQUIRE(position.get_bit() == 5); REQUIRE(position.get_bit() == 5);
REQUIRE(position1.get_byte() == 1);
REQUIRE(position1.get_bit() == 5);
const auto position2 = position++;
REQUIRE(position.get_byte() == 1);
REQUIRE(position.get_bit() == 6);
REQUIRE(position2.get_byte() == 1);
REQUIRE(position2.get_bit() == 5);
const auto position3 = position + 1;
REQUIRE(position3.get_byte() == 1);
REQUIRE(position3.get_bit() == 7);
const auto position4 = position + BitStream::stream_pos(0, 1);
REQUIRE(position4.get_byte() == 1);
REQUIRE(position4.get_bit() == 7);
} }
SECTION("Decrement single bit") SECTION("Decrement single bit")
{ {
--position; const auto position1 = --position;
REQUIRE(position.get_byte() == 1); REQUIRE(position.get_byte() == 1);
REQUIRE(position.get_bit() == 3); REQUIRE(position.get_bit() == 3);
REQUIRE(position1.get_byte() == 1);
REQUIRE(position1.get_bit() == 3);
const auto position2 = position--;
REQUIRE(position.get_byte() == 1);
REQUIRE(position.get_bit() == 2);
REQUIRE(position2.get_byte() == 1);
REQUIRE(position2.get_bit() == 3);
const auto position3 = position - 1;
REQUIRE(position3.get_byte() == 1);
REQUIRE(position3.get_bit() == 1);
const auto position4 = position - BitStream::stream_pos(0, 1);
REQUIRE(position4.get_byte() == 1);
REQUIRE(position4.get_bit() == 1);
} }
SECTION("Increment bits and move to next byte") SECTION("Increment bits and move to next byte")
@ -69,6 +115,66 @@ TEST_CASE("BitStream::stream_pos Functionality", "[bit-stream]")
REQUIRE(position.get_byte() == 0); REQUIRE(position.get_byte() == 0);
REQUIRE(position.get_bit() == 4); REQUIRE(position.get_bit() == 4);
} }
SECTION("As number of bytes")
{
REQUIRE(position.as_bytes() == 2);
position -= 4;
REQUIRE(position.as_bytes() == 1);
}
SECTION("As number of bits")
{
REQUIRE(position.as_bits() == 12);
position -= 4;
REQUIRE(position.as_bits() == 8);
}
}
TEST_CASE("BitBuffer Functionality", "[bit-stream]")
{
BitBuffer bit_buffer(1);
SECTION("Create valid segment")
{
auto *segment = bit_buffer.segment(
BitBuffer::buffer_pos(0, 0), 8
);
REQUIRE(segment->size() == 1);
delete segment;
}
SECTION("Create invalid segment (invalid position)")
{
try
{
auto *segment = bit_buffer.segment(
BitBuffer::buffer_pos(1, 0), 8
);
delete segment;
FAIL();
}
catch (runtime_error &e)
{
SUCCEED();
}
}
SECTION("Create invalid segment (invalid size)")
{
try
{
auto *segment = bit_buffer.segment(
BitBuffer::buffer_pos(0, 0), 16
);
delete segment;
FAIL();
}
catch (runtime_error &e)
{
SUCCEED();
}
}
} }
TEST_CASE("BitStream Functionality", "[bit-stream]") TEST_CASE("BitStream Functionality", "[bit-stream]")
@ -88,9 +194,19 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
KI_TEST_WRITE_BUI(7); KI_TEST_WRITE_BUI(7);
KI_TEST_WRITE_BUI(4); KI_TEST_WRITE_BUI(4);
// Write signed values
KI_TEST_WRITE_BI(1);
KI_TEST_WRITE_BI(2);
KI_TEST_WRITE_BI(3);
KI_TEST_WRITE_BI(4);
KI_TEST_WRITE_BI(5);
KI_TEST_WRITE_BI(6);
KI_TEST_WRITE_BI(7);
KI_TEST_WRITE_BI(4);
// Make sure tell is reporting the right position // Make sure tell is reporting the right position
auto position = bit_stream.tell(); auto position = bit_stream.tell();
REQUIRE(position.get_byte() == 4); REQUIRE(position.get_byte() == 8);
REQUIRE(position.get_bit() == 0); REQUIRE(position.get_bit() == 0);
const auto size = position.get_byte(); const auto size = position.get_byte();
@ -110,7 +226,7 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
SECTION("Writing values with a size greater than 8 bits") SECTION("Writing values with a size greater than 8 bits")
{ {
// Write some values // Write unsigned values
bit_stream.write<bool>(KI_TEST_BITSTREAM_BOOL); bit_stream.write<bool>(KI_TEST_BITSTREAM_BOOL);
bit_stream.write<uint8_t>(KI_TEST_BITSTREAM_U8); bit_stream.write<uint8_t>(KI_TEST_BITSTREAM_U8);
bit_stream.write<uint16_t>(KI_TEST_BITSTREAM_U16); bit_stream.write<uint16_t>(KI_TEST_BITSTREAM_U16);
@ -118,9 +234,16 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
bit_stream.write<uint32_t>(KI_TEST_BITSTREAM_U32); bit_stream.write<uint32_t>(KI_TEST_BITSTREAM_U32);
bit_stream.write<uint64_t>(KI_TEST_BITSTREAM_U64); bit_stream.write<uint64_t>(KI_TEST_BITSTREAM_U64);
// Write signed values
bit_stream.write<int8_t>(KI_TEST_BITSTREAM_I8);
bit_stream.write<int16_t>(KI_TEST_BITSTREAM_I16);
bit_stream.write<bi<24>>(KI_TEST_BITSTREAM_I24);
bit_stream.write<int32_t>(KI_TEST_BITSTREAM_I32);
bit_stream.write<int64_t>(KI_TEST_BITSTREAM_I64);
// Make sure tell is reporting the right position // Make sure tell is reporting the right position
auto position = bit_stream.tell(); auto position = bit_stream.tell();
REQUIRE(position.get_byte() == 19); REQUIRE(position.get_byte() == 37);
REQUIRE(position.get_bit() == 0); REQUIRE(position.get_bit() == 0);
const auto size = position.get_byte(); const auto size = position.get_byte();
@ -154,6 +277,7 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
sample.read(stream_data, size); sample.read(stream_data, size);
// Read the values and check they are what we are expecting // Read the values and check they are what we are expecting
// Unsigned values
REQUIRE(KI_TEST_READ_BUI(1)); REQUIRE(KI_TEST_READ_BUI(1));
REQUIRE(KI_TEST_READ_BUI(2)); REQUIRE(KI_TEST_READ_BUI(2));
REQUIRE(KI_TEST_READ_BUI(3)); REQUIRE(KI_TEST_READ_BUI(3));
@ -162,6 +286,16 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
REQUIRE(KI_TEST_READ_BUI(6)); REQUIRE(KI_TEST_READ_BUI(6));
REQUIRE(KI_TEST_READ_BUI(7)); REQUIRE(KI_TEST_READ_BUI(7));
REQUIRE(KI_TEST_READ_BUI(4)); REQUIRE(KI_TEST_READ_BUI(4));
// Signed values
REQUIRE(KI_TEST_READ_BI(1));
REQUIRE(KI_TEST_READ_BI(2));
REQUIRE(KI_TEST_READ_BI(3));
REQUIRE(KI_TEST_READ_BI(4));
REQUIRE(KI_TEST_READ_BI(5));
REQUIRE(KI_TEST_READ_BI(6));
REQUIRE(KI_TEST_READ_BI(7));
REQUIRE(KI_TEST_READ_BI(4));
} }
SECTION("Reading values with a size greater than 8 bits") SECTION("Reading values with a size greater than 8 bits")
@ -180,18 +314,47 @@ TEST_CASE("BitStream Functionality", "[bit-stream]")
sample.read(stream_data, size); sample.read(stream_data, size);
// Read the values and check they are what we are expecting // Read the values and check they are what we are expecting
// Unsigned values
REQUIRE(bit_stream.read<bool>() == KI_TEST_BITSTREAM_BOOL); REQUIRE(bit_stream.read<bool>() == KI_TEST_BITSTREAM_BOOL);
REQUIRE(bit_stream.read<uint8_t>() == KI_TEST_BITSTREAM_U8); REQUIRE(bit_stream.read<uint8_t>() == KI_TEST_BITSTREAM_U8);
REQUIRE(bit_stream.read<uint16_t>() == KI_TEST_BITSTREAM_U16); REQUIRE(bit_stream.read<uint16_t>() == KI_TEST_BITSTREAM_U16);
REQUIRE(bit_stream.read<bui<24>>() == KI_TEST_BITSTREAM_U24); REQUIRE(bit_stream.read<bui<24>>() == KI_TEST_BITSTREAM_U24);
REQUIRE(bit_stream.read<uint32_t>() == KI_TEST_BITSTREAM_U32); REQUIRE(bit_stream.read<uint32_t>() == KI_TEST_BITSTREAM_U32);
REQUIRE(bit_stream.read<uint64_t>() == KI_TEST_BITSTREAM_U64); REQUIRE(bit_stream.read<uint64_t>() == KI_TEST_BITSTREAM_U64);
// Signed values
REQUIRE(bit_stream.read<int8_t>() == KI_TEST_BITSTREAM_I8);
REQUIRE(bit_stream.read<int16_t>() == KI_TEST_BITSTREAM_I16);
REQUIRE(bit_stream.read<bi<24>>() == KI_TEST_BITSTREAM_I24);
REQUIRE(bit_stream.read<int32_t>() == KI_TEST_BITSTREAM_I32);
REQUIRE(bit_stream.read<int64_t>() == KI_TEST_BITSTREAM_I64);
}
SECTION("Copying memory in/out of the stream")
{
// Copy the string into the stream
char *str = "Hello, world!";
const auto size = bitsizeof<char>::value * (strlen(str) + 1);
bit_stream.write_copy(reinterpret_cast<uint8_t *>(str), size);
// Copy the string from the stream into a new buffer
auto *str_copy = new char[size];
bit_stream.seek(BitStream::stream_pos(0, 0));
bit_stream.read_copy(reinterpret_cast<uint8_t *>(str_copy), size);
REQUIRE(strcmp(str, str_copy) == 0);
delete[] str_copy;
} }
SECTION("Overwriting values") SECTION("Overwriting values")
{ {
bit_stream.write<bui<2>>(0b11); bit_stream.write<bui<2>>(0b0011);
bit_stream.seek(BitStream::stream_pos(0, 0)); bit_stream.seek(BitStream::stream_pos(0, 0));
bit_stream.write<bui<4>>(0b1100);
bit_stream.seek(BitStream::stream_pos(0, 0));
REQUIRE(
static_cast<uint16_t>(bit_stream.read<bui<4>>()) == 0b1100
);
} }
} }
@ -211,8 +374,18 @@ TEST_CASE("BitStream buffer expansion", "[bit-stream]")
REQUIRE(bit_stream.read<uint8_t>(8) == 0x55); REQUIRE(bit_stream.read<uint8_t>(8) == 0x55);
} }
/** TEST_CASE("BitStream read overflow", "[bit-stream]")
* TODO: Test reading outside of buffer (should throw) {
* TODO: Test read/write copy on BitStream // Create a 1-byte large buffer, and attempt to read a 32-bit value
* TODO: Test BitStreamSection auto bit_buffer = BitBuffer(1);
*/ auto bit_stream = BitStream(bit_buffer);
try
{
bit_stream.read<uint32_t>();
FAIL();
}
catch (runtime_error &e)
{
SUCCEED();
}
}