| Index: blimp/net/delta_encoding_unittest.cc
|
| diff --git a/blimp/net/delta_encoding_unittest.cc b/blimp/net/delta_encoding_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c3a73d2f51955d520440accf49c8b09a9ac675e9
|
| --- /dev/null
|
| +++ b/blimp/net/delta_encoding_unittest.cc
|
| @@ -0,0 +1,155 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "blimp/net/delta_encoding.h"
|
| +
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using testing::ElementsAre;
|
| +
|
| +namespace blimp {
|
| +namespace {
|
| +
|
| +// Provides an example of field elision across structs.
|
| +// For each CompoundStruct element in a sequence:
|
| +// |str| overrides the previous element's |str|, if set.
|
| +// |str| inherits the previous element's |str|, if empty.
|
| +// |number| is computed as a delta from the previous element's |number|.
|
| +struct CompoundStruct {
|
| + static CompoundStruct Difference(const CompoundStruct& lhs,
|
| + const CompoundStruct& rhs) {
|
| + CompoundStruct output;
|
| + output.number = lhs.number - rhs.number;
|
| + if (lhs.str != rhs.str) {
|
| + output.str = lhs.str;
|
| + }
|
| + return output;
|
| + }
|
| +
|
| + static CompoundStruct Merge(const CompoundStruct& lhs,
|
| + const CompoundStruct& rhs) {
|
| + CompoundStruct output;
|
| + output.number = lhs.number + rhs.number;
|
| + output.str = (rhs.str.empty() ? lhs.str : rhs.str);
|
| + return output;
|
| + }
|
| +
|
| + // Sortable by |number|.
|
| + friend bool operator<(const CompoundStruct& lhs, const CompoundStruct& rhs) {
|
| + return lhs.number < rhs.number;
|
| + }
|
| +
|
| + int number;
|
| + std::string str;
|
| +};
|
| +
|
| +class TestDeltaEncoding : public testing::Test {
|
| + public:
|
| + TestDeltaEncoding() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(TestDeltaEncoding);
|
| +};
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaEncode) {
|
| + std::vector<int> test{5, 1, 3};
|
| + DeltaEncode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(5, -4, 2));
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaEncodeEmpty) {
|
| + std::vector<int> test;
|
| + DeltaEncode(test.begin(), test.end());
|
| + EXPECT_TRUE(test.empty());
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaEncodeSingleValue) {
|
| + std::vector<int> test;
|
| + test.push_back(1);
|
| + DeltaEncode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(1));
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaDecode) {
|
| + std::vector<int> test{1, 1, 2};
|
| + DeltaDecode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(1, 2, 4));
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaDecodeEmpty) {
|
| + std::vector<int> test;
|
| + DeltaDecode(test.begin(), test.end());
|
| + EXPECT_TRUE(test.empty());
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaDecodeSingleValue) {
|
| + std::vector<int> test{1};
|
| + DeltaEncode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(1));
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, SortAndDeltaEncodeRoundTrip) {
|
| + std::vector<int> test{8, 3, 5};
|
| + SortAndDeltaEncode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(3, 2, 3));
|
| + DeltaDecode(test.begin(), test.end());
|
| + EXPECT_THAT(test, ElementsAre(3, 5, 8));
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaEncodeStruct) {
|
| + std::vector<CompoundStruct> test{{2, "foo"}, {3, "foo"}, {0, "bar"}};
|
| + DeltaEncode(test.begin(), test.end(), &CompoundStruct::Difference);
|
| +
|
| + EXPECT_EQ(2, test[0].number);
|
| + EXPECT_EQ(1, test[1].number);
|
| + EXPECT_EQ(-3, test[2].number);
|
| +
|
| + EXPECT_EQ("foo", test[0].str);
|
| + EXPECT_EQ("", test[1].str);
|
| + EXPECT_EQ("bar", test[2].str);
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, DeltaDecodeStruct) {
|
| + std::vector<CompoundStruct> test{{2, "foo"}, {-1, ""}, {0, "bar"}};
|
| + DeltaDecode(test.begin(), test.end(), &CompoundStruct::Merge);
|
| +
|
| + EXPECT_EQ(2, test[0].number);
|
| + EXPECT_EQ(1, test[1].number);
|
| + EXPECT_EQ(1, test[2].number);
|
| +
|
| + EXPECT_EQ("foo", test[0].str);
|
| + EXPECT_EQ("foo", test[1].str);
|
| + EXPECT_EQ("bar", test[2].str);
|
| +}
|
| +
|
| +TEST_F(TestDeltaEncoding, SortAndDeltaEncodeStructRoundTrip) {
|
| + std::vector<CompoundStruct> test{{2, "foo"}, {3, "foo"}, {0, "bar"}};
|
| + SortAndDeltaEncode(test.begin(), test.end(), &CompoundStruct::Difference);
|
| +
|
| + EXPECT_EQ(0, test[0].number);
|
| + EXPECT_EQ(2, test[1].number);
|
| + EXPECT_EQ(1, test[2].number);
|
| +
|
| + EXPECT_EQ("bar", test[0].str);
|
| + EXPECT_EQ("foo", test[1].str);
|
| + EXPECT_EQ("", test[2].str);
|
| +
|
| + DeltaDecode(test.begin(), test.end(), &CompoundStruct::Merge);
|
| + EXPECT_EQ(0, test[0].number);
|
| + EXPECT_EQ(2, test[1].number);
|
| + EXPECT_EQ(3, test[2].number);
|
| +
|
| + EXPECT_EQ("bar", test[0].str);
|
| + EXPECT_EQ("foo", test[1].str);
|
| + EXPECT_EQ("foo", test[2].str);
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace blimp
|
|
|