ans: Add a final state serialization test
Make sure all legal final states can both be serialized an unserialized.
Change-Id: I74d96598a2b206fbc6c82a06649347afb5f9bbd8
diff --git a/test/ans_test.cc b/test/ans_test.cc
index 0e1c0a6..c6fc247 100644
--- a/test/ans_test.cc
+++ b/test/ans_test.cc
@@ -154,7 +154,7 @@
return ans_read_end(&d) != 0;
}
-class AbsTest : public ::testing::Test {
+class AbsTestFix : public ::testing::Test {
protected:
static void SetUpTestCase() { pv_vec_ = abs_encode_build_vals(kNumBools); }
virtual void SetUp() { buf_ = new uint8_t[kNumBools / 8]; }
@@ -163,9 +163,9 @@
static PvVec pv_vec_;
uint8_t *buf_;
};
-PvVec AbsTest::pv_vec_;
+PvVec AbsTestFix::pv_vec_;
-class AnsTest : public ::testing::Test {
+class AnsTestFix : public ::testing::Test {
protected:
static void SetUpTestCase() {
sym_vec_ = ans_encode_build_vals(rans_sym_tab_, kNumSyms);
@@ -177,11 +177,30 @@
static rans_sym rans_sym_tab_[kRansSymbols];
uint8_t *buf_;
};
-std::vector<int> AnsTest::sym_vec_;
-rans_sym AnsTest::rans_sym_tab_[kRansSymbols];
+std::vector<int> AnsTestFix::sym_vec_;
+rans_sym AnsTestFix::rans_sym_tab_[kRansSymbols];
-TEST_F(AbsTest, Uabs) { EXPECT_TRUE(check_uabs(pv_vec_, buf_)); }
-TEST_F(AnsTest, Rans) {
+TEST_F(AbsTestFix, Uabs) { EXPECT_TRUE(check_uabs(pv_vec_, buf_)); }
+TEST_F(AnsTestFix, Rans) {
EXPECT_TRUE(check_rans(sym_vec_, rans_sym_tab_, buf_));
}
+TEST(AnsTest, FinalStateSerialization) {
+ for (unsigned i = L_BASE; i < L_BASE * IO_BASE; ++i) {
+ uint8_t buf[8];
+ AnsCoder c;
+ ans_write_init(&c, buf);
+ c.state = i;
+ const int written_size = ans_write_end(&c);
+ ASSERT_LT(static_cast<size_t>(written_size), sizeof(buf));
+ AnsDecoder d;
+#if ANS_MAX_SYMBOLS
+ // There is no real data window here because no symbols are sent through
+ // ans (only synthetic states), so use a dummy value
+ d.window_size = 1024;
+#endif
+ const int read_init_status = ans_read_init(&d, buf, written_size);
+ EXPECT_EQ(read_init_status, 0);
+ EXPECT_EQ(d.state, i);
+ }
+}
} // namespace