| 277 | |
| 278 | template <typename T> |
| 279 | void TestRleDecoder(std::vector<uint8_t> bytes, rle_size_t value_count, |
| 280 | rle_size_t bit_width, T expected_value) { |
| 281 | // Pre-requisite for this test |
| 282 | EXPECT_GT(value_count, 6); |
| 283 | |
| 284 | const auto run = RleRun(bytes.data(), value_count, bit_width); |
| 285 | |
| 286 | auto decoder = RleRunDecoder<T>(run, bit_width); |
| 287 | std::vector<T> vals = {0, 0}; |
| 288 | |
| 289 | EXPECT_EQ(decoder.remaining(), value_count); |
| 290 | |
| 291 | rle_size_t read = 0; |
| 292 | EXPECT_EQ(decoder.Get(vals.data(), bit_width), 1); |
| 293 | read += 1; |
| 294 | EXPECT_EQ(vals.at(0), expected_value); |
| 295 | EXPECT_EQ(decoder.remaining(), value_count - read); |
| 296 | |
| 297 | EXPECT_EQ(decoder.Advance(3), 3); |
| 298 | read += 3; |
| 299 | EXPECT_EQ(decoder.remaining(), value_count - read); |
| 300 | |
| 301 | vals = {0, 0}; |
| 302 | EXPECT_EQ(decoder.GetBatch(vals.data(), 2, bit_width), vals.size()); |
| 303 | EXPECT_EQ(vals.at(0), expected_value); |
| 304 | EXPECT_EQ(vals.at(1), expected_value); |
| 305 | read += static_cast<decltype(read)>(vals.size()); |
| 306 | EXPECT_EQ(decoder.remaining(), value_count - read); |
| 307 | |
| 308 | // Exhaust iteration |
| 309 | EXPECT_EQ(decoder.Advance(value_count - read), value_count - read); |
| 310 | EXPECT_EQ(decoder.remaining(), 0); |
| 311 | EXPECT_EQ(decoder.Advance(1), 0); |
| 312 | vals = {0, 0}; |
| 313 | EXPECT_EQ(decoder.Get(vals.data(), bit_width), 0); |
| 314 | EXPECT_EQ(vals.at(0), 0); |
| 315 | |
| 316 | // Reset the decoder |
| 317 | decoder.Reset(run, bit_width); |
| 318 | EXPECT_EQ(decoder.remaining(), value_count); |
| 319 | vals = {0, 0}; |
| 320 | EXPECT_EQ(decoder.GetBatch(vals.data(), 2, bit_width), vals.size()); |
| 321 | EXPECT_EQ(vals.at(0), expected_value); |
| 322 | EXPECT_EQ(vals.at(1), expected_value); |
| 323 | } |
| 324 | |
| 325 | TEST(Rle, RleDecoder) { |
| 326 | TestRleDecoder<uint8_t>({21, 0, 0}, /* value_count= */ 23, /* bit_width= */ 5, |