@@ -416,3 +416,113 @@ TEST(bitreaderTest, align_to_non_byte_boundary)
416416 EXPECT_EQ (5 , br.position ());
417417 EXPECT_EQ (11 , br.available ());
418418}
419+
420+ // ------------------------------------------------------------------------------
421+ TEST (bitreaderTest, read_float_aligned)
422+ {
423+ const uint8_t data[] = {0x41 , 0x48 , 0xF5 , 0xC3 };
424+ auto source = std::make_shared<source_t >(data, sizeof (data));
425+ bitreader<source_t > br (source);
426+
427+ const uint32_t raw_expected = 0x4148F5C3 ;
428+ const auto expected = *reinterpret_cast <const float *>(&raw_expected);
429+ EXPECT_EQ (expected, br.read <float >(32 ));
430+ EXPECT_EQ (32 , br.position ());
431+ EXPECT_EQ (0 , br.available ());
432+ }
433+
434+ // ------------------------------------------------------------------------------
435+ TEST (bitreaderTest, read_double_aligned)
436+ {
437+ const uint8_t data[] = {0x40 , 0x05 , 0xBF , 0x0A , 0x8B , 0x14 , 0x57 , 0x62 };
438+ auto source = std::make_shared<source_t >(data, sizeof (data));
439+ bitreader<source_t > br (source);
440+
441+ const uint64_t raw_expected = 0x4005BF0A8B145762 ;
442+ const auto expected = *reinterpret_cast <const double *>(&raw_expected);
443+ EXPECT_EQ (expected, br.read <double >(64 ));
444+ EXPECT_EQ (64 , br.position ());
445+ EXPECT_EQ (0 , br.available ());
446+ }
447+
448+ // ------------------------------------------------------------------------------
449+ TEST (bitreaderTest, read_float_unaligned)
450+ {
451+ const uint8_t data[] = {0x10 , 0x20 , 0x30 , 0x40 , 0x50 };
452+ auto source = std::make_shared<source_t >(data, sizeof (data));
453+ bitreader<source_t > br (source);
454+
455+ br.skip (4 );
456+
457+ const uint32_t raw_expected = 0x02030405 ;
458+ const auto expected = *reinterpret_cast <const float *>(&raw_expected);
459+ EXPECT_EQ (expected, br.read <float >(32 )); // exact eq
460+ EXPECT_EQ (36 , br.position ());
461+ EXPECT_EQ (4 , br.available ());
462+ }
463+
464+ // ------------------------------------------------------------------------------
465+ TEST (bitreaderTest, read_double_unaligned)
466+ {
467+ const uint8_t data[] = {0x10 , 0x20 , 0x30 , 0x40 , 0x50 , 0x60 , 0x70 , 0x80 , 0x90 };
468+ auto source = std::make_shared<source_t >(data, sizeof (data));
469+ bitreader<source_t > br (source);
470+
471+ br.skip (4 );
472+
473+ const uint64_t raw_expected = 0x0203'0405'0607'0809 ;
474+ const auto expected = *reinterpret_cast <const double *>(&raw_expected);
475+ EXPECT_EQ (expected, br.read <double >(64 ));
476+ EXPECT_EQ (68 , br.position ());
477+ EXPECT_EQ (4 , br.available ());
478+ }
479+
480+ // ------------------------------------------------------------------------------
481+ TEST (bitreaderTest, read_double_wrong_size)
482+ {
483+ const uint8_t data[] = {0x10 , 0x20 , 0x30 , 0x40 , 0x50 , 0x60 , 0x70 , 0x80 , 0x90 };
484+ auto source = std::make_shared<source_t >(data, sizeof (data));
485+ bitreader<source_t > br (source);
486+
487+ br.skip (4 );
488+
489+ EXPECT_THROW (br.read <double >(63 ), std::exception); // wrong size
490+ EXPECT_EQ (4 , br.position ());
491+ }
492+
493+ // ------------------------------------------------------------------------------
494+ TEST (bitreaderTest, read_float_wrong_size)
495+ {
496+ const uint8_t data[] = {0x10 , 0x20 , 0x30 , 0x40 , 0x50 , 0x60 , 0x70 , 0x80 , 0x90 };
497+ auto source = std::make_shared<source_t >(data, sizeof (data));
498+ bitreader<source_t > br (source);
499+
500+ br.skip (4 );
501+
502+ EXPECT_THROW (br.read <float >(31 ), std::exception); // wrong size
503+ EXPECT_EQ (4 , br.position ());
504+ }
505+
506+ // ------------------------------------------------------------------------------
507+ TEST (bitreaderTest, read_float_insufficient_data)
508+ {
509+ const uint8_t data[] = {0x41 , 0x48 , 0xF5 }; // Only 3 bytes for float
510+ auto source = std::make_shared<source_t >(data, sizeof (data));
511+ bitreader<source_t > br (source);
512+
513+ EXPECT_THROW (br.read <float >(32 ), std::exception);
514+ EXPECT_EQ (0 , br.position ());
515+ EXPECT_EQ (24 , br.available ());
516+ }
517+
518+ // ------------------------------------------------------------------------------
519+ TEST (bitreaderTest, read_double_insufficient_data)
520+ {
521+ const uint8_t data[] = {0x40 , 0x05 , 0xBF , 0x0A , 0x8B , 0x14 , 0x57 }; // Only 7 bytes for double
522+ auto source = std::make_shared<source_t >(data, sizeof (data));
523+ bitreader<source_t > br (source);
524+
525+ EXPECT_THROW (br.read <double >(64 ), std::exception);
526+ EXPECT_EQ (0 , br.position ());
527+ EXPECT_EQ (56 , br.available ());
528+ }
0 commit comments