TEST(local_storage_mixture, pack_and_unpack) { local_storage_mixture st; { st.set3("a", "x", val3_t(1, 11, 111)); st.set3("a", "y", val3_t(2, 22, 222)); st.set3("a", "z", val3_t(3, 33, 333)); st.set3("b", "x", val3_t(12, 1212, 121212)); st.set3("b", "z", val3_t(45, 4545, 454545)); } msgpack::sbuffer buf; { msgpack::packer<msgpack::sbuffer> packer(buf); st.pack(packer); } local_storage_mixture st2; { msgpack::unpacked unpacked; msgpack::unpack(&unpacked, buf.data(), buf.size()); st2.unpack(unpacked.get()); } feature_val1_t a1, b1; st.get("a", a1); st.get("b", b1); feature_val1_t a2, b2; st2.get("a", a2); st2.get("b", b2); ASSERT_EQ(a1.size(), a2.size()); for (size_t i = 0; i < a1.size(); ++i) { EXPECT_EQ(a1[i], a2[i]); } ASSERT_EQ(b1.size(), b2.size()); for (size_t i = 0; i < b1.size(); ++i) { EXPECT_EQ(b1[i], b2[i]); } }
void get_diff(diff_t& v) const { feature_val3_t c; c.push_back(make_pair(string("l1"), val3_t(1.0, 2.0, 3.0))); v.diff.push_back(make_pair(string("f1"), c)); }
val3_t mix_val3(const val3_t& lhs, const val3_t& rhs) { return val3_t(lhs.v1 + rhs.v1, min(lhs.v2, rhs.v2), lhs.v3 + rhs.v3); }
TEST(local_storage_mixture, get_diff) { local_storage_mixture s; s.set("a", "x", 1); s.set("a", "y", 2); s.set("a", "z", 3); s.set("b", "x", 123); s.set("b", "z", 456); features3_t diff; s.get_diff(diff); sort(diff.begin(), diff.end()); ASSERT_EQ(2u, diff.size()); EXPECT_EQ("a", diff[0].first); feature_val3_t& a = diff[0].second; sort(a.begin(), a.end()); ASSERT_EQ(3u, a.size()); EXPECT_EQ("x", a[0].first); EXPECT_EQ(1, a[0].second.v1); EXPECT_EQ("y", a[1].first); EXPECT_EQ(2, a[1].second.v1); EXPECT_EQ("z", a[2].first); EXPECT_EQ(3, a[2].second.v1); EXPECT_EQ("b", diff[1].first); feature_val3_t& b = diff[1].second; sort(b.begin(), b.end()); ASSERT_EQ(2u, b.size()); EXPECT_EQ("x", b[0].first); EXPECT_EQ(123, b[0].second.v1); EXPECT_EQ("z", b[1].first); EXPECT_EQ(456, b[1].second.v1); // update with the current diff s.set_average_and_clear_diff(diff); // update with average diff features3_t avg_diff; feature_val3_t a_diff; a_diff.push_back(make_pair("x", val3_t(2, 0, 0))); a_diff.push_back(make_pair("w", val3_t(4, 0, 0))); avg_diff.push_back(make_pair("a", a_diff)); feature_val3_t c_diff; c_diff.push_back(make_pair("x", val3_t(1, 0, 0))); avg_diff.push_back(make_pair("c", c_diff)); s.set_average_and_clear_diff(avg_diff); // now the feature vector is expected as below // a: x = 1 + 2 = 3 // y = 2 // z = 3 // w = 4 // b: x = 123 // z = 456 // c: x = 1 { feature_val1_t v; s.get("a", v); sort(v.begin(), v.end()); ASSERT_EQ(4u, v.size()); EXPECT_EQ("w", v[0].first); EXPECT_EQ(4, v[0].second); EXPECT_EQ("x", v[1].first); EXPECT_EQ(3, v[1].second); EXPECT_EQ("y", v[2].first); EXPECT_EQ(2, v[2].second); EXPECT_EQ("z", v[3].first); EXPECT_EQ(3, v[3].second); } { feature_val1_t v; s.get("b", v); sort(v.begin(), v.end()); ASSERT_EQ(2u, v.size()); EXPECT_EQ("x", v[0].first); EXPECT_EQ(123, v[0].second); EXPECT_EQ("z", v[1].first); EXPECT_EQ(456, v[1].second); } { feature_val1_t v; s.get("c", v); sort(v.begin(), v.end()); ASSERT_EQ(1u, v.size()); EXPECT_EQ("x", v[0].first); EXPECT_EQ(1, v[0].second); } { features3_t diff; s.get_diff(diff); ASSERT_EQ(0u, diff.size()); } }