| Index: third_party/protobuf/src/google/protobuf/unknown_field_set_unittest.cc
|
| ===================================================================
|
| --- third_party/protobuf/src/google/protobuf/unknown_field_set_unittest.cc (revision 216642)
|
| +++ third_party/protobuf/src/google/protobuf/unknown_field_set_unittest.cc (working copy)
|
| @@ -46,15 +46,13 @@
|
| #include <google/protobuf/stubs/common.h>
|
| #include <google/protobuf/testing/googletest.h>
|
| #include <gtest/gtest.h>
|
| -#include <google/protobuf/stubs/stl_util-inl.h>
|
| +#include <google/protobuf/stubs/stl_util.h>
|
|
|
| namespace google {
|
| namespace protobuf {
|
|
|
| using internal::WireFormat;
|
|
|
| -namespace {
|
| -
|
| class UnknownFieldSetTest : public testing::Test {
|
| protected:
|
| virtual void SetUp() {
|
| @@ -107,6 +105,8 @@
|
| UnknownFieldSet* unknown_fields_;
|
| };
|
|
|
| +namespace {
|
| +
|
| TEST_F(UnknownFieldSetTest, AllFieldsPresent) {
|
| // All fields of TestAllTypes should be present, in numeric order (because
|
| // that's the order we parsed them in). Fields that are not valid field
|
| @@ -297,12 +297,21 @@
|
| destination.DebugString());
|
| }
|
|
|
| +
|
| TEST_F(UnknownFieldSetTest, Clear) {
|
| // Clear the set.
|
| empty_message_.Clear();
|
| EXPECT_EQ(0, unknown_fields_->field_count());
|
| }
|
|
|
| +TEST_F(UnknownFieldSetTest, ClearAndFreeMemory) {
|
| + EXPECT_GT(unknown_fields_->field_count(), 0);
|
| + unknown_fields_->ClearAndFreeMemory();
|
| + EXPECT_EQ(0, unknown_fields_->field_count());
|
| + unknown_fields_->AddVarint(123456, 654321);
|
| + EXPECT_EQ(1, unknown_fields_->field_count());
|
| +}
|
| +
|
| TEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {
|
| // Test mixing known and unknown fields when parsing.
|
|
|
| @@ -498,6 +507,7 @@
|
| EXPECT_LT(base_size, empty_message.SpaceUsed());
|
| }
|
|
|
| +
|
| TEST_F(UnknownFieldSetTest, Empty) {
|
| UnknownFieldSet unknown_fields;
|
| EXPECT_TRUE(unknown_fields.empty());
|
| @@ -507,6 +517,78 @@
|
| EXPECT_TRUE(unknown_fields.empty());
|
| }
|
|
|
| +TEST_F(UnknownFieldSetTest, DeleteSubrange) {
|
| + // Exhaustively test the deletion of every possible subrange in arrays of all
|
| + // sizes from 0 through 9.
|
| + for (int size = 0; size < 10; ++size) {
|
| + for (int num = 0; num <= size; ++num) {
|
| + for (int start = 0; start < size - num; ++start) {
|
| + // Create a set with "size" fields.
|
| + UnknownFieldSet unknown;
|
| + for (int i = 0; i < size; ++i) {
|
| + unknown.AddFixed32(i, i);
|
| + }
|
| + // Delete the specified subrange.
|
| + unknown.DeleteSubrange(start, num);
|
| + // Make sure the resulting field values are still correct.
|
| + EXPECT_EQ(size - num, unknown.field_count());
|
| + for (int i = 0; i < unknown.field_count(); ++i) {
|
| + if (i < start) {
|
| + EXPECT_EQ(i, unknown.field(i).fixed32());
|
| + } else {
|
| + EXPECT_EQ(i + num, unknown.field(i).fixed32());
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +void CheckDeleteByNumber(const vector<int>& field_numbers, int deleted_number,
|
| + const vector<int>& expected_field_nubmers) {
|
| + UnknownFieldSet unknown_fields;
|
| + for (int i = 0; i < field_numbers.size(); ++i) {
|
| + unknown_fields.AddFixed32(field_numbers[i], i);
|
| + }
|
| + unknown_fields.DeleteByNumber(deleted_number);
|
| + ASSERT_EQ(expected_field_nubmers.size(), unknown_fields.field_count());
|
| + for (int i = 0; i < expected_field_nubmers.size(); ++i) {
|
| + EXPECT_EQ(expected_field_nubmers[i],
|
| + unknown_fields.field(i).number());
|
| + }
|
| +}
|
| +
|
| +#define MAKE_VECTOR(x) vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
|
| +TEST_F(UnknownFieldSetTest, DeleteByNumber) {
|
| + CheckDeleteByNumber(vector<int>(), 1, vector<int>());
|
| + static const int kTestFieldNumbers1[] = {1, 2, 3};
|
| + static const int kFieldNumberToDelete1 = 1;
|
| + static const int kExpectedFieldNumbers1[] = {2, 3};
|
| + CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers1), kFieldNumberToDelete1,
|
| + MAKE_VECTOR(kExpectedFieldNumbers1));
|
| + static const int kTestFieldNumbers2[] = {1, 2, 3};
|
| + static const int kFieldNumberToDelete2 = 2;
|
| + static const int kExpectedFieldNumbers2[] = {1, 3};
|
| + CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers2), kFieldNumberToDelete2,
|
| + MAKE_VECTOR(kExpectedFieldNumbers2));
|
| + static const int kTestFieldNumbers3[] = {1, 2, 3};
|
| + static const int kFieldNumberToDelete3 = 3;
|
| + static const int kExpectedFieldNumbers3[] = {1, 2};
|
| + CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers3), kFieldNumberToDelete3,
|
| + MAKE_VECTOR(kExpectedFieldNumbers3));
|
| + static const int kTestFieldNumbers4[] = {1, 2, 1, 4, 1};
|
| + static const int kFieldNumberToDelete4 = 1;
|
| + static const int kExpectedFieldNumbers4[] = {2, 4};
|
| + CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers4), kFieldNumberToDelete4,
|
| + MAKE_VECTOR(kExpectedFieldNumbers4));
|
| + static const int kTestFieldNumbers5[] = {1, 2, 3, 4, 5};
|
| + static const int kFieldNumberToDelete5 = 6;
|
| + static const int kExpectedFieldNumbers5[] = {1, 2, 3, 4, 5};
|
| + CheckDeleteByNumber(MAKE_VECTOR(kTestFieldNumbers5), kFieldNumberToDelete5,
|
| + MAKE_VECTOR(kExpectedFieldNumbers5));
|
| +}
|
| +#undef MAKE_VECTOR
|
| } // namespace
|
| +
|
| } // namespace protobuf
|
| } // namespace google
|
|
|