#include #include "common/bitstream.h" #include "common/memstream.h" class BitStreamTestSuite : public CxxTest::TestSuite { private: template void tmpl_get_bit() { byte contents[] = { 'a' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.getBit(), 0u); TS_ASSERT_EQUALS(bs.getBit(), 1u); TS_ASSERT_EQUALS(bs.getBit(), 1u); TS_ASSERT_EQUALS(bs.pos(), 3u); TS_ASSERT(!bs.eos()); } public: void test_get_bit() { tmpl_get_bit(); tmpl_get_bit(); } private: template void tmpl_get_bits() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.getBits(3), 3u); TS_ASSERT_EQUALS(bs.pos(), 3u); TS_ASSERT_EQUALS(bs.getBits(8), 11u); TS_ASSERT_EQUALS(bs.pos(), 11u); TS_ASSERT(!bs.eos()); } public: void test_get_bits() { tmpl_get_bits(); tmpl_get_bits(); } private: template void tmpl_skip() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); bs.skip(5); TS_ASSERT_EQUALS(bs.pos(), 5u); bs.skip(4); TS_ASSERT_EQUALS(bs.pos(), 9u); TS_ASSERT_EQUALS(bs.getBits(3), 6u); TS_ASSERT(!bs.eos()); } public: void test_skip() { tmpl_skip(); tmpl_skip(); } private: template void tmpl_rewind() { byte contents[] = { 'a' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); bs.skip(5); TS_ASSERT_EQUALS(bs.pos(), 5u); bs.rewind(); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.getBits(3), 3u); TS_ASSERT(!bs.eos()); TS_ASSERT_EQUALS(bs.size(), 8u); } public: void test_rewind() { tmpl_rewind(); tmpl_rewind(); } private: template void tmpl_peek_bit() { byte contents[] = { 'a' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.peekBit(), 0u); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.getBit(), 0u); TS_ASSERT_EQUALS(bs.pos(), 1u); TS_ASSERT_EQUALS(bs.peekBit(), 1u); TS_ASSERT_EQUALS(bs.pos(), 1u); TS_ASSERT(!bs.eos()); } public: void test_peek_bit() { tmpl_peek_bit(); tmpl_peek_bit(); } private: template void tmpl_peek_bits() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.peekBits(3), 3u); TS_ASSERT_EQUALS(bs.pos(), 0u); bs.skip(3); TS_ASSERT_EQUALS(bs.pos(), 3u); TS_ASSERT_EQUALS(bs.peekBits(8), 11u); TS_ASSERT_EQUALS(bs.pos(), 3u); bs.skip(8); TS_ASSERT_EQUALS(bs.pos(), 11u); TS_ASSERT_EQUALS(bs.peekBits(5), 2u); TS_ASSERT(!bs.eos()); } public: void test_peek_bits() { tmpl_peek_bits(); tmpl_peek_bits(); } private: template void tmpl_eos() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); bs.skip(11); TS_ASSERT_EQUALS(bs.pos(), 11u); TS_ASSERT_EQUALS(bs.getBits(5), 2u); TS_ASSERT(bs.eos()); bs.rewind(); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT(!bs.eos()); } public: void test_eos() { tmpl_eos(); tmpl_eos(); } private: template void tmpl_get_bits_lsb() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.getBits(3), 1u); TS_ASSERT_EQUALS(bs.pos(), 3u); TS_ASSERT_EQUALS(bs.getBits(8), 76u); TS_ASSERT_EQUALS(bs.pos(), 11u); TS_ASSERT(!bs.eos()); } public: void test_get_bits_lsb() { tmpl_get_bits_lsb(); tmpl_get_bits_lsb(); } private: template void tmpl_peek_bits_lsb() { byte contents[] = { 'a', 'b' }; MS ms(contents, sizeof(contents)); BS bs(ms); TS_ASSERT_EQUALS(bs.pos(), 0u); TS_ASSERT_EQUALS(bs.peekBits(3), 1u); TS_ASSERT_EQUALS(bs.pos(), 0u); bs.skip(3); TS_ASSERT_EQUALS(bs.pos(), 3u); TS_ASSERT_EQUALS(bs.peekBits(8), 76u); TS_ASSERT_EQUALS(bs.pos(), 3u); bs.skip(8); TS_ASSERT_EQUALS(bs.pos(), 11u); TS_ASSERT_EQUALS(bs.peekBits(5), 12u); TS_ASSERT(!bs.eos()); } public: void test_peek_bits_lsb() { tmpl_peek_bits_lsb(); tmpl_peek_bits_lsb(); } };