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 |