28#include <gtest/gtest.h>
45 using PumpT =
typename T::PumpT;
48 template <
typename L>
static void Test(
PumpT& pump, L gen) {
49 for (
int len = 1; len <= 7; len++)
50 ASSERT_EQ(pump.getBits(len), gen(len)) <<
" Where len: " << len;
54struct TestGetBitsNoFillTag;
57 using PumpT =
typename T::PumpT;
60 template <
typename L>
static void Test(
PumpT& pump, L gen) {
62 for (
int len = 1; len <= 7; len++)
63 ASSERT_EQ(pump.getBitsNoFill(len), gen(len)) <<
" Where len: " << len;
67struct TestPeekBitsTag;
70 using PumpT =
typename T::PumpT;
73 template <
typename L>
static void Test(
PumpT& pump, L gen) {
74 for (
int len = 1; len <= 7; len++) {
75 ASSERT_EQ(pump.peekBits(len), gen(len)) <<
" Where len: " << len;
76 pump.skipBitsNoFill(len);
81struct TestPeekBitsNoFillTag;
84 using PumpT =
typename T::PumpT;
87 template <
typename L>
static void Test(
PumpT& pump, L gen) {
89 for (
int len = 1; len <= 7; len++) {
90 ASSERT_EQ(pump.peekBitsNoFill(len), gen(len))
91 <<
" Where len: " << len;
92 pump.skipBitsNoFill(len);
97struct TestIncreasingPeekLengthTag;
104 template <
typename L>
static void Test(
PumpT& pump, L data) {
105 static const auto MaxLen = 28;
106 for (
int len = 1; len <= MaxLen; len++)
107 ASSERT_EQ(pump.peekBits(len), data(len)) <<
" Where len: " << len;
111struct TestIncreasingPeekLengthNoFillTag;
118 template <
typename L>
static void Test(
PumpT& pump, L data) {
119 static const auto MaxLen = 28;
121 for (
int len = 1; len <= MaxLen; len++)
122 ASSERT_EQ(pump.peekBitsNoFill(len), data(len))
123 <<
" Where len: " << len;
133 template <
typename Tag,
typename TestDataType,
typename L>
134 void runTest(
const TestDataType& data, L gen) {
146 this->
template runTest<TestGetBitsTag>(TypeParam::PatternT::Data,
147 TypeParam::PatternT::element);
150 this->
template runTest<TestGetBitsNoFillTag>(TypeParam::PatternT::Data,
151 TypeParam::PatternT::element);
154 this->
template runTest<TestPeekBitsTag>(TypeParam::PatternT::Data,
155 TypeParam::PatternT::element);
158 this->
template runTest<TestPeekBitsNoFillTag>(TypeParam::PatternT::Data,
159 TypeParam::PatternT::element);
162 this->
template runTest<TestIncreasingPeekLengthTag>(
163 TypeParam::PatternT::Data, TypeParam::PatternT::data);
166 this->
template runTest<TestIncreasingPeekLengthNoFillTag>(
167 TypeParam::PatternT::Data, TypeParam::PatternT::data);
171 PeekNoFillTest, IncreasingPeekLengthTest,
172 IncreasingPeekLengthNoFillTest);
174template <
typename Pump,
typename PatternTag>
struct Pattern final {};
179 static const std::array<uint8_t, 8>
Data;
183template <
typename Pump>
189 static const std::array<uint8_t, 8>
Data;
197 static const std::array<uint8_t, 8>
Data;
205 static const std::array<uint8_t, 8>
Data;
209template <
typename Pump>
211 {uint8_t(~0U), uint8_t(~0U), uint8_t(~0U), uint8_t(~0U)}};
214 int zerosOutputted) -> std::array<uint32_t, 29> {
215 std::array<uint32_t, 29> v;
218 for (
auto& value : v) {
219 if (zerosToOutput == zerosOutputted) {
221 bits |= 0b1 << currBit;
232 int zerosOutputted) -> std::array<uint32_t, 29> {
233 std::array<uint32_t, 29> v;
235 for (
auto& value : v) {
236 if (zerosToOutput == zerosOutputted) {
253template <
typename Pump>
255 ::testing::Types<PumpAndPattern<Pump, Pattern<Pump, ZerosTag>>,
assert(dim.area() >=area)
typename T::PatternT PatternT
void runTest(const TestDataType &data, L gen)
TYPED_TEST_SUITE_P(BitStreamerTest)
::testing::Types< PumpAndPattern< Pump, Pattern< Pump, ZerosTag > >, PumpAndPattern< Pump, Pattern< Pump, OnesTag > >, PumpAndPattern< Pump, Pattern< Pump, InvOnesTag > >, PumpAndPattern< Pump, Pattern< Pump, SaturatedTag > > > Patterns
TYPED_TEST_P(BitStreamerTest, GetTest)
REGISTER_TYPED_TEST_SUITE_P(BitStreamerTest, GetTest, GetNoFillTest, PeekTest, PeekNoFillTest, IncreasingPeekLengthTest, IncreasingPeekLengthNoFillTest)
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
static void Test(PumpT &pump, L data)
typename T::PatternT PatternT
static void Test(PumpT &pump, L gen)
typename T::PatternT PatternT
static void Test(PumpT &pump, L gen)
typename T::PatternT PatternT
typename T::PatternT PatternT
static void Test(PumpT &pump, L gen)
static void Test(PumpT &pump, L data)
typename T::PatternT PatternT
typename T::PatternT PatternT
static void Test(PumpT &pump, L gen)
static uint32_t element(int index)
static const std::array< uint8_t, 8 > Data
static uint32_t data(int len)
static uint32_t element(int index)
static uint32_t data(int len)
static const std::array< uint8_t, 8 > Data
static const std::array< uint8_t, 8 > Data
static uint32_t element(int index)
static uint32_t data(int len)
static const std::array< uint8_t, 8 > Data
static uint32_t data(int len)
static uint32_t element(int index)