Home | History | Annotate | Download | only in protobuf
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 // Author: kenton (at) google.com (Kenton Varda)
     32 //  Based on original Protocol Buffers design by
     33 //  Sanjay Ghemawat, Jeff Dean, and others.
     34 
     35 #ifdef _WIN32
     36 // Verify that #including windows.h does not break anything (e.g. because
     37 // windows.h #defines GetMessage() as a macro).
     38 #include <windows.h>
     39 #endif
     40 
     41 #include <google/protobuf/test_util.h>
     42 #include <google/protobuf/descriptor.h>
     43 #include <google/protobuf/message.h>
     44 
     45 #include <google/protobuf/stubs/common.h>
     46 #include <google/protobuf/testing/googletest.h>
     47 #include <gtest/gtest.h>
     48 
     49 namespace google {
     50 namespace protobuf {
     51 
     52 void TestUtil::SetAllFields(unittest::TestAllTypes* message) {
     53   SetOptionalFields(message);
     54   AddRepeatedFields1(message);
     55   AddRepeatedFields2(message);
     56   SetDefaultFields(message);
     57   SetOneofFields(message);
     58 }
     59 
     60 void TestUtil::SetOptionalFields(unittest::TestAllTypes* message) {
     61   message->set_optional_int32   (101);
     62   message->set_optional_int64   (102);
     63   message->set_optional_uint32  (103);
     64   message->set_optional_uint64  (104);
     65   message->set_optional_sint32  (105);
     66   message->set_optional_sint64  (106);
     67   message->set_optional_fixed32 (107);
     68   message->set_optional_fixed64 (108);
     69   message->set_optional_sfixed32(109);
     70   message->set_optional_sfixed64(110);
     71   message->set_optional_float   (111);
     72   message->set_optional_double  (112);
     73   message->set_optional_bool    (true);
     74   message->set_optional_string  ("115");
     75   message->set_optional_bytes   ("116");
     76 
     77   message->mutable_optionalgroup                 ()->set_a(117);
     78   message->mutable_optional_nested_message       ()->set_bb(118);
     79   message->mutable_optional_foreign_message      ()->set_c(119);
     80   message->mutable_optional_import_message       ()->set_d(120);
     81   message->mutable_optional_public_import_message()->set_e(126);
     82   message->mutable_optional_lazy_message         ()->set_bb(127);
     83 
     84   message->set_optional_nested_enum (unittest::TestAllTypes::BAZ);
     85   message->set_optional_foreign_enum(unittest::FOREIGN_BAZ      );
     86   message->set_optional_import_enum (unittest_import::IMPORT_BAZ);
     87 
     88   // StringPiece and Cord fields are only accessible via reflection in the
     89   // open source release; see comments in compiler/cpp/string_field.cc.
     90 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
     91   message->GetReflection()->SetString(
     92     message,
     93     message->GetDescriptor()->FindFieldByName("optional_string_piece"),
     94     "124");
     95   message->GetReflection()->SetString(
     96     message,
     97     message->GetDescriptor()->FindFieldByName("optional_cord"),
     98     "125");
     99 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    100 }
    101 
    102 // -------------------------------------------------------------------
    103 
    104 void TestUtil::AddRepeatedFields1(unittest::TestAllTypes* message) {
    105   message->add_repeated_int32   (201);
    106   message->add_repeated_int64   (202);
    107   message->add_repeated_uint32  (203);
    108   message->add_repeated_uint64  (204);
    109   message->add_repeated_sint32  (205);
    110   message->add_repeated_sint64  (206);
    111   message->add_repeated_fixed32 (207);
    112   message->add_repeated_fixed64 (208);
    113   message->add_repeated_sfixed32(209);
    114   message->add_repeated_sfixed64(210);
    115   message->add_repeated_float   (211);
    116   message->add_repeated_double  (212);
    117   message->add_repeated_bool    (true);
    118   message->add_repeated_string  ("215");
    119   message->add_repeated_bytes   ("216");
    120 
    121   message->add_repeatedgroup           ()->set_a(217);
    122   message->add_repeated_nested_message ()->set_bb(218);
    123   message->add_repeated_foreign_message()->set_c(219);
    124   message->add_repeated_import_message ()->set_d(220);
    125   message->add_repeated_lazy_message   ()->set_bb(227);
    126 
    127   message->add_repeated_nested_enum (unittest::TestAllTypes::BAR);
    128   message->add_repeated_foreign_enum(unittest::FOREIGN_BAR      );
    129   message->add_repeated_import_enum (unittest_import::IMPORT_BAR);
    130 
    131 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    132   message->GetReflection()->AddString(
    133     message,
    134     message->GetDescriptor()->FindFieldByName("repeated_string_piece"),
    135     "224");
    136   message->GetReflection()->AddString(
    137     message,
    138     message->GetDescriptor()->FindFieldByName("repeated_cord"),
    139     "225");
    140 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    141 }
    142 
    143 void TestUtil::AddRepeatedFields2(unittest::TestAllTypes* message) {
    144   // Add a second one of each field.
    145   message->add_repeated_int32   (301);
    146   message->add_repeated_int64   (302);
    147   message->add_repeated_uint32  (303);
    148   message->add_repeated_uint64  (304);
    149   message->add_repeated_sint32  (305);
    150   message->add_repeated_sint64  (306);
    151   message->add_repeated_fixed32 (307);
    152   message->add_repeated_fixed64 (308);
    153   message->add_repeated_sfixed32(309);
    154   message->add_repeated_sfixed64(310);
    155   message->add_repeated_float   (311);
    156   message->add_repeated_double  (312);
    157   message->add_repeated_bool    (false);
    158   message->add_repeated_string  ("315");
    159   message->add_repeated_bytes   ("316");
    160 
    161   message->add_repeatedgroup           ()->set_a(317);
    162   message->add_repeated_nested_message ()->set_bb(318);
    163   message->add_repeated_foreign_message()->set_c(319);
    164   message->add_repeated_import_message ()->set_d(320);
    165   message->add_repeated_lazy_message   ()->set_bb(327);
    166 
    167   message->add_repeated_nested_enum (unittest::TestAllTypes::BAZ);
    168   message->add_repeated_foreign_enum(unittest::FOREIGN_BAZ      );
    169   message->add_repeated_import_enum (unittest_import::IMPORT_BAZ);
    170 
    171 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    172   message->GetReflection()->AddString(
    173     message,
    174     message->GetDescriptor()->FindFieldByName("repeated_string_piece"),
    175     "324");
    176   message->GetReflection()->AddString(
    177     message,
    178     message->GetDescriptor()->FindFieldByName("repeated_cord"),
    179     "325");
    180 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    181 }
    182 
    183 // -------------------------------------------------------------------
    184 
    185 void TestUtil::SetDefaultFields(unittest::TestAllTypes* message) {
    186   message->set_default_int32   (401);
    187   message->set_default_int64   (402);
    188   message->set_default_uint32  (403);
    189   message->set_default_uint64  (404);
    190   message->set_default_sint32  (405);
    191   message->set_default_sint64  (406);
    192   message->set_default_fixed32 (407);
    193   message->set_default_fixed64 (408);
    194   message->set_default_sfixed32(409);
    195   message->set_default_sfixed64(410);
    196   message->set_default_float   (411);
    197   message->set_default_double  (412);
    198   message->set_default_bool    (false);
    199   message->set_default_string  ("415");
    200   message->set_default_bytes   ("416");
    201 
    202   message->set_default_nested_enum (unittest::TestAllTypes::FOO);
    203   message->set_default_foreign_enum(unittest::FOREIGN_FOO      );
    204   message->set_default_import_enum (unittest_import::IMPORT_FOO);
    205 
    206 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    207   message->GetReflection()->SetString(
    208     message,
    209     message->GetDescriptor()->FindFieldByName("default_string_piece"),
    210     "424");
    211   message->GetReflection()->SetString(
    212     message,
    213     message->GetDescriptor()->FindFieldByName("default_cord"),
    214     "425");
    215 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    216 }
    217 
    218 // -------------------------------------------------------------------
    219 
    220 void TestUtil::ModifyRepeatedFields(unittest::TestAllTypes* message) {
    221   message->set_repeated_int32   (1, 501);
    222   message->set_repeated_int64   (1, 502);
    223   message->set_repeated_uint32  (1, 503);
    224   message->set_repeated_uint64  (1, 504);
    225   message->set_repeated_sint32  (1, 505);
    226   message->set_repeated_sint64  (1, 506);
    227   message->set_repeated_fixed32 (1, 507);
    228   message->set_repeated_fixed64 (1, 508);
    229   message->set_repeated_sfixed32(1, 509);
    230   message->set_repeated_sfixed64(1, 510);
    231   message->set_repeated_float   (1, 511);
    232   message->set_repeated_double  (1, 512);
    233   message->set_repeated_bool    (1, true);
    234   message->set_repeated_string  (1, "515");
    235   message->set_repeated_bytes   (1, "516");
    236 
    237   message->mutable_repeatedgroup           (1)->set_a(517);
    238   message->mutable_repeated_nested_message (1)->set_bb(518);
    239   message->mutable_repeated_foreign_message(1)->set_c(519);
    240   message->mutable_repeated_import_message (1)->set_d(520);
    241   message->mutable_repeated_lazy_message   (1)->set_bb(527);
    242 
    243   message->set_repeated_nested_enum (1, unittest::TestAllTypes::FOO);
    244   message->set_repeated_foreign_enum(1, unittest::FOREIGN_FOO      );
    245   message->set_repeated_import_enum (1, unittest_import::IMPORT_FOO);
    246 
    247 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    248   message->GetReflection()->SetRepeatedString(
    249     message,
    250     message->GetDescriptor()->FindFieldByName("repeated_string_piece"),
    251     1, "524");
    252   message->GetReflection()->SetRepeatedString(
    253     message,
    254     message->GetDescriptor()->FindFieldByName("repeated_cord"),
    255     1, "525");
    256 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    257 }
    258 
    259 // ------------------------------------------------------------------
    260 void TestUtil::SetOneofFields(unittest::TestAllTypes* message) {
    261   message->set_oneof_uint32(601);
    262   message->mutable_oneof_nested_message()->set_bb(602);
    263   message->set_oneof_string("603");
    264   message->set_oneof_bytes("604");
    265 }
    266 
    267 // -------------------------------------------------------------------
    268 
    269 void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {
    270   EXPECT_TRUE(message.has_optional_int32   ());
    271   EXPECT_TRUE(message.has_optional_int64   ());
    272   EXPECT_TRUE(message.has_optional_uint32  ());
    273   EXPECT_TRUE(message.has_optional_uint64  ());
    274   EXPECT_TRUE(message.has_optional_sint32  ());
    275   EXPECT_TRUE(message.has_optional_sint64  ());
    276   EXPECT_TRUE(message.has_optional_fixed32 ());
    277   EXPECT_TRUE(message.has_optional_fixed64 ());
    278   EXPECT_TRUE(message.has_optional_sfixed32());
    279   EXPECT_TRUE(message.has_optional_sfixed64());
    280   EXPECT_TRUE(message.has_optional_float   ());
    281   EXPECT_TRUE(message.has_optional_double  ());
    282   EXPECT_TRUE(message.has_optional_bool    ());
    283   EXPECT_TRUE(message.has_optional_string  ());
    284   EXPECT_TRUE(message.has_optional_bytes   ());
    285 
    286   EXPECT_TRUE(message.has_optionalgroup                 ());
    287   EXPECT_TRUE(message.has_optional_nested_message       ());
    288   EXPECT_TRUE(message.has_optional_foreign_message      ());
    289   EXPECT_TRUE(message.has_optional_import_message       ());
    290   EXPECT_TRUE(message.has_optional_public_import_message());
    291   EXPECT_TRUE(message.has_optional_lazy_message         ());
    292 
    293   EXPECT_TRUE(message.optionalgroup                 ().has_a());
    294   EXPECT_TRUE(message.optional_nested_message       ().has_bb());
    295   EXPECT_TRUE(message.optional_foreign_message      ().has_c());
    296   EXPECT_TRUE(message.optional_import_message       ().has_d());
    297   EXPECT_TRUE(message.optional_public_import_message().has_e());
    298   EXPECT_TRUE(message.optional_lazy_message         ().has_bb());
    299 
    300   EXPECT_TRUE(message.has_optional_nested_enum ());
    301   EXPECT_TRUE(message.has_optional_foreign_enum());
    302   EXPECT_TRUE(message.has_optional_import_enum ());
    303 
    304 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    305   EXPECT_TRUE(message.has_optional_string_piece());
    306   EXPECT_TRUE(message.has_optional_cord());
    307 #endif
    308 
    309   EXPECT_EQ(101  , message.optional_int32   ());
    310   EXPECT_EQ(102  , message.optional_int64   ());
    311   EXPECT_EQ(103  , message.optional_uint32  ());
    312   EXPECT_EQ(104  , message.optional_uint64  ());
    313   EXPECT_EQ(105  , message.optional_sint32  ());
    314   EXPECT_EQ(106  , message.optional_sint64  ());
    315   EXPECT_EQ(107  , message.optional_fixed32 ());
    316   EXPECT_EQ(108  , message.optional_fixed64 ());
    317   EXPECT_EQ(109  , message.optional_sfixed32());
    318   EXPECT_EQ(110  , message.optional_sfixed64());
    319   EXPECT_EQ(111  , message.optional_float   ());
    320   EXPECT_EQ(112  , message.optional_double  ());
    321   EXPECT_TRUE(     message.optional_bool    ());
    322   EXPECT_EQ("115", message.optional_string  ());
    323   EXPECT_EQ("116", message.optional_bytes   ());
    324 
    325   EXPECT_EQ(117, message.optionalgroup                  ().a());
    326   EXPECT_EQ(118, message.optional_nested_message        ().bb());
    327   EXPECT_EQ(119, message.optional_foreign_message       ().c());
    328   EXPECT_EQ(120, message.optional_import_message        ().d());
    329   EXPECT_EQ(126, message.optional_public_import_message ().e());
    330   EXPECT_EQ(127, message.optional_lazy_message          ().bb());
    331 
    332   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.optional_nested_enum ());
    333   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.optional_foreign_enum());
    334   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.optional_import_enum ());
    335 
    336 
    337   // -----------------------------------------------------------------
    338 
    339   ASSERT_EQ(2, message.repeated_int32_size   ());
    340   ASSERT_EQ(2, message.repeated_int64_size   ());
    341   ASSERT_EQ(2, message.repeated_uint32_size  ());
    342   ASSERT_EQ(2, message.repeated_uint64_size  ());
    343   ASSERT_EQ(2, message.repeated_sint32_size  ());
    344   ASSERT_EQ(2, message.repeated_sint64_size  ());
    345   ASSERT_EQ(2, message.repeated_fixed32_size ());
    346   ASSERT_EQ(2, message.repeated_fixed64_size ());
    347   ASSERT_EQ(2, message.repeated_sfixed32_size());
    348   ASSERT_EQ(2, message.repeated_sfixed64_size());
    349   ASSERT_EQ(2, message.repeated_float_size   ());
    350   ASSERT_EQ(2, message.repeated_double_size  ());
    351   ASSERT_EQ(2, message.repeated_bool_size    ());
    352   ASSERT_EQ(2, message.repeated_string_size  ());
    353   ASSERT_EQ(2, message.repeated_bytes_size   ());
    354 
    355   ASSERT_EQ(2, message.repeatedgroup_size           ());
    356   ASSERT_EQ(2, message.repeated_nested_message_size ());
    357   ASSERT_EQ(2, message.repeated_foreign_message_size());
    358   ASSERT_EQ(2, message.repeated_import_message_size ());
    359   ASSERT_EQ(2, message.repeated_lazy_message_size   ());
    360   ASSERT_EQ(2, message.repeated_nested_enum_size    ());
    361   ASSERT_EQ(2, message.repeated_foreign_enum_size   ());
    362   ASSERT_EQ(2, message.repeated_import_enum_size    ());
    363 
    364 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    365   ASSERT_EQ(2, message.repeated_string_piece_size());
    366   ASSERT_EQ(2, message.repeated_cord_size());
    367 #endif
    368 
    369   EXPECT_EQ(201  , message.repeated_int32   (0));
    370   EXPECT_EQ(202  , message.repeated_int64   (0));
    371   EXPECT_EQ(203  , message.repeated_uint32  (0));
    372   EXPECT_EQ(204  , message.repeated_uint64  (0));
    373   EXPECT_EQ(205  , message.repeated_sint32  (0));
    374   EXPECT_EQ(206  , message.repeated_sint64  (0));
    375   EXPECT_EQ(207  , message.repeated_fixed32 (0));
    376   EXPECT_EQ(208  , message.repeated_fixed64 (0));
    377   EXPECT_EQ(209  , message.repeated_sfixed32(0));
    378   EXPECT_EQ(210  , message.repeated_sfixed64(0));
    379   EXPECT_EQ(211  , message.repeated_float   (0));
    380   EXPECT_EQ(212  , message.repeated_double  (0));
    381   EXPECT_TRUE(     message.repeated_bool    (0));
    382   EXPECT_EQ("215", message.repeated_string  (0));
    383   EXPECT_EQ("216", message.repeated_bytes   (0));
    384 
    385   EXPECT_EQ(217, message.repeatedgroup           (0).a());
    386   EXPECT_EQ(218, message.repeated_nested_message (0).bb());
    387   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
    388   EXPECT_EQ(220, message.repeated_import_message (0).d());
    389   EXPECT_EQ(227, message.repeated_lazy_message   (0).bb());
    390 
    391 
    392   EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));
    393   EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));
    394   EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));
    395 
    396   EXPECT_EQ(301  , message.repeated_int32   (1));
    397   EXPECT_EQ(302  , message.repeated_int64   (1));
    398   EXPECT_EQ(303  , message.repeated_uint32  (1));
    399   EXPECT_EQ(304  , message.repeated_uint64  (1));
    400   EXPECT_EQ(305  , message.repeated_sint32  (1));
    401   EXPECT_EQ(306  , message.repeated_sint64  (1));
    402   EXPECT_EQ(307  , message.repeated_fixed32 (1));
    403   EXPECT_EQ(308  , message.repeated_fixed64 (1));
    404   EXPECT_EQ(309  , message.repeated_sfixed32(1));
    405   EXPECT_EQ(310  , message.repeated_sfixed64(1));
    406   EXPECT_EQ(311  , message.repeated_float   (1));
    407   EXPECT_EQ(312  , message.repeated_double  (1));
    408   EXPECT_FALSE(    message.repeated_bool    (1));
    409   EXPECT_EQ("315", message.repeated_string  (1));
    410   EXPECT_EQ("316", message.repeated_bytes   (1));
    411 
    412   EXPECT_EQ(317, message.repeatedgroup           (1).a());
    413   EXPECT_EQ(318, message.repeated_nested_message (1).bb());
    414   EXPECT_EQ(319, message.repeated_foreign_message(1).c());
    415   EXPECT_EQ(320, message.repeated_import_message (1).d());
    416   EXPECT_EQ(327, message.repeated_lazy_message   (1).bb());
    417 
    418   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (1));
    419   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.repeated_foreign_enum(1));
    420   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (1));
    421 
    422 
    423   // -----------------------------------------------------------------
    424 
    425   EXPECT_TRUE(message.has_default_int32   ());
    426   EXPECT_TRUE(message.has_default_int64   ());
    427   EXPECT_TRUE(message.has_default_uint32  ());
    428   EXPECT_TRUE(message.has_default_uint64  ());
    429   EXPECT_TRUE(message.has_default_sint32  ());
    430   EXPECT_TRUE(message.has_default_sint64  ());
    431   EXPECT_TRUE(message.has_default_fixed32 ());
    432   EXPECT_TRUE(message.has_default_fixed64 ());
    433   EXPECT_TRUE(message.has_default_sfixed32());
    434   EXPECT_TRUE(message.has_default_sfixed64());
    435   EXPECT_TRUE(message.has_default_float   ());
    436   EXPECT_TRUE(message.has_default_double  ());
    437   EXPECT_TRUE(message.has_default_bool    ());
    438   EXPECT_TRUE(message.has_default_string  ());
    439   EXPECT_TRUE(message.has_default_bytes   ());
    440 
    441   EXPECT_TRUE(message.has_default_nested_enum ());
    442   EXPECT_TRUE(message.has_default_foreign_enum());
    443   EXPECT_TRUE(message.has_default_import_enum ());
    444 
    445 
    446   EXPECT_EQ(401  , message.default_int32   ());
    447   EXPECT_EQ(402  , message.default_int64   ());
    448   EXPECT_EQ(403  , message.default_uint32  ());
    449   EXPECT_EQ(404  , message.default_uint64  ());
    450   EXPECT_EQ(405  , message.default_sint32  ());
    451   EXPECT_EQ(406  , message.default_sint64  ());
    452   EXPECT_EQ(407  , message.default_fixed32 ());
    453   EXPECT_EQ(408  , message.default_fixed64 ());
    454   EXPECT_EQ(409  , message.default_sfixed32());
    455   EXPECT_EQ(410  , message.default_sfixed64());
    456   EXPECT_EQ(411  , message.default_float   ());
    457   EXPECT_EQ(412  , message.default_double  ());
    458   EXPECT_FALSE(    message.default_bool    ());
    459   EXPECT_EQ("415", message.default_string  ());
    460   EXPECT_EQ("416", message.default_bytes   ());
    461 
    462   EXPECT_EQ(unittest::TestAllTypes::FOO, message.default_nested_enum ());
    463   EXPECT_EQ(unittest::FOREIGN_FOO      , message.default_foreign_enum());
    464   EXPECT_EQ(unittest_import::IMPORT_FOO, message.default_import_enum ());
    465 
    466 
    467   EXPECT_FALSE(message.has_oneof_uint32        ());
    468   EXPECT_FALSE(message.has_oneof_nested_message());
    469   EXPECT_FALSE(message.has_oneof_string        ());
    470   EXPECT_TRUE(message.has_oneof_bytes          ());
    471 
    472   EXPECT_EQ("604", message.oneof_bytes());
    473 }
    474 
    475 // -------------------------------------------------------------------
    476 
    477 void TestUtil::ExpectClear(const unittest::TestAllTypes& message) {
    478   // has_blah() should initially be false for all optional fields.
    479   EXPECT_FALSE(message.has_optional_int32   ());
    480   EXPECT_FALSE(message.has_optional_int64   ());
    481   EXPECT_FALSE(message.has_optional_uint32  ());
    482   EXPECT_FALSE(message.has_optional_uint64  ());
    483   EXPECT_FALSE(message.has_optional_sint32  ());
    484   EXPECT_FALSE(message.has_optional_sint64  ());
    485   EXPECT_FALSE(message.has_optional_fixed32 ());
    486   EXPECT_FALSE(message.has_optional_fixed64 ());
    487   EXPECT_FALSE(message.has_optional_sfixed32());
    488   EXPECT_FALSE(message.has_optional_sfixed64());
    489   EXPECT_FALSE(message.has_optional_float   ());
    490   EXPECT_FALSE(message.has_optional_double  ());
    491   EXPECT_FALSE(message.has_optional_bool    ());
    492   EXPECT_FALSE(message.has_optional_string  ());
    493   EXPECT_FALSE(message.has_optional_bytes   ());
    494 
    495   EXPECT_FALSE(message.has_optionalgroup                 ());
    496   EXPECT_FALSE(message.has_optional_nested_message       ());
    497   EXPECT_FALSE(message.has_optional_foreign_message      ());
    498   EXPECT_FALSE(message.has_optional_import_message       ());
    499   EXPECT_FALSE(message.has_optional_public_import_message());
    500   EXPECT_FALSE(message.has_optional_lazy_message         ());
    501 
    502   EXPECT_FALSE(message.has_optional_nested_enum ());
    503   EXPECT_FALSE(message.has_optional_foreign_enum());
    504   EXPECT_FALSE(message.has_optional_import_enum ());
    505 
    506   EXPECT_FALSE(message.has_optional_string_piece());
    507   EXPECT_FALSE(message.has_optional_cord());
    508 
    509   // Optional fields without defaults are set to zero or something like it.
    510   EXPECT_EQ(0    , message.optional_int32   ());
    511   EXPECT_EQ(0    , message.optional_int64   ());
    512   EXPECT_EQ(0    , message.optional_uint32  ());
    513   EXPECT_EQ(0    , message.optional_uint64  ());
    514   EXPECT_EQ(0    , message.optional_sint32  ());
    515   EXPECT_EQ(0    , message.optional_sint64  ());
    516   EXPECT_EQ(0    , message.optional_fixed32 ());
    517   EXPECT_EQ(0    , message.optional_fixed64 ());
    518   EXPECT_EQ(0    , message.optional_sfixed32());
    519   EXPECT_EQ(0    , message.optional_sfixed64());
    520   EXPECT_EQ(0    , message.optional_float   ());
    521   EXPECT_EQ(0    , message.optional_double  ());
    522   EXPECT_FALSE(    message.optional_bool    ());
    523   EXPECT_EQ(""   , message.optional_string  ());
    524   EXPECT_EQ(""   , message.optional_bytes   ());
    525 
    526   // Embedded messages should also be clear.
    527   EXPECT_FALSE(message.optionalgroup                 ().has_a());
    528   EXPECT_FALSE(message.optional_nested_message       ().has_bb());
    529   EXPECT_FALSE(message.optional_foreign_message      ().has_c());
    530   EXPECT_FALSE(message.optional_import_message       ().has_d());
    531   EXPECT_FALSE(message.optional_public_import_message().has_e());
    532   EXPECT_FALSE(message.optional_lazy_message         ().has_bb());
    533 
    534   EXPECT_EQ(0, message.optionalgroup                 ().a());
    535   EXPECT_EQ(0, message.optional_nested_message       ().bb());
    536   EXPECT_EQ(0, message.optional_foreign_message      ().c());
    537   EXPECT_EQ(0, message.optional_import_message       ().d());
    538   EXPECT_EQ(0, message.optional_public_import_message().e());
    539   EXPECT_EQ(0, message.optional_lazy_message         ().bb());
    540 
    541   // Enums without defaults are set to the first value in the enum.
    542   EXPECT_EQ(unittest::TestAllTypes::FOO, message.optional_nested_enum ());
    543   EXPECT_EQ(unittest::FOREIGN_FOO      , message.optional_foreign_enum());
    544   EXPECT_EQ(unittest_import::IMPORT_FOO, message.optional_import_enum ());
    545 
    546 
    547   // Repeated fields are empty.
    548   EXPECT_EQ(0, message.repeated_int32_size   ());
    549   EXPECT_EQ(0, message.repeated_int64_size   ());
    550   EXPECT_EQ(0, message.repeated_uint32_size  ());
    551   EXPECT_EQ(0, message.repeated_uint64_size  ());
    552   EXPECT_EQ(0, message.repeated_sint32_size  ());
    553   EXPECT_EQ(0, message.repeated_sint64_size  ());
    554   EXPECT_EQ(0, message.repeated_fixed32_size ());
    555   EXPECT_EQ(0, message.repeated_fixed64_size ());
    556   EXPECT_EQ(0, message.repeated_sfixed32_size());
    557   EXPECT_EQ(0, message.repeated_sfixed64_size());
    558   EXPECT_EQ(0, message.repeated_float_size   ());
    559   EXPECT_EQ(0, message.repeated_double_size  ());
    560   EXPECT_EQ(0, message.repeated_bool_size    ());
    561   EXPECT_EQ(0, message.repeated_string_size  ());
    562   EXPECT_EQ(0, message.repeated_bytes_size   ());
    563 
    564   EXPECT_EQ(0, message.repeatedgroup_size           ());
    565   EXPECT_EQ(0, message.repeated_nested_message_size ());
    566   EXPECT_EQ(0, message.repeated_foreign_message_size());
    567   EXPECT_EQ(0, message.repeated_import_message_size ());
    568   EXPECT_EQ(0, message.repeated_lazy_message_size   ());
    569   EXPECT_EQ(0, message.repeated_nested_enum_size    ());
    570   EXPECT_EQ(0, message.repeated_foreign_enum_size   ());
    571   EXPECT_EQ(0, message.repeated_import_enum_size    ());
    572 
    573   EXPECT_EQ(0, message.repeated_string_piece_size());
    574   EXPECT_EQ(0, message.repeated_cord_size());
    575 
    576   // has_blah() should also be false for all default fields.
    577   EXPECT_FALSE(message.has_default_int32   ());
    578   EXPECT_FALSE(message.has_default_int64   ());
    579   EXPECT_FALSE(message.has_default_uint32  ());
    580   EXPECT_FALSE(message.has_default_uint64  ());
    581   EXPECT_FALSE(message.has_default_sint32  ());
    582   EXPECT_FALSE(message.has_default_sint64  ());
    583   EXPECT_FALSE(message.has_default_fixed32 ());
    584   EXPECT_FALSE(message.has_default_fixed64 ());
    585   EXPECT_FALSE(message.has_default_sfixed32());
    586   EXPECT_FALSE(message.has_default_sfixed64());
    587   EXPECT_FALSE(message.has_default_float   ());
    588   EXPECT_FALSE(message.has_default_double  ());
    589   EXPECT_FALSE(message.has_default_bool    ());
    590   EXPECT_FALSE(message.has_default_string  ());
    591   EXPECT_FALSE(message.has_default_bytes   ());
    592 
    593   EXPECT_FALSE(message.has_default_nested_enum ());
    594   EXPECT_FALSE(message.has_default_foreign_enum());
    595   EXPECT_FALSE(message.has_default_import_enum ());
    596 
    597 
    598   // Fields with defaults have their default values (duh).
    599   EXPECT_EQ( 41    , message.default_int32   ());
    600   EXPECT_EQ( 42    , message.default_int64   ());
    601   EXPECT_EQ( 43    , message.default_uint32  ());
    602   EXPECT_EQ( 44    , message.default_uint64  ());
    603   EXPECT_EQ(-45    , message.default_sint32  ());
    604   EXPECT_EQ( 46    , message.default_sint64  ());
    605   EXPECT_EQ( 47    , message.default_fixed32 ());
    606   EXPECT_EQ( 48    , message.default_fixed64 ());
    607   EXPECT_EQ( 49    , message.default_sfixed32());
    608   EXPECT_EQ(-50    , message.default_sfixed64());
    609   EXPECT_EQ( 51.5  , message.default_float   ());
    610   EXPECT_EQ( 52e3  , message.default_double  ());
    611   EXPECT_TRUE(       message.default_bool    ());
    612   EXPECT_EQ("hello", message.default_string  ());
    613   EXPECT_EQ("world", message.default_bytes   ());
    614 
    615   EXPECT_EQ(unittest::TestAllTypes::BAR, message.default_nested_enum ());
    616   EXPECT_EQ(unittest::FOREIGN_BAR      , message.default_foreign_enum());
    617   EXPECT_EQ(unittest_import::IMPORT_BAR, message.default_import_enum ());
    618 
    619 
    620   EXPECT_FALSE(message.has_oneof_uint32        ());
    621   EXPECT_FALSE(message.has_oneof_nested_message());
    622   EXPECT_FALSE(message.has_oneof_string        ());
    623   EXPECT_FALSE(message.has_oneof_bytes         ());
    624 }
    625 
    626 // -------------------------------------------------------------------
    627 
    628 void TestUtil::ExpectRepeatedFieldsModified(
    629     const unittest::TestAllTypes& message) {
    630   // ModifyRepeatedFields only sets the second repeated element of each
    631   // field.  In addition to verifying this, we also verify that the first
    632   // element and size were *not* modified.
    633   ASSERT_EQ(2, message.repeated_int32_size   ());
    634   ASSERT_EQ(2, message.repeated_int64_size   ());
    635   ASSERT_EQ(2, message.repeated_uint32_size  ());
    636   ASSERT_EQ(2, message.repeated_uint64_size  ());
    637   ASSERT_EQ(2, message.repeated_sint32_size  ());
    638   ASSERT_EQ(2, message.repeated_sint64_size  ());
    639   ASSERT_EQ(2, message.repeated_fixed32_size ());
    640   ASSERT_EQ(2, message.repeated_fixed64_size ());
    641   ASSERT_EQ(2, message.repeated_sfixed32_size());
    642   ASSERT_EQ(2, message.repeated_sfixed64_size());
    643   ASSERT_EQ(2, message.repeated_float_size   ());
    644   ASSERT_EQ(2, message.repeated_double_size  ());
    645   ASSERT_EQ(2, message.repeated_bool_size    ());
    646   ASSERT_EQ(2, message.repeated_string_size  ());
    647   ASSERT_EQ(2, message.repeated_bytes_size   ());
    648 
    649   ASSERT_EQ(2, message.repeatedgroup_size           ());
    650   ASSERT_EQ(2, message.repeated_nested_message_size ());
    651   ASSERT_EQ(2, message.repeated_foreign_message_size());
    652   ASSERT_EQ(2, message.repeated_import_message_size ());
    653   ASSERT_EQ(2, message.repeated_lazy_message_size   ());
    654   ASSERT_EQ(2, message.repeated_nested_enum_size    ());
    655   ASSERT_EQ(2, message.repeated_foreign_enum_size   ());
    656   ASSERT_EQ(2, message.repeated_import_enum_size    ());
    657 
    658 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    659   ASSERT_EQ(2, message.repeated_string_piece_size());
    660   ASSERT_EQ(2, message.repeated_cord_size());
    661 #endif
    662 
    663   EXPECT_EQ(201  , message.repeated_int32   (0));
    664   EXPECT_EQ(202  , message.repeated_int64   (0));
    665   EXPECT_EQ(203  , message.repeated_uint32  (0));
    666   EXPECT_EQ(204  , message.repeated_uint64  (0));
    667   EXPECT_EQ(205  , message.repeated_sint32  (0));
    668   EXPECT_EQ(206  , message.repeated_sint64  (0));
    669   EXPECT_EQ(207  , message.repeated_fixed32 (0));
    670   EXPECT_EQ(208  , message.repeated_fixed64 (0));
    671   EXPECT_EQ(209  , message.repeated_sfixed32(0));
    672   EXPECT_EQ(210  , message.repeated_sfixed64(0));
    673   EXPECT_EQ(211  , message.repeated_float   (0));
    674   EXPECT_EQ(212  , message.repeated_double  (0));
    675   EXPECT_TRUE(     message.repeated_bool    (0));
    676   EXPECT_EQ("215", message.repeated_string  (0));
    677   EXPECT_EQ("216", message.repeated_bytes   (0));
    678 
    679   EXPECT_EQ(217, message.repeatedgroup           (0).a());
    680   EXPECT_EQ(218, message.repeated_nested_message (0).bb());
    681   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
    682   EXPECT_EQ(220, message.repeated_import_message (0).d());
    683   EXPECT_EQ(227, message.repeated_lazy_message   (0).bb());
    684 
    685   EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));
    686   EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));
    687   EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));
    688 
    689 
    690   // Actually verify the second (modified) elements now.
    691   EXPECT_EQ(501  , message.repeated_int32   (1));
    692   EXPECT_EQ(502  , message.repeated_int64   (1));
    693   EXPECT_EQ(503  , message.repeated_uint32  (1));
    694   EXPECT_EQ(504  , message.repeated_uint64  (1));
    695   EXPECT_EQ(505  , message.repeated_sint32  (1));
    696   EXPECT_EQ(506  , message.repeated_sint64  (1));
    697   EXPECT_EQ(507  , message.repeated_fixed32 (1));
    698   EXPECT_EQ(508  , message.repeated_fixed64 (1));
    699   EXPECT_EQ(509  , message.repeated_sfixed32(1));
    700   EXPECT_EQ(510  , message.repeated_sfixed64(1));
    701   EXPECT_EQ(511  , message.repeated_float   (1));
    702   EXPECT_EQ(512  , message.repeated_double  (1));
    703   EXPECT_TRUE(     message.repeated_bool    (1));
    704   EXPECT_EQ("515", message.repeated_string  (1));
    705   EXPECT_EQ("516", message.repeated_bytes   (1));
    706 
    707   EXPECT_EQ(517, message.repeatedgroup           (1).a());
    708   EXPECT_EQ(518, message.repeated_nested_message (1).bb());
    709   EXPECT_EQ(519, message.repeated_foreign_message(1).c());
    710   EXPECT_EQ(520, message.repeated_import_message (1).d());
    711   EXPECT_EQ(527, message.repeated_lazy_message   (1).bb());
    712 
    713   EXPECT_EQ(unittest::TestAllTypes::FOO, message.repeated_nested_enum (1));
    714   EXPECT_EQ(unittest::FOREIGN_FOO      , message.repeated_foreign_enum(1));
    715   EXPECT_EQ(unittest_import::IMPORT_FOO, message.repeated_import_enum (1));
    716 
    717 }
    718 
    719 // -------------------------------------------------------------------
    720 
    721 void TestUtil::SetPackedFields(unittest::TestPackedTypes* message) {
    722   message->add_packed_int32   (601);
    723   message->add_packed_int64   (602);
    724   message->add_packed_uint32  (603);
    725   message->add_packed_uint64  (604);
    726   message->add_packed_sint32  (605);
    727   message->add_packed_sint64  (606);
    728   message->add_packed_fixed32 (607);
    729   message->add_packed_fixed64 (608);
    730   message->add_packed_sfixed32(609);
    731   message->add_packed_sfixed64(610);
    732   message->add_packed_float   (611);
    733   message->add_packed_double  (612);
    734   message->add_packed_bool    (true);
    735   message->add_packed_enum    (unittest::FOREIGN_BAR);
    736   // add a second one of each field
    737   message->add_packed_int32   (701);
    738   message->add_packed_int64   (702);
    739   message->add_packed_uint32  (703);
    740   message->add_packed_uint64  (704);
    741   message->add_packed_sint32  (705);
    742   message->add_packed_sint64  (706);
    743   message->add_packed_fixed32 (707);
    744   message->add_packed_fixed64 (708);
    745   message->add_packed_sfixed32(709);
    746   message->add_packed_sfixed64(710);
    747   message->add_packed_float   (711);
    748   message->add_packed_double  (712);
    749   message->add_packed_bool    (false);
    750   message->add_packed_enum    (unittest::FOREIGN_BAZ);
    751 }
    752 
    753 void TestUtil::SetUnpackedFields(unittest::TestUnpackedTypes* message) {
    754   // The values applied here must match those of SetPackedFields.
    755 
    756   message->add_unpacked_int32   (601);
    757   message->add_unpacked_int64   (602);
    758   message->add_unpacked_uint32  (603);
    759   message->add_unpacked_uint64  (604);
    760   message->add_unpacked_sint32  (605);
    761   message->add_unpacked_sint64  (606);
    762   message->add_unpacked_fixed32 (607);
    763   message->add_unpacked_fixed64 (608);
    764   message->add_unpacked_sfixed32(609);
    765   message->add_unpacked_sfixed64(610);
    766   message->add_unpacked_float   (611);
    767   message->add_unpacked_double  (612);
    768   message->add_unpacked_bool    (true);
    769   message->add_unpacked_enum    (unittest::FOREIGN_BAR);
    770   // add a second one of each field
    771   message->add_unpacked_int32   (701);
    772   message->add_unpacked_int64   (702);
    773   message->add_unpacked_uint32  (703);
    774   message->add_unpacked_uint64  (704);
    775   message->add_unpacked_sint32  (705);
    776   message->add_unpacked_sint64  (706);
    777   message->add_unpacked_fixed32 (707);
    778   message->add_unpacked_fixed64 (708);
    779   message->add_unpacked_sfixed32(709);
    780   message->add_unpacked_sfixed64(710);
    781   message->add_unpacked_float   (711);
    782   message->add_unpacked_double  (712);
    783   message->add_unpacked_bool    (false);
    784   message->add_unpacked_enum    (unittest::FOREIGN_BAZ);
    785 }
    786 
    787 // -------------------------------------------------------------------
    788 
    789 void TestUtil::ModifyPackedFields(unittest::TestPackedTypes* message) {
    790   message->set_packed_int32   (1, 801);
    791   message->set_packed_int64   (1, 802);
    792   message->set_packed_uint32  (1, 803);
    793   message->set_packed_uint64  (1, 804);
    794   message->set_packed_sint32  (1, 805);
    795   message->set_packed_sint64  (1, 806);
    796   message->set_packed_fixed32 (1, 807);
    797   message->set_packed_fixed64 (1, 808);
    798   message->set_packed_sfixed32(1, 809);
    799   message->set_packed_sfixed64(1, 810);
    800   message->set_packed_float   (1, 811);
    801   message->set_packed_double  (1, 812);
    802   message->set_packed_bool    (1, true);
    803   message->set_packed_enum    (1, unittest::FOREIGN_FOO);
    804 }
    805 
    806 // -------------------------------------------------------------------
    807 
    808 void TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) {
    809   ASSERT_EQ(2, message.packed_int32_size   ());
    810   ASSERT_EQ(2, message.packed_int64_size   ());
    811   ASSERT_EQ(2, message.packed_uint32_size  ());
    812   ASSERT_EQ(2, message.packed_uint64_size  ());
    813   ASSERT_EQ(2, message.packed_sint32_size  ());
    814   ASSERT_EQ(2, message.packed_sint64_size  ());
    815   ASSERT_EQ(2, message.packed_fixed32_size ());
    816   ASSERT_EQ(2, message.packed_fixed64_size ());
    817   ASSERT_EQ(2, message.packed_sfixed32_size());
    818   ASSERT_EQ(2, message.packed_sfixed64_size());
    819   ASSERT_EQ(2, message.packed_float_size   ());
    820   ASSERT_EQ(2, message.packed_double_size  ());
    821   ASSERT_EQ(2, message.packed_bool_size    ());
    822   ASSERT_EQ(2, message.packed_enum_size    ());
    823 
    824   EXPECT_EQ(601  , message.packed_int32   (0));
    825   EXPECT_EQ(602  , message.packed_int64   (0));
    826   EXPECT_EQ(603  , message.packed_uint32  (0));
    827   EXPECT_EQ(604  , message.packed_uint64  (0));
    828   EXPECT_EQ(605  , message.packed_sint32  (0));
    829   EXPECT_EQ(606  , message.packed_sint64  (0));
    830   EXPECT_EQ(607  , message.packed_fixed32 (0));
    831   EXPECT_EQ(608  , message.packed_fixed64 (0));
    832   EXPECT_EQ(609  , message.packed_sfixed32(0));
    833   EXPECT_EQ(610  , message.packed_sfixed64(0));
    834   EXPECT_EQ(611  , message.packed_float   (0));
    835   EXPECT_EQ(612  , message.packed_double  (0));
    836   EXPECT_TRUE(     message.packed_bool    (0));
    837   EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));
    838 
    839   EXPECT_EQ(701  , message.packed_int32   (1));
    840   EXPECT_EQ(702  , message.packed_int64   (1));
    841   EXPECT_EQ(703  , message.packed_uint32  (1));
    842   EXPECT_EQ(704  , message.packed_uint64  (1));
    843   EXPECT_EQ(705  , message.packed_sint32  (1));
    844   EXPECT_EQ(706  , message.packed_sint64  (1));
    845   EXPECT_EQ(707  , message.packed_fixed32 (1));
    846   EXPECT_EQ(708  , message.packed_fixed64 (1));
    847   EXPECT_EQ(709  , message.packed_sfixed32(1));
    848   EXPECT_EQ(710  , message.packed_sfixed64(1));
    849   EXPECT_EQ(711  , message.packed_float   (1));
    850   EXPECT_EQ(712  , message.packed_double  (1));
    851   EXPECT_FALSE(    message.packed_bool    (1));
    852   EXPECT_EQ(unittest::FOREIGN_BAZ, message.packed_enum(1));
    853 }
    854 
    855 void TestUtil::ExpectUnpackedFieldsSet(
    856     const unittest::TestUnpackedTypes& message) {
    857   // The values expected here must match those of ExpectPackedFieldsSet.
    858 
    859   ASSERT_EQ(2, message.unpacked_int32_size   ());
    860   ASSERT_EQ(2, message.unpacked_int64_size   ());
    861   ASSERT_EQ(2, message.unpacked_uint32_size  ());
    862   ASSERT_EQ(2, message.unpacked_uint64_size  ());
    863   ASSERT_EQ(2, message.unpacked_sint32_size  ());
    864   ASSERT_EQ(2, message.unpacked_sint64_size  ());
    865   ASSERT_EQ(2, message.unpacked_fixed32_size ());
    866   ASSERT_EQ(2, message.unpacked_fixed64_size ());
    867   ASSERT_EQ(2, message.unpacked_sfixed32_size());
    868   ASSERT_EQ(2, message.unpacked_sfixed64_size());
    869   ASSERT_EQ(2, message.unpacked_float_size   ());
    870   ASSERT_EQ(2, message.unpacked_double_size  ());
    871   ASSERT_EQ(2, message.unpacked_bool_size    ());
    872   ASSERT_EQ(2, message.unpacked_enum_size    ());
    873 
    874   EXPECT_EQ(601  , message.unpacked_int32   (0));
    875   EXPECT_EQ(602  , message.unpacked_int64   (0));
    876   EXPECT_EQ(603  , message.unpacked_uint32  (0));
    877   EXPECT_EQ(604  , message.unpacked_uint64  (0));
    878   EXPECT_EQ(605  , message.unpacked_sint32  (0));
    879   EXPECT_EQ(606  , message.unpacked_sint64  (0));
    880   EXPECT_EQ(607  , message.unpacked_fixed32 (0));
    881   EXPECT_EQ(608  , message.unpacked_fixed64 (0));
    882   EXPECT_EQ(609  , message.unpacked_sfixed32(0));
    883   EXPECT_EQ(610  , message.unpacked_sfixed64(0));
    884   EXPECT_EQ(611  , message.unpacked_float   (0));
    885   EXPECT_EQ(612  , message.unpacked_double  (0));
    886   EXPECT_TRUE(     message.unpacked_bool    (0));
    887   EXPECT_EQ(unittest::FOREIGN_BAR, message.unpacked_enum(0));
    888 
    889   EXPECT_EQ(701  , message.unpacked_int32   (1));
    890   EXPECT_EQ(702  , message.unpacked_int64   (1));
    891   EXPECT_EQ(703  , message.unpacked_uint32  (1));
    892   EXPECT_EQ(704  , message.unpacked_uint64  (1));
    893   EXPECT_EQ(705  , message.unpacked_sint32  (1));
    894   EXPECT_EQ(706  , message.unpacked_sint64  (1));
    895   EXPECT_EQ(707  , message.unpacked_fixed32 (1));
    896   EXPECT_EQ(708  , message.unpacked_fixed64 (1));
    897   EXPECT_EQ(709  , message.unpacked_sfixed32(1));
    898   EXPECT_EQ(710  , message.unpacked_sfixed64(1));
    899   EXPECT_EQ(711  , message.unpacked_float   (1));
    900   EXPECT_EQ(712  , message.unpacked_double  (1));
    901   EXPECT_FALSE(    message.unpacked_bool    (1));
    902   EXPECT_EQ(unittest::FOREIGN_BAZ, message.unpacked_enum(1));
    903 }
    904 
    905 // -------------------------------------------------------------------
    906 
    907 void TestUtil::ExpectPackedClear(
    908     const unittest::TestPackedTypes& message) {
    909   // Packed repeated fields are empty.
    910   EXPECT_EQ(0, message.packed_int32_size   ());
    911   EXPECT_EQ(0, message.packed_int64_size   ());
    912   EXPECT_EQ(0, message.packed_uint32_size  ());
    913   EXPECT_EQ(0, message.packed_uint64_size  ());
    914   EXPECT_EQ(0, message.packed_sint32_size  ());
    915   EXPECT_EQ(0, message.packed_sint64_size  ());
    916   EXPECT_EQ(0, message.packed_fixed32_size ());
    917   EXPECT_EQ(0, message.packed_fixed64_size ());
    918   EXPECT_EQ(0, message.packed_sfixed32_size());
    919   EXPECT_EQ(0, message.packed_sfixed64_size());
    920   EXPECT_EQ(0, message.packed_float_size   ());
    921   EXPECT_EQ(0, message.packed_double_size  ());
    922   EXPECT_EQ(0, message.packed_bool_size    ());
    923   EXPECT_EQ(0, message.packed_enum_size    ());
    924 }
    925 
    926 // -------------------------------------------------------------------
    927 
    928 void TestUtil::ExpectPackedFieldsModified(
    929     const unittest::TestPackedTypes& message) {
    930   // Do the same for packed repeated fields.
    931   ASSERT_EQ(2, message.packed_int32_size   ());
    932   ASSERT_EQ(2, message.packed_int64_size   ());
    933   ASSERT_EQ(2, message.packed_uint32_size  ());
    934   ASSERT_EQ(2, message.packed_uint64_size  ());
    935   ASSERT_EQ(2, message.packed_sint32_size  ());
    936   ASSERT_EQ(2, message.packed_sint64_size  ());
    937   ASSERT_EQ(2, message.packed_fixed32_size ());
    938   ASSERT_EQ(2, message.packed_fixed64_size ());
    939   ASSERT_EQ(2, message.packed_sfixed32_size());
    940   ASSERT_EQ(2, message.packed_sfixed64_size());
    941   ASSERT_EQ(2, message.packed_float_size   ());
    942   ASSERT_EQ(2, message.packed_double_size  ());
    943   ASSERT_EQ(2, message.packed_bool_size    ());
    944   ASSERT_EQ(2, message.packed_enum_size    ());
    945 
    946   EXPECT_EQ(601  , message.packed_int32   (0));
    947   EXPECT_EQ(602  , message.packed_int64   (0));
    948   EXPECT_EQ(603  , message.packed_uint32  (0));
    949   EXPECT_EQ(604  , message.packed_uint64  (0));
    950   EXPECT_EQ(605  , message.packed_sint32  (0));
    951   EXPECT_EQ(606  , message.packed_sint64  (0));
    952   EXPECT_EQ(607  , message.packed_fixed32 (0));
    953   EXPECT_EQ(608  , message.packed_fixed64 (0));
    954   EXPECT_EQ(609  , message.packed_sfixed32(0));
    955   EXPECT_EQ(610  , message.packed_sfixed64(0));
    956   EXPECT_EQ(611  , message.packed_float   (0));
    957   EXPECT_EQ(612  , message.packed_double  (0));
    958   EXPECT_TRUE(     message.packed_bool    (0));
    959   EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));
    960   // Actually verify the second (modified) elements now.
    961   EXPECT_EQ(801  , message.packed_int32   (1));
    962   EXPECT_EQ(802  , message.packed_int64   (1));
    963   EXPECT_EQ(803  , message.packed_uint32  (1));
    964   EXPECT_EQ(804  , message.packed_uint64  (1));
    965   EXPECT_EQ(805  , message.packed_sint32  (1));
    966   EXPECT_EQ(806  , message.packed_sint64  (1));
    967   EXPECT_EQ(807  , message.packed_fixed32 (1));
    968   EXPECT_EQ(808  , message.packed_fixed64 (1));
    969   EXPECT_EQ(809  , message.packed_sfixed32(1));
    970   EXPECT_EQ(810  , message.packed_sfixed64(1));
    971   EXPECT_EQ(811  , message.packed_float   (1));
    972   EXPECT_EQ(812  , message.packed_double  (1));
    973   EXPECT_TRUE(     message.packed_bool    (1));
    974   EXPECT_EQ(unittest::FOREIGN_FOO, message.packed_enum(1));
    975 }
    976 
    977 // ===================================================================
    978 // Extensions
    979 //
    980 // All this code is exactly equivalent to the above code except that it's
    981 // manipulating extension fields instead of normal ones.
    982 //
    983 // I gave up on the 80-char limit here.  Sorry.
    984 
    985 void TestUtil::SetAllExtensions(unittest::TestAllExtensions* message) {
    986   message->SetExtension(unittest::optional_int32_extension   , 101);
    987   message->SetExtension(unittest::optional_int64_extension   , 102);
    988   message->SetExtension(unittest::optional_uint32_extension  , 103);
    989   message->SetExtension(unittest::optional_uint64_extension  , 104);
    990   message->SetExtension(unittest::optional_sint32_extension  , 105);
    991   message->SetExtension(unittest::optional_sint64_extension  , 106);
    992   message->SetExtension(unittest::optional_fixed32_extension , 107);
    993   message->SetExtension(unittest::optional_fixed64_extension , 108);
    994   message->SetExtension(unittest::optional_sfixed32_extension, 109);
    995   message->SetExtension(unittest::optional_sfixed64_extension, 110);
    996   message->SetExtension(unittest::optional_float_extension   , 111);
    997   message->SetExtension(unittest::optional_double_extension  , 112);
    998   message->SetExtension(unittest::optional_bool_extension    , true);
    999   message->SetExtension(unittest::optional_string_extension  , "115");
   1000   message->SetExtension(unittest::optional_bytes_extension   , "116");
   1001 
   1002   message->MutableExtension(unittest::optionalgroup_extension           )->set_a(117);
   1003   message->MutableExtension(unittest::optional_nested_message_extension )->set_bb(118);
   1004   message->MutableExtension(unittest::optional_foreign_message_extension)->set_c(119);
   1005   message->MutableExtension(unittest::optional_import_message_extension )->set_d(120);
   1006 
   1007   message->SetExtension(unittest::optional_nested_enum_extension , unittest::TestAllTypes::BAZ);
   1008   message->SetExtension(unittest::optional_foreign_enum_extension, unittest::FOREIGN_BAZ      );
   1009   message->SetExtension(unittest::optional_import_enum_extension , unittest_import::IMPORT_BAZ);
   1010 
   1011   message->SetExtension(unittest::optional_string_piece_extension, "124");
   1012   message->SetExtension(unittest::optional_cord_extension, "125");
   1013 
   1014   message->MutableExtension(unittest::optional_public_import_message_extension)->set_e(126);
   1015   message->MutableExtension(unittest::optional_lazy_message_extension)->set_bb(127);
   1016 
   1017   // -----------------------------------------------------------------
   1018 
   1019   message->AddExtension(unittest::repeated_int32_extension   , 201);
   1020   message->AddExtension(unittest::repeated_int64_extension   , 202);
   1021   message->AddExtension(unittest::repeated_uint32_extension  , 203);
   1022   message->AddExtension(unittest::repeated_uint64_extension  , 204);
   1023   message->AddExtension(unittest::repeated_sint32_extension  , 205);
   1024   message->AddExtension(unittest::repeated_sint64_extension  , 206);
   1025   message->AddExtension(unittest::repeated_fixed32_extension , 207);
   1026   message->AddExtension(unittest::repeated_fixed64_extension , 208);
   1027   message->AddExtension(unittest::repeated_sfixed32_extension, 209);
   1028   message->AddExtension(unittest::repeated_sfixed64_extension, 210);
   1029   message->AddExtension(unittest::repeated_float_extension   , 211);
   1030   message->AddExtension(unittest::repeated_double_extension  , 212);
   1031   message->AddExtension(unittest::repeated_bool_extension    , true);
   1032   message->AddExtension(unittest::repeated_string_extension  , "215");
   1033   message->AddExtension(unittest::repeated_bytes_extension   , "216");
   1034 
   1035   message->AddExtension(unittest::repeatedgroup_extension           )->set_a(217);
   1036   message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(218);
   1037   message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(219);
   1038   message->AddExtension(unittest::repeated_import_message_extension )->set_d(220);
   1039   message->AddExtension(unittest::repeated_lazy_message_extension   )->set_bb(227);
   1040 
   1041   message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAR);
   1042   message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAR      );
   1043   message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAR);
   1044 
   1045   message->AddExtension(unittest::repeated_string_piece_extension, "224");
   1046   message->AddExtension(unittest::repeated_cord_extension, "225");
   1047 
   1048   // Add a second one of each field.
   1049   message->AddExtension(unittest::repeated_int32_extension   , 301);
   1050   message->AddExtension(unittest::repeated_int64_extension   , 302);
   1051   message->AddExtension(unittest::repeated_uint32_extension  , 303);
   1052   message->AddExtension(unittest::repeated_uint64_extension  , 304);
   1053   message->AddExtension(unittest::repeated_sint32_extension  , 305);
   1054   message->AddExtension(unittest::repeated_sint64_extension  , 306);
   1055   message->AddExtension(unittest::repeated_fixed32_extension , 307);
   1056   message->AddExtension(unittest::repeated_fixed64_extension , 308);
   1057   message->AddExtension(unittest::repeated_sfixed32_extension, 309);
   1058   message->AddExtension(unittest::repeated_sfixed64_extension, 310);
   1059   message->AddExtension(unittest::repeated_float_extension   , 311);
   1060   message->AddExtension(unittest::repeated_double_extension  , 312);
   1061   message->AddExtension(unittest::repeated_bool_extension    , false);
   1062   message->AddExtension(unittest::repeated_string_extension  , "315");
   1063   message->AddExtension(unittest::repeated_bytes_extension   , "316");
   1064 
   1065   message->AddExtension(unittest::repeatedgroup_extension           )->set_a(317);
   1066   message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(318);
   1067   message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(319);
   1068   message->AddExtension(unittest::repeated_import_message_extension )->set_d(320);
   1069   message->AddExtension(unittest::repeated_lazy_message_extension   )->set_bb(327);
   1070 
   1071   message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAZ);
   1072   message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAZ      );
   1073   message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAZ);
   1074 
   1075   message->AddExtension(unittest::repeated_string_piece_extension, "324");
   1076   message->AddExtension(unittest::repeated_cord_extension, "325");
   1077 
   1078   // -----------------------------------------------------------------
   1079 
   1080   message->SetExtension(unittest::default_int32_extension   , 401);
   1081   message->SetExtension(unittest::default_int64_extension   , 402);
   1082   message->SetExtension(unittest::default_uint32_extension  , 403);
   1083   message->SetExtension(unittest::default_uint64_extension  , 404);
   1084   message->SetExtension(unittest::default_sint32_extension  , 405);
   1085   message->SetExtension(unittest::default_sint64_extension  , 406);
   1086   message->SetExtension(unittest::default_fixed32_extension , 407);
   1087   message->SetExtension(unittest::default_fixed64_extension , 408);
   1088   message->SetExtension(unittest::default_sfixed32_extension, 409);
   1089   message->SetExtension(unittest::default_sfixed64_extension, 410);
   1090   message->SetExtension(unittest::default_float_extension   , 411);
   1091   message->SetExtension(unittest::default_double_extension  , 412);
   1092   message->SetExtension(unittest::default_bool_extension    , false);
   1093   message->SetExtension(unittest::default_string_extension  , "415");
   1094   message->SetExtension(unittest::default_bytes_extension   , "416");
   1095 
   1096   message->SetExtension(unittest::default_nested_enum_extension , unittest::TestAllTypes::FOO);
   1097   message->SetExtension(unittest::default_foreign_enum_extension, unittest::FOREIGN_FOO      );
   1098   message->SetExtension(unittest::default_import_enum_extension , unittest_import::IMPORT_FOO);
   1099 
   1100   message->SetExtension(unittest::default_string_piece_extension, "424");
   1101   message->SetExtension(unittest::default_cord_extension, "425");
   1102 
   1103   SetOneofFields(message);
   1104 }
   1105 
   1106 void TestUtil::SetOneofFields(unittest::TestAllExtensions* message) {
   1107   message->SetExtension(unittest::oneof_uint32_extension, 601);
   1108   message->MutableExtension(unittest::oneof_nested_message_extension)->set_bb(602);
   1109   message->SetExtension(unittest::oneof_string_extension, "603");
   1110   message->SetExtension(unittest::oneof_bytes_extension, "604");
   1111 }
   1112 
   1113 // -------------------------------------------------------------------
   1114 
   1115 void TestUtil::SetAllFieldsAndExtensions(
   1116     unittest::TestFieldOrderings* message) {
   1117   GOOGLE_CHECK(message);
   1118   message->set_my_int(1);
   1119   message->set_my_string("foo");
   1120   message->set_my_float(1.0);
   1121   message->SetExtension(unittest::my_extension_int, 23);
   1122   message->SetExtension(unittest::my_extension_string, "bar");
   1123 }
   1124 
   1125 // -------------------------------------------------------------------
   1126 
   1127 void TestUtil::ModifyRepeatedExtensions(unittest::TestAllExtensions* message) {
   1128   message->SetExtension(unittest::repeated_int32_extension   , 1, 501);
   1129   message->SetExtension(unittest::repeated_int64_extension   , 1, 502);
   1130   message->SetExtension(unittest::repeated_uint32_extension  , 1, 503);
   1131   message->SetExtension(unittest::repeated_uint64_extension  , 1, 504);
   1132   message->SetExtension(unittest::repeated_sint32_extension  , 1, 505);
   1133   message->SetExtension(unittest::repeated_sint64_extension  , 1, 506);
   1134   message->SetExtension(unittest::repeated_fixed32_extension , 1, 507);
   1135   message->SetExtension(unittest::repeated_fixed64_extension , 1, 508);
   1136   message->SetExtension(unittest::repeated_sfixed32_extension, 1, 509);
   1137   message->SetExtension(unittest::repeated_sfixed64_extension, 1, 510);
   1138   message->SetExtension(unittest::repeated_float_extension   , 1, 511);
   1139   message->SetExtension(unittest::repeated_double_extension  , 1, 512);
   1140   message->SetExtension(unittest::repeated_bool_extension    , 1, true);
   1141   message->SetExtension(unittest::repeated_string_extension  , 1, "515");
   1142   message->SetExtension(unittest::repeated_bytes_extension   , 1, "516");
   1143 
   1144   message->MutableExtension(unittest::repeatedgroup_extension           , 1)->set_a(517);
   1145   message->MutableExtension(unittest::repeated_nested_message_extension , 1)->set_bb(518);
   1146   message->MutableExtension(unittest::repeated_foreign_message_extension, 1)->set_c(519);
   1147   message->MutableExtension(unittest::repeated_import_message_extension , 1)->set_d(520);
   1148   message->MutableExtension(unittest::repeated_lazy_message_extension   , 1)->set_bb(527);
   1149 
   1150   message->SetExtension(unittest::repeated_nested_enum_extension , 1, unittest::TestAllTypes::FOO);
   1151   message->SetExtension(unittest::repeated_foreign_enum_extension, 1, unittest::FOREIGN_FOO      );
   1152   message->SetExtension(unittest::repeated_import_enum_extension , 1, unittest_import::IMPORT_FOO);
   1153 
   1154   message->SetExtension(unittest::repeated_string_piece_extension, 1, "524");
   1155   message->SetExtension(unittest::repeated_cord_extension, 1, "525");
   1156 }
   1157 
   1158 // -------------------------------------------------------------------
   1159 
   1160 void TestUtil::ExpectAllExtensionsSet(
   1161     const unittest::TestAllExtensions& message) {
   1162   EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension   ));
   1163   EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension   ));
   1164   EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension  ));
   1165   EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension  ));
   1166   EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension  ));
   1167   EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension  ));
   1168   EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension ));
   1169   EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension ));
   1170   EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension));
   1171   EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension));
   1172   EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension   ));
   1173   EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension  ));
   1174   EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension    ));
   1175   EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension  ));
   1176   EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension   ));
   1177 
   1178   EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension                 ));
   1179   EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension       ));
   1180   EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension      ));
   1181   EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension       ));
   1182   EXPECT_TRUE(message.HasExtension(unittest::optional_public_import_message_extension));
   1183   EXPECT_TRUE(message.HasExtension(unittest::optional_lazy_message_extension         ));
   1184 
   1185   EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension                 ).has_a());
   1186   EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension       ).has_bb());
   1187   EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension      ).has_c());
   1188   EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension       ).has_d());
   1189   EXPECT_TRUE(message.GetExtension(unittest::optional_public_import_message_extension).has_e());
   1190   EXPECT_TRUE(message.GetExtension(unittest::optional_lazy_message_extension         ).has_bb());
   1191 
   1192   EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension ));
   1193   EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension));
   1194   EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension ));
   1195 
   1196   EXPECT_TRUE(message.HasExtension(unittest::optional_string_piece_extension));
   1197   EXPECT_TRUE(message.HasExtension(unittest::optional_cord_extension));
   1198 
   1199   EXPECT_EQ(101  , message.GetExtension(unittest::optional_int32_extension   ));
   1200   EXPECT_EQ(102  , message.GetExtension(unittest::optional_int64_extension   ));
   1201   EXPECT_EQ(103  , message.GetExtension(unittest::optional_uint32_extension  ));
   1202   EXPECT_EQ(104  , message.GetExtension(unittest::optional_uint64_extension  ));
   1203   EXPECT_EQ(105  , message.GetExtension(unittest::optional_sint32_extension  ));
   1204   EXPECT_EQ(106  , message.GetExtension(unittest::optional_sint64_extension  ));
   1205   EXPECT_EQ(107  , message.GetExtension(unittest::optional_fixed32_extension ));
   1206   EXPECT_EQ(108  , message.GetExtension(unittest::optional_fixed64_extension ));
   1207   EXPECT_EQ(109  , message.GetExtension(unittest::optional_sfixed32_extension));
   1208   EXPECT_EQ(110  , message.GetExtension(unittest::optional_sfixed64_extension));
   1209   EXPECT_EQ(111  , message.GetExtension(unittest::optional_float_extension   ));
   1210   EXPECT_EQ(112  , message.GetExtension(unittest::optional_double_extension  ));
   1211   EXPECT_TRUE(     message.GetExtension(unittest::optional_bool_extension    ));
   1212   EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension  ));
   1213   EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension   ));
   1214 
   1215   EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension           ).a());
   1216   EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension ).bb());
   1217   EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension).c());
   1218   EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension ).d());
   1219 
   1220   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::optional_nested_enum_extension ));
   1221   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::optional_foreign_enum_extension));
   1222   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::optional_import_enum_extension ));
   1223 
   1224   EXPECT_EQ("124", message.GetExtension(unittest::optional_string_piece_extension));
   1225   EXPECT_EQ("125", message.GetExtension(unittest::optional_cord_extension));
   1226   EXPECT_EQ(126, message.GetExtension(unittest::optional_public_import_message_extension ).e());
   1227   EXPECT_EQ(127, message.GetExtension(unittest::optional_lazy_message_extension).bb());
   1228 
   1229   // -----------------------------------------------------------------
   1230 
   1231   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));
   1232   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));
   1233   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));
   1234   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));
   1235   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));
   1236   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));
   1237   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));
   1238   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));
   1239   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));
   1240   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));
   1241   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));
   1242   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));
   1243   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));
   1244   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));
   1245   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));
   1246 
   1247   ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   1248   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   1249   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   1250   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));
   1251   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   1252   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));
   1253   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));
   1254   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));
   1255 
   1256   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));
   1257   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));
   1258 
   1259   EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));
   1260   EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));
   1261   EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));
   1262   EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));
   1263   EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));
   1264   EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));
   1265   EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));
   1266   EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));
   1267   EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));
   1268   EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
   1269   EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));
   1270   EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));
   1271   EXPECT_TRUE(     message.GetExtension(unittest::repeated_bool_extension    , 0));
   1272   EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension  , 0));
   1273   EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension   , 0));
   1274 
   1275   EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());
   1276   EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());
   1277   EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());
   1278   EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());
   1279   EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension   , 0).bb());
   1280 
   1281   EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));
   1282   EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));
   1283   EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));
   1284 
   1285   EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0));
   1286   EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0));
   1287 
   1288   EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension   , 1));
   1289   EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension   , 1));
   1290   EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension  , 1));
   1291   EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension  , 1));
   1292   EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension  , 1));
   1293   EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension  , 1));
   1294   EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension , 1));
   1295   EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension , 1));
   1296   EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));
   1297   EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
   1298   EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension   , 1));
   1299   EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension  , 1));
   1300   EXPECT_FALSE(    message.GetExtension(unittest::repeated_bool_extension    , 1));
   1301   EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension  , 1));
   1302   EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension   , 1));
   1303 
   1304   EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());
   1305   EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());
   1306   EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());
   1307   EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 1).d());
   1308   EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension   , 1).bb());
   1309 
   1310   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 1));
   1311   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));
   1312   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 1));
   1313 
   1314   EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 1));
   1315   EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 1));
   1316 
   1317   // -----------------------------------------------------------------
   1318 
   1319   EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension   ));
   1320   EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension   ));
   1321   EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension  ));
   1322   EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension  ));
   1323   EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension  ));
   1324   EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension  ));
   1325   EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension ));
   1326   EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension ));
   1327   EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension));
   1328   EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension));
   1329   EXPECT_TRUE(message.HasExtension(unittest::default_float_extension   ));
   1330   EXPECT_TRUE(message.HasExtension(unittest::default_double_extension  ));
   1331   EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension    ));
   1332   EXPECT_TRUE(message.HasExtension(unittest::default_string_extension  ));
   1333   EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension   ));
   1334 
   1335   EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension ));
   1336   EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension));
   1337   EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension ));
   1338 
   1339   EXPECT_TRUE(message.HasExtension(unittest::default_string_piece_extension));
   1340   EXPECT_TRUE(message.HasExtension(unittest::default_cord_extension));
   1341 
   1342   EXPECT_EQ(401  , message.GetExtension(unittest::default_int32_extension   ));
   1343   EXPECT_EQ(402  , message.GetExtension(unittest::default_int64_extension   ));
   1344   EXPECT_EQ(403  , message.GetExtension(unittest::default_uint32_extension  ));
   1345   EXPECT_EQ(404  , message.GetExtension(unittest::default_uint64_extension  ));
   1346   EXPECT_EQ(405  , message.GetExtension(unittest::default_sint32_extension  ));
   1347   EXPECT_EQ(406  , message.GetExtension(unittest::default_sint64_extension  ));
   1348   EXPECT_EQ(407  , message.GetExtension(unittest::default_fixed32_extension ));
   1349   EXPECT_EQ(408  , message.GetExtension(unittest::default_fixed64_extension ));
   1350   EXPECT_EQ(409  , message.GetExtension(unittest::default_sfixed32_extension));
   1351   EXPECT_EQ(410  , message.GetExtension(unittest::default_sfixed64_extension));
   1352   EXPECT_EQ(411  , message.GetExtension(unittest::default_float_extension   ));
   1353   EXPECT_EQ(412  , message.GetExtension(unittest::default_double_extension  ));
   1354   EXPECT_FALSE(    message.GetExtension(unittest::default_bool_extension    ));
   1355   EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension  ));
   1356   EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension   ));
   1357 
   1358   EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::default_nested_enum_extension ));
   1359   EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::default_foreign_enum_extension));
   1360   EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::default_import_enum_extension ));
   1361 
   1362   EXPECT_EQ("424", message.GetExtension(unittest::default_string_piece_extension));
   1363   EXPECT_EQ("425", message.GetExtension(unittest::default_cord_extension));
   1364 
   1365   EXPECT_TRUE(message.HasExtension(unittest::oneof_uint32_extension));
   1366   EXPECT_TRUE(message.GetExtension(unittest::oneof_nested_message_extension).has_bb());
   1367   EXPECT_TRUE(message.HasExtension(unittest::oneof_string_extension));
   1368   EXPECT_TRUE(message.HasExtension(unittest::oneof_bytes_extension));
   1369 
   1370   EXPECT_EQ(601, message.GetExtension(unittest::oneof_uint32_extension));
   1371   EXPECT_EQ(602, message.GetExtension(unittest::oneof_nested_message_extension).bb());
   1372   EXPECT_EQ("603", message.GetExtension(unittest::oneof_string_extension));
   1373   EXPECT_EQ("604", message.GetExtension(unittest::oneof_bytes_extension));
   1374 }
   1375 
   1376 // -------------------------------------------------------------------
   1377 
   1378 void TestUtil::ExpectExtensionsClear(
   1379     const unittest::TestAllExtensions& message) {
   1380   string serialized;
   1381   ASSERT_TRUE(message.SerializeToString(&serialized));
   1382   EXPECT_EQ("", serialized);
   1383   EXPECT_EQ(0, message.ByteSize());
   1384 
   1385   // has_blah() should initially be false for all optional fields.
   1386   EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension   ));
   1387   EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension   ));
   1388   EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension  ));
   1389   EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension  ));
   1390   EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension  ));
   1391   EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension  ));
   1392   EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension ));
   1393   EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension ));
   1394   EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension));
   1395   EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension));
   1396   EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension   ));
   1397   EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension  ));
   1398   EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension    ));
   1399   EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension  ));
   1400   EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension   ));
   1401 
   1402   EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension                 ));
   1403   EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension       ));
   1404   EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension      ));
   1405   EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension       ));
   1406   EXPECT_FALSE(message.HasExtension(unittest::optional_public_import_message_extension));
   1407   EXPECT_FALSE(message.HasExtension(unittest::optional_lazy_message_extension         ));
   1408 
   1409   EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension ));
   1410   EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension));
   1411   EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension ));
   1412 
   1413   EXPECT_FALSE(message.HasExtension(unittest::optional_string_piece_extension));
   1414   EXPECT_FALSE(message.HasExtension(unittest::optional_cord_extension));
   1415 
   1416   // Optional fields without defaults are set to zero or something like it.
   1417   EXPECT_EQ(0    , message.GetExtension(unittest::optional_int32_extension   ));
   1418   EXPECT_EQ(0    , message.GetExtension(unittest::optional_int64_extension   ));
   1419   EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint32_extension  ));
   1420   EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint64_extension  ));
   1421   EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint32_extension  ));
   1422   EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint64_extension  ));
   1423   EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed32_extension ));
   1424   EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed64_extension ));
   1425   EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed32_extension));
   1426   EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed64_extension));
   1427   EXPECT_EQ(0    , message.GetExtension(unittest::optional_float_extension   ));
   1428   EXPECT_EQ(0    , message.GetExtension(unittest::optional_double_extension  ));
   1429   EXPECT_FALSE(    message.GetExtension(unittest::optional_bool_extension    ));
   1430   EXPECT_EQ(""   , message.GetExtension(unittest::optional_string_extension  ));
   1431   EXPECT_EQ(""   , message.GetExtension(unittest::optional_bytes_extension   ));
   1432 
   1433   // Embedded messages should also be clear.
   1434   EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension                 ).has_a());
   1435   EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension       ).has_bb());
   1436   EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension      ).has_c());
   1437   EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension       ).has_d());
   1438   EXPECT_FALSE(message.GetExtension(unittest::optional_public_import_message_extension).has_e());
   1439   EXPECT_FALSE(message.GetExtension(unittest::optional_lazy_message_extension         ).has_bb());
   1440 
   1441   EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension                 ).a());
   1442   EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension       ).bb());
   1443   EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension      ).c());
   1444   EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension       ).d());
   1445   EXPECT_EQ(0, message.GetExtension(unittest::optional_public_import_message_extension).e());
   1446   EXPECT_EQ(0, message.GetExtension(unittest::optional_lazy_message_extension         ).bb());
   1447 
   1448   // Enums without defaults are set to the first value in the enum.
   1449   EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::optional_nested_enum_extension ));
   1450   EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::optional_foreign_enum_extension));
   1451   EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::optional_import_enum_extension ));
   1452 
   1453   EXPECT_EQ("", message.GetExtension(unittest::optional_string_piece_extension));
   1454   EXPECT_EQ("", message.GetExtension(unittest::optional_cord_extension));
   1455 
   1456   // Repeated fields are empty.
   1457   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension   ));
   1458   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension   ));
   1459   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension  ));
   1460   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension  ));
   1461   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension  ));
   1462   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension  ));
   1463   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension ));
   1464   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension ));
   1465   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension));
   1466   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension));
   1467   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension   ));
   1468   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension  ));
   1469   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension    ));
   1470   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension  ));
   1471   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension   ));
   1472 
   1473   EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   1474   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   1475   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   1476   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension ));
   1477   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   1478   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));
   1479   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));
   1480   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension    ));
   1481 
   1482   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_piece_extension));
   1483   EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_cord_extension));
   1484 
   1485   // has_blah() should also be false for all default fields.
   1486   EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension   ));
   1487   EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension   ));
   1488   EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension  ));
   1489   EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension  ));
   1490   EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension  ));
   1491   EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension  ));
   1492   EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension ));
   1493   EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension ));
   1494   EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension));
   1495   EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension));
   1496   EXPECT_FALSE(message.HasExtension(unittest::default_float_extension   ));
   1497   EXPECT_FALSE(message.HasExtension(unittest::default_double_extension  ));
   1498   EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension    ));
   1499   EXPECT_FALSE(message.HasExtension(unittest::default_string_extension  ));
   1500   EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension   ));
   1501 
   1502   EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension ));
   1503   EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension));
   1504   EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension ));
   1505 
   1506   EXPECT_FALSE(message.HasExtension(unittest::default_string_piece_extension));
   1507   EXPECT_FALSE(message.HasExtension(unittest::default_cord_extension));
   1508 
   1509   // Fields with defaults have their default values (duh).
   1510   EXPECT_EQ( 41    , message.GetExtension(unittest::default_int32_extension   ));
   1511   EXPECT_EQ( 42    , message.GetExtension(unittest::default_int64_extension   ));
   1512   EXPECT_EQ( 43    , message.GetExtension(unittest::default_uint32_extension  ));
   1513   EXPECT_EQ( 44    , message.GetExtension(unittest::default_uint64_extension  ));
   1514   EXPECT_EQ(-45    , message.GetExtension(unittest::default_sint32_extension  ));
   1515   EXPECT_EQ( 46    , message.GetExtension(unittest::default_sint64_extension  ));
   1516   EXPECT_EQ( 47    , message.GetExtension(unittest::default_fixed32_extension ));
   1517   EXPECT_EQ( 48    , message.GetExtension(unittest::default_fixed64_extension ));
   1518   EXPECT_EQ( 49    , message.GetExtension(unittest::default_sfixed32_extension));
   1519   EXPECT_EQ(-50    , message.GetExtension(unittest::default_sfixed64_extension));
   1520   EXPECT_EQ( 51.5  , message.GetExtension(unittest::default_float_extension   ));
   1521   EXPECT_EQ( 52e3  , message.GetExtension(unittest::default_double_extension  ));
   1522   EXPECT_TRUE(       message.GetExtension(unittest::default_bool_extension    ));
   1523   EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension  ));
   1524   EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension   ));
   1525 
   1526   EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::default_nested_enum_extension ));
   1527   EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::default_foreign_enum_extension));
   1528   EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::default_import_enum_extension ));
   1529 
   1530   EXPECT_EQ("abc", message.GetExtension(unittest::default_string_piece_extension));
   1531   EXPECT_EQ("123", message.GetExtension(unittest::default_cord_extension));
   1532 
   1533   EXPECT_FALSE(message.HasExtension(unittest::oneof_uint32_extension));
   1534   EXPECT_FALSE(message.GetExtension(unittest::oneof_nested_message_extension).has_bb());
   1535   EXPECT_FALSE(message.HasExtension(unittest::oneof_string_extension));
   1536   EXPECT_FALSE(message.HasExtension(unittest::oneof_bytes_extension));
   1537 }
   1538 
   1539 // -------------------------------------------------------------------
   1540 
   1541 void TestUtil::ExpectRepeatedExtensionsModified(
   1542     const unittest::TestAllExtensions& message) {
   1543   // ModifyRepeatedFields only sets the second repeated element of each
   1544   // field.  In addition to verifying this, we also verify that the first
   1545   // element and size were *not* modified.
   1546   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));
   1547   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));
   1548   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));
   1549   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));
   1550   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));
   1551   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));
   1552   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));
   1553   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));
   1554   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));
   1555   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));
   1556   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));
   1557   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));
   1558   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));
   1559   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));
   1560   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));
   1561 
   1562   ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   1563   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   1564   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   1565   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));
   1566   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   1567   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));
   1568   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));
   1569   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));
   1570 
   1571   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));
   1572   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));
   1573 
   1574   EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));
   1575   EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));
   1576   EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));
   1577   EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));
   1578   EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));
   1579   EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));
   1580   EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));
   1581   EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));
   1582   EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));
   1583   EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
   1584   EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));
   1585   EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));
   1586   EXPECT_TRUE(     message.GetExtension(unittest::repeated_bool_extension    , 0));
   1587   EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension  , 0));
   1588   EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension   , 0));
   1589 
   1590   EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());
   1591   EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());
   1592   EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());
   1593   EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());
   1594   EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension   , 0).bb());
   1595 
   1596   EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));
   1597   EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));
   1598   EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));
   1599 
   1600   EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0));
   1601   EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0));
   1602 
   1603   // Actually verify the second (modified) elements now.
   1604   EXPECT_EQ(501  , message.GetExtension(unittest::repeated_int32_extension   , 1));
   1605   EXPECT_EQ(502  , message.GetExtension(unittest::repeated_int64_extension   , 1));
   1606   EXPECT_EQ(503  , message.GetExtension(unittest::repeated_uint32_extension  , 1));
   1607   EXPECT_EQ(504  , message.GetExtension(unittest::repeated_uint64_extension  , 1));
   1608   EXPECT_EQ(505  , message.GetExtension(unittest::repeated_sint32_extension  , 1));
   1609   EXPECT_EQ(506  , message.GetExtension(unittest::repeated_sint64_extension  , 1));
   1610   EXPECT_EQ(507  , message.GetExtension(unittest::repeated_fixed32_extension , 1));
   1611   EXPECT_EQ(508  , message.GetExtension(unittest::repeated_fixed64_extension , 1));
   1612   EXPECT_EQ(509  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));
   1613   EXPECT_EQ(510  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
   1614   EXPECT_EQ(511  , message.GetExtension(unittest::repeated_float_extension   , 1));
   1615   EXPECT_EQ(512  , message.GetExtension(unittest::repeated_double_extension  , 1));
   1616   EXPECT_TRUE(     message.GetExtension(unittest::repeated_bool_extension    , 1));
   1617   EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension  , 1));
   1618   EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension   , 1));
   1619 
   1620   EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());
   1621   EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());
   1622   EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());
   1623   EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension , 1).d());
   1624   EXPECT_EQ(527, message.GetExtension(unittest::repeated_lazy_message_extension   , 1).bb());
   1625 
   1626   EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::repeated_nested_enum_extension , 1));
   1627   EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));
   1628   EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::repeated_import_enum_extension , 1));
   1629 
   1630   EXPECT_EQ("524", message.GetExtension(unittest::repeated_string_piece_extension, 1));
   1631   EXPECT_EQ("525", message.GetExtension(unittest::repeated_cord_extension, 1));
   1632 }
   1633 
   1634 // -------------------------------------------------------------------
   1635 
   1636 void TestUtil::SetPackedExtensions(unittest::TestPackedExtensions* message) {
   1637   message->AddExtension(unittest::packed_int32_extension   , 601);
   1638   message->AddExtension(unittest::packed_int64_extension   , 602);
   1639   message->AddExtension(unittest::packed_uint32_extension  , 603);
   1640   message->AddExtension(unittest::packed_uint64_extension  , 604);
   1641   message->AddExtension(unittest::packed_sint32_extension  , 605);
   1642   message->AddExtension(unittest::packed_sint64_extension  , 606);
   1643   message->AddExtension(unittest::packed_fixed32_extension , 607);
   1644   message->AddExtension(unittest::packed_fixed64_extension , 608);
   1645   message->AddExtension(unittest::packed_sfixed32_extension, 609);
   1646   message->AddExtension(unittest::packed_sfixed64_extension, 610);
   1647   message->AddExtension(unittest::packed_float_extension   , 611);
   1648   message->AddExtension(unittest::packed_double_extension  , 612);
   1649   message->AddExtension(unittest::packed_bool_extension    , true);
   1650   message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAR);
   1651   // add a second one of each field
   1652   message->AddExtension(unittest::packed_int32_extension   , 701);
   1653   message->AddExtension(unittest::packed_int64_extension   , 702);
   1654   message->AddExtension(unittest::packed_uint32_extension  , 703);
   1655   message->AddExtension(unittest::packed_uint64_extension  , 704);
   1656   message->AddExtension(unittest::packed_sint32_extension  , 705);
   1657   message->AddExtension(unittest::packed_sint64_extension  , 706);
   1658   message->AddExtension(unittest::packed_fixed32_extension , 707);
   1659   message->AddExtension(unittest::packed_fixed64_extension , 708);
   1660   message->AddExtension(unittest::packed_sfixed32_extension, 709);
   1661   message->AddExtension(unittest::packed_sfixed64_extension, 710);
   1662   message->AddExtension(unittest::packed_float_extension   , 711);
   1663   message->AddExtension(unittest::packed_double_extension  , 712);
   1664   message->AddExtension(unittest::packed_bool_extension    , false);
   1665   message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAZ);
   1666 }
   1667 
   1668 // -------------------------------------------------------------------
   1669 
   1670 void TestUtil::ModifyPackedExtensions(unittest::TestPackedExtensions* message) {
   1671   message->SetExtension(unittest::packed_int32_extension   , 1, 801);
   1672   message->SetExtension(unittest::packed_int64_extension   , 1, 802);
   1673   message->SetExtension(unittest::packed_uint32_extension  , 1, 803);
   1674   message->SetExtension(unittest::packed_uint64_extension  , 1, 804);
   1675   message->SetExtension(unittest::packed_sint32_extension  , 1, 805);
   1676   message->SetExtension(unittest::packed_sint64_extension  , 1, 806);
   1677   message->SetExtension(unittest::packed_fixed32_extension , 1, 807);
   1678   message->SetExtension(unittest::packed_fixed64_extension , 1, 808);
   1679   message->SetExtension(unittest::packed_sfixed32_extension, 1, 809);
   1680   message->SetExtension(unittest::packed_sfixed64_extension, 1, 810);
   1681   message->SetExtension(unittest::packed_float_extension   , 1, 811);
   1682   message->SetExtension(unittest::packed_double_extension  , 1, 812);
   1683   message->SetExtension(unittest::packed_bool_extension    , 1, true);
   1684   message->SetExtension(unittest::packed_enum_extension    , 1,
   1685                         unittest::FOREIGN_FOO);
   1686 }
   1687 
   1688 // -------------------------------------------------------------------
   1689 
   1690 void TestUtil::ExpectPackedExtensionsSet(
   1691     const unittest::TestPackedExtensions& message) {
   1692   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension   ));
   1693   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension   ));
   1694   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension  ));
   1695   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension  ));
   1696   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension  ));
   1697   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension  ));
   1698   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension ));
   1699   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension ));
   1700   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension));
   1701   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension));
   1702   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension   ));
   1703   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension  ));
   1704   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension    ));
   1705   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension    ));
   1706 
   1707   EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension   , 0));
   1708   EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension   , 0));
   1709   EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension  , 0));
   1710   EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension  , 0));
   1711   EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension  , 0));
   1712   EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension  , 0));
   1713   EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension , 0));
   1714   EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension , 0));
   1715   EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension, 0));
   1716   EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension, 0));
   1717   EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension   , 0));
   1718   EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension  , 0));
   1719   EXPECT_TRUE(     message.GetExtension(unittest::packed_bool_extension    , 0));
   1720   EXPECT_EQ(unittest::FOREIGN_BAR,
   1721             message.GetExtension(unittest::packed_enum_extension, 0));
   1722   EXPECT_EQ(701  , message.GetExtension(unittest::packed_int32_extension   , 1));
   1723   EXPECT_EQ(702  , message.GetExtension(unittest::packed_int64_extension   , 1));
   1724   EXPECT_EQ(703  , message.GetExtension(unittest::packed_uint32_extension  , 1));
   1725   EXPECT_EQ(704  , message.GetExtension(unittest::packed_uint64_extension  , 1));
   1726   EXPECT_EQ(705  , message.GetExtension(unittest::packed_sint32_extension  , 1));
   1727   EXPECT_EQ(706  , message.GetExtension(unittest::packed_sint64_extension  , 1));
   1728   EXPECT_EQ(707  , message.GetExtension(unittest::packed_fixed32_extension , 1));
   1729   EXPECT_EQ(708  , message.GetExtension(unittest::packed_fixed64_extension , 1));
   1730   EXPECT_EQ(709  , message.GetExtension(unittest::packed_sfixed32_extension, 1));
   1731   EXPECT_EQ(710  , message.GetExtension(unittest::packed_sfixed64_extension, 1));
   1732   EXPECT_EQ(711  , message.GetExtension(unittest::packed_float_extension   , 1));
   1733   EXPECT_EQ(712  , message.GetExtension(unittest::packed_double_extension  , 1));
   1734   EXPECT_FALSE(    message.GetExtension(unittest::packed_bool_extension    , 1));
   1735   EXPECT_EQ(unittest::FOREIGN_BAZ,
   1736             message.GetExtension(unittest::packed_enum_extension, 1));
   1737 }
   1738 
   1739 // -------------------------------------------------------------------
   1740 
   1741 void TestUtil::ExpectPackedExtensionsClear(
   1742     const unittest::TestPackedExtensions& message) {
   1743   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension   ));
   1744   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension   ));
   1745   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension  ));
   1746   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension  ));
   1747   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension  ));
   1748   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension  ));
   1749   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension ));
   1750   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension ));
   1751   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension));
   1752   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension));
   1753   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension   ));
   1754   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension  ));
   1755   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension    ));
   1756   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension    ));
   1757 }
   1758 
   1759 // -------------------------------------------------------------------
   1760 
   1761 void TestUtil::ExpectPackedExtensionsModified(
   1762     const unittest::TestPackedExtensions& message) {
   1763   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension   ));
   1764   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension   ));
   1765   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension  ));
   1766   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension  ));
   1767   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension  ));
   1768   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension  ));
   1769   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension ));
   1770   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension ));
   1771   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension));
   1772   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension));
   1773   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension   ));
   1774   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension  ));
   1775   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension    ));
   1776   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension    ));
   1777   EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension   , 0));
   1778   EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension   , 0));
   1779   EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension  , 0));
   1780   EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension  , 0));
   1781   EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension  , 0));
   1782   EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension  , 0));
   1783   EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension , 0));
   1784   EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension , 0));
   1785   EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension, 0));
   1786   EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension, 0));
   1787   EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension   , 0));
   1788   EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension  , 0));
   1789   EXPECT_TRUE(     message.GetExtension(unittest::packed_bool_extension    , 0));
   1790   EXPECT_EQ(unittest::FOREIGN_BAR,
   1791             message.GetExtension(unittest::packed_enum_extension, 0));
   1792 
   1793   // Actually verify the second (modified) elements now.
   1794   EXPECT_EQ(801  , message.GetExtension(unittest::packed_int32_extension   , 1));
   1795   EXPECT_EQ(802  , message.GetExtension(unittest::packed_int64_extension   , 1));
   1796   EXPECT_EQ(803  , message.GetExtension(unittest::packed_uint32_extension  , 1));
   1797   EXPECT_EQ(804  , message.GetExtension(unittest::packed_uint64_extension  , 1));
   1798   EXPECT_EQ(805  , message.GetExtension(unittest::packed_sint32_extension  , 1));
   1799   EXPECT_EQ(806  , message.GetExtension(unittest::packed_sint64_extension  , 1));
   1800   EXPECT_EQ(807  , message.GetExtension(unittest::packed_fixed32_extension , 1));
   1801   EXPECT_EQ(808  , message.GetExtension(unittest::packed_fixed64_extension , 1));
   1802   EXPECT_EQ(809  , message.GetExtension(unittest::packed_sfixed32_extension, 1));
   1803   EXPECT_EQ(810  , message.GetExtension(unittest::packed_sfixed64_extension, 1));
   1804   EXPECT_EQ(811  , message.GetExtension(unittest::packed_float_extension   , 1));
   1805   EXPECT_EQ(812  , message.GetExtension(unittest::packed_double_extension  , 1));
   1806   EXPECT_TRUE(     message.GetExtension(unittest::packed_bool_extension    , 1));
   1807   EXPECT_EQ(unittest::FOREIGN_FOO,
   1808             message.GetExtension(unittest::packed_enum_extension, 1));
   1809 }
   1810 
   1811 // -------------------------------------------------------------------
   1812 
   1813 void TestUtil::ExpectUnpackedExtensionsSet(
   1814     const unittest::TestUnpackedExtensions& message) {
   1815   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_int32_extension   ));
   1816   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_int64_extension   ));
   1817   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_uint32_extension  ));
   1818   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_uint64_extension  ));
   1819   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sint32_extension  ));
   1820   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sint64_extension  ));
   1821   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_fixed32_extension ));
   1822   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_fixed64_extension ));
   1823   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sfixed32_extension));
   1824   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sfixed64_extension));
   1825   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_float_extension   ));
   1826   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_double_extension  ));
   1827   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_bool_extension    ));
   1828   ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_enum_extension    ));
   1829 
   1830   EXPECT_EQ(601  , message.GetExtension(unittest::unpacked_int32_extension   , 0));
   1831   EXPECT_EQ(602  , message.GetExtension(unittest::unpacked_int64_extension   , 0));
   1832   EXPECT_EQ(603  , message.GetExtension(unittest::unpacked_uint32_extension  , 0));
   1833   EXPECT_EQ(604  , message.GetExtension(unittest::unpacked_uint64_extension  , 0));
   1834   EXPECT_EQ(605  , message.GetExtension(unittest::unpacked_sint32_extension  , 0));
   1835   EXPECT_EQ(606  , message.GetExtension(unittest::unpacked_sint64_extension  , 0));
   1836   EXPECT_EQ(607  , message.GetExtension(unittest::unpacked_fixed32_extension , 0));
   1837   EXPECT_EQ(608  , message.GetExtension(unittest::unpacked_fixed64_extension , 0));
   1838   EXPECT_EQ(609  , message.GetExtension(unittest::unpacked_sfixed32_extension, 0));
   1839   EXPECT_EQ(610  , message.GetExtension(unittest::unpacked_sfixed64_extension, 0));
   1840   EXPECT_EQ(611  , message.GetExtension(unittest::unpacked_float_extension   , 0));
   1841   EXPECT_EQ(612  , message.GetExtension(unittest::unpacked_double_extension  , 0));
   1842   EXPECT_EQ(true , message.GetExtension(unittest::unpacked_bool_extension    , 0));
   1843   EXPECT_EQ(unittest::FOREIGN_BAR,
   1844             message.GetExtension(unittest::unpacked_enum_extension, 0));
   1845   EXPECT_EQ(701  , message.GetExtension(unittest::unpacked_int32_extension   , 1));
   1846   EXPECT_EQ(702  , message.GetExtension(unittest::unpacked_int64_extension   , 1));
   1847   EXPECT_EQ(703  , message.GetExtension(unittest::unpacked_uint32_extension  , 1));
   1848   EXPECT_EQ(704  , message.GetExtension(unittest::unpacked_uint64_extension  , 1));
   1849   EXPECT_EQ(705  , message.GetExtension(unittest::unpacked_sint32_extension  , 1));
   1850   EXPECT_EQ(706  , message.GetExtension(unittest::unpacked_sint64_extension  , 1));
   1851   EXPECT_EQ(707  , message.GetExtension(unittest::unpacked_fixed32_extension , 1));
   1852   EXPECT_EQ(708  , message.GetExtension(unittest::unpacked_fixed64_extension , 1));
   1853   EXPECT_EQ(709  , message.GetExtension(unittest::unpacked_sfixed32_extension, 1));
   1854   EXPECT_EQ(710  , message.GetExtension(unittest::unpacked_sfixed64_extension, 1));
   1855   EXPECT_EQ(711  , message.GetExtension(unittest::unpacked_float_extension   , 1));
   1856   EXPECT_EQ(712  , message.GetExtension(unittest::unpacked_double_extension  , 1));
   1857   EXPECT_EQ(false, message.GetExtension(unittest::unpacked_bool_extension    , 1));
   1858   EXPECT_EQ(unittest::FOREIGN_BAZ,
   1859             message.GetExtension(unittest::unpacked_enum_extension, 1));
   1860 }
   1861 
   1862 // -------------------------------------------------------------------
   1863 
   1864 void TestUtil::ExpectAllFieldsAndExtensionsInOrder(const string& serialized) {
   1865   // We set each field individually, serialize separately, and concatenate all
   1866   // the strings in canonical order to determine the expected serialization.
   1867   string expected;
   1868   unittest::TestFieldOrderings message;
   1869   message.set_my_int(1);  // Field 1.
   1870   message.AppendToString(&expected);
   1871   message.Clear();
   1872   message.SetExtension(unittest::my_extension_int, 23);  // Field 5.
   1873   message.AppendToString(&expected);
   1874   message.Clear();
   1875   message.set_my_string("foo");  // Field 11.
   1876   message.AppendToString(&expected);
   1877   message.Clear();
   1878   message.SetExtension(unittest::my_extension_string, "bar");  // Field 50.
   1879   message.AppendToString(&expected);
   1880   message.Clear();
   1881   message.set_my_float(1.0);  // Field 101.
   1882   message.AppendToString(&expected);
   1883   message.Clear();
   1884 
   1885   // We don't EXPECT_EQ() since we don't want to print raw bytes to stdout.
   1886   EXPECT_TRUE(serialized == expected);
   1887 }
   1888 
   1889 void TestUtil::ExpectLastRepeatedsRemoved(
   1890     const unittest::TestAllTypes& message) {
   1891   ASSERT_EQ(1, message.repeated_int32_size   ());
   1892   ASSERT_EQ(1, message.repeated_int64_size   ());
   1893   ASSERT_EQ(1, message.repeated_uint32_size  ());
   1894   ASSERT_EQ(1, message.repeated_uint64_size  ());
   1895   ASSERT_EQ(1, message.repeated_sint32_size  ());
   1896   ASSERT_EQ(1, message.repeated_sint64_size  ());
   1897   ASSERT_EQ(1, message.repeated_fixed32_size ());
   1898   ASSERT_EQ(1, message.repeated_fixed64_size ());
   1899   ASSERT_EQ(1, message.repeated_sfixed32_size());
   1900   ASSERT_EQ(1, message.repeated_sfixed64_size());
   1901   ASSERT_EQ(1, message.repeated_float_size   ());
   1902   ASSERT_EQ(1, message.repeated_double_size  ());
   1903   ASSERT_EQ(1, message.repeated_bool_size    ());
   1904   ASSERT_EQ(1, message.repeated_string_size  ());
   1905   ASSERT_EQ(1, message.repeated_bytes_size   ());
   1906 
   1907   ASSERT_EQ(1, message.repeatedgroup_size           ());
   1908   ASSERT_EQ(1, message.repeated_nested_message_size ());
   1909   ASSERT_EQ(1, message.repeated_foreign_message_size());
   1910   ASSERT_EQ(1, message.repeated_import_message_size ());
   1911   ASSERT_EQ(1, message.repeated_import_message_size ());
   1912   ASSERT_EQ(1, message.repeated_nested_enum_size    ());
   1913   ASSERT_EQ(1, message.repeated_foreign_enum_size   ());
   1914   ASSERT_EQ(1, message.repeated_import_enum_size    ());
   1915 
   1916 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
   1917   ASSERT_EQ(1, message.repeated_string_piece_size());
   1918   ASSERT_EQ(1, message.repeated_cord_size());
   1919 #endif
   1920 
   1921   // Test that the remaining element is the correct one.
   1922   EXPECT_EQ(201  , message.repeated_int32   (0));
   1923   EXPECT_EQ(202  , message.repeated_int64   (0));
   1924   EXPECT_EQ(203  , message.repeated_uint32  (0));
   1925   EXPECT_EQ(204  , message.repeated_uint64  (0));
   1926   EXPECT_EQ(205  , message.repeated_sint32  (0));
   1927   EXPECT_EQ(206  , message.repeated_sint64  (0));
   1928   EXPECT_EQ(207  , message.repeated_fixed32 (0));
   1929   EXPECT_EQ(208  , message.repeated_fixed64 (0));
   1930   EXPECT_EQ(209  , message.repeated_sfixed32(0));
   1931   EXPECT_EQ(210  , message.repeated_sfixed64(0));
   1932   EXPECT_EQ(211  , message.repeated_float   (0));
   1933   EXPECT_EQ(212  , message.repeated_double  (0));
   1934   EXPECT_TRUE(     message.repeated_bool    (0));
   1935   EXPECT_EQ("215", message.repeated_string  (0));
   1936   EXPECT_EQ("216", message.repeated_bytes   (0));
   1937 
   1938   EXPECT_EQ(217, message.repeatedgroup           (0).a());
   1939   EXPECT_EQ(218, message.repeated_nested_message (0).bb());
   1940   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
   1941   EXPECT_EQ(220, message.repeated_import_message (0).d());
   1942   EXPECT_EQ(220, message.repeated_import_message (0).d());
   1943 
   1944   EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));
   1945   EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));
   1946   EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));
   1947 }
   1948 
   1949 void TestUtil::ExpectLastRepeatedExtensionsRemoved(
   1950     const unittest::TestAllExtensions& message) {
   1951 
   1952   // Test that one element was removed.
   1953   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int32_extension   ));
   1954   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int64_extension   ));
   1955   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint32_extension  ));
   1956   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint64_extension  ));
   1957   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint32_extension  ));
   1958   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint64_extension  ));
   1959   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed32_extension ));
   1960   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed64_extension ));
   1961   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed32_extension));
   1962   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed64_extension));
   1963   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_float_extension   ));
   1964   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_double_extension  ));
   1965   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bool_extension    ));
   1966   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension  ));
   1967   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bytes_extension   ));
   1968 
   1969   ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   1970   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   1971   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   1972   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension ));
   1973   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   1974   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));
   1975   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));
   1976   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_enum_extension    ));
   1977 
   1978   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_piece_extension));
   1979   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_cord_extension));
   1980 
   1981   // Test that the remaining element is the correct one.
   1982   EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));
   1983   EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));
   1984   EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));
   1985   EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));
   1986   EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));
   1987   EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));
   1988   EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));
   1989   EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));
   1990   EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));
   1991   EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
   1992   EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));
   1993   EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));
   1994   EXPECT_TRUE(     message.GetExtension(unittest::repeated_bool_extension    , 0));
   1995   EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension  , 0));
   1996   EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension   , 0));
   1997 
   1998   EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());
   1999   EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());
   2000   EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());
   2001   EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());
   2002   EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension   , 0).bb());
   2003 
   2004   EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));
   2005   EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));
   2006   EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));
   2007 
   2008   EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0));
   2009   EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0));
   2010 }
   2011 
   2012 void TestUtil::ExpectLastRepeatedsReleased(
   2013     const unittest::TestAllTypes& message) {
   2014   ASSERT_EQ(1, message.repeatedgroup_size           ());
   2015   ASSERT_EQ(1, message.repeated_nested_message_size ());
   2016   ASSERT_EQ(1, message.repeated_foreign_message_size());
   2017   ASSERT_EQ(1, message.repeated_import_message_size ());
   2018   ASSERT_EQ(1, message.repeated_import_message_size ());
   2019 
   2020   EXPECT_EQ(217, message.repeatedgroup           (0).a());
   2021   EXPECT_EQ(218, message.repeated_nested_message (0).bb());
   2022   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
   2023   EXPECT_EQ(220, message.repeated_import_message (0).d());
   2024   EXPECT_EQ(220, message.repeated_import_message (0).d());
   2025 }
   2026 
   2027 void TestUtil::ExpectLastRepeatedExtensionsReleased(
   2028     const unittest::TestAllExtensions& message) {
   2029   ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   2030   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   2031   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   2032   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension ));
   2033   ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   2034 
   2035   EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());
   2036   EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());
   2037   EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());
   2038   EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());
   2039   EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension   , 0).bb());
   2040 }
   2041 
   2042 void TestUtil::ExpectRepeatedsSwapped(
   2043     const unittest::TestAllTypes& message) {
   2044   ASSERT_EQ(2, message.repeated_int32_size   ());
   2045   ASSERT_EQ(2, message.repeated_int64_size   ());
   2046   ASSERT_EQ(2, message.repeated_uint32_size  ());
   2047   ASSERT_EQ(2, message.repeated_uint64_size  ());
   2048   ASSERT_EQ(2, message.repeated_sint32_size  ());
   2049   ASSERT_EQ(2, message.repeated_sint64_size  ());
   2050   ASSERT_EQ(2, message.repeated_fixed32_size ());
   2051   ASSERT_EQ(2, message.repeated_fixed64_size ());
   2052   ASSERT_EQ(2, message.repeated_sfixed32_size());
   2053   ASSERT_EQ(2, message.repeated_sfixed64_size());
   2054   ASSERT_EQ(2, message.repeated_float_size   ());
   2055   ASSERT_EQ(2, message.repeated_double_size  ());
   2056   ASSERT_EQ(2, message.repeated_bool_size    ());
   2057   ASSERT_EQ(2, message.repeated_string_size  ());
   2058   ASSERT_EQ(2, message.repeated_bytes_size   ());
   2059 
   2060   ASSERT_EQ(2, message.repeatedgroup_size           ());
   2061   ASSERT_EQ(2, message.repeated_nested_message_size ());
   2062   ASSERT_EQ(2, message.repeated_foreign_message_size());
   2063   ASSERT_EQ(2, message.repeated_import_message_size ());
   2064   ASSERT_EQ(2, message.repeated_import_message_size ());
   2065   ASSERT_EQ(2, message.repeated_nested_enum_size    ());
   2066   ASSERT_EQ(2, message.repeated_foreign_enum_size   ());
   2067   ASSERT_EQ(2, message.repeated_import_enum_size    ());
   2068 
   2069 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
   2070   ASSERT_EQ(2, message.repeated_string_piece_size());
   2071   ASSERT_EQ(2, message.repeated_cord_size());
   2072 #endif
   2073 
   2074   // Test that the first element and second element are flipped.
   2075   EXPECT_EQ(201  , message.repeated_int32   (1));
   2076   EXPECT_EQ(202  , message.repeated_int64   (1));
   2077   EXPECT_EQ(203  , message.repeated_uint32  (1));
   2078   EXPECT_EQ(204  , message.repeated_uint64  (1));
   2079   EXPECT_EQ(205  , message.repeated_sint32  (1));
   2080   EXPECT_EQ(206  , message.repeated_sint64  (1));
   2081   EXPECT_EQ(207  , message.repeated_fixed32 (1));
   2082   EXPECT_EQ(208  , message.repeated_fixed64 (1));
   2083   EXPECT_EQ(209  , message.repeated_sfixed32(1));
   2084   EXPECT_EQ(210  , message.repeated_sfixed64(1));
   2085   EXPECT_EQ(211  , message.repeated_float   (1));
   2086   EXPECT_EQ(212  , message.repeated_double  (1));
   2087   EXPECT_TRUE(     message.repeated_bool    (1));
   2088   EXPECT_EQ("215", message.repeated_string  (1));
   2089   EXPECT_EQ("216", message.repeated_bytes   (1));
   2090 
   2091   EXPECT_EQ(217, message.repeatedgroup           (1).a());
   2092   EXPECT_EQ(218, message.repeated_nested_message (1).bb());
   2093   EXPECT_EQ(219, message.repeated_foreign_message(1).c());
   2094   EXPECT_EQ(220, message.repeated_import_message (1).d());
   2095   EXPECT_EQ(220, message.repeated_import_message (1).d());
   2096 
   2097   EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (1));
   2098   EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(1));
   2099   EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (1));
   2100 
   2101   EXPECT_EQ(301  , message.repeated_int32   (0));
   2102   EXPECT_EQ(302  , message.repeated_int64   (0));
   2103   EXPECT_EQ(303  , message.repeated_uint32  (0));
   2104   EXPECT_EQ(304  , message.repeated_uint64  (0));
   2105   EXPECT_EQ(305  , message.repeated_sint32  (0));
   2106   EXPECT_EQ(306  , message.repeated_sint64  (0));
   2107   EXPECT_EQ(307  , message.repeated_fixed32 (0));
   2108   EXPECT_EQ(308  , message.repeated_fixed64 (0));
   2109   EXPECT_EQ(309  , message.repeated_sfixed32(0));
   2110   EXPECT_EQ(310  , message.repeated_sfixed64(0));
   2111   EXPECT_EQ(311  , message.repeated_float   (0));
   2112   EXPECT_EQ(312  , message.repeated_double  (0));
   2113   EXPECT_FALSE(    message.repeated_bool    (0));
   2114   EXPECT_EQ("315", message.repeated_string  (0));
   2115   EXPECT_EQ("316", message.repeated_bytes   (0));
   2116 
   2117   EXPECT_EQ(317, message.repeatedgroup           (0).a());
   2118   EXPECT_EQ(318, message.repeated_nested_message (0).bb());
   2119   EXPECT_EQ(319, message.repeated_foreign_message(0).c());
   2120   EXPECT_EQ(320, message.repeated_import_message (0).d());
   2121   EXPECT_EQ(320, message.repeated_import_message (0).d());
   2122 
   2123   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (0));
   2124   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.repeated_foreign_enum(0));
   2125   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (0));
   2126 }
   2127 
   2128 void TestUtil::ExpectRepeatedExtensionsSwapped(
   2129     const unittest::TestAllExtensions& message) {
   2130 
   2131   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));
   2132   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));
   2133   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));
   2134   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));
   2135   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));
   2136   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));
   2137   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));
   2138   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));
   2139   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));
   2140   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));
   2141   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));
   2142   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));
   2143   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));
   2144   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));
   2145   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));
   2146 
   2147   ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));
   2148   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));
   2149   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));
   2150   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));
   2151   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension   ));
   2152   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));
   2153   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));
   2154   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));
   2155 
   2156   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));
   2157   ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));
   2158 
   2159   EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 1));
   2160   EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 1));
   2161   EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 1));
   2162   EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 1));
   2163   EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 1));
   2164   EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 1));
   2165   EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 1));
   2166   EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 1));
   2167   EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));
   2168   EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
   2169   EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 1));
   2170   EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 1));
   2171   EXPECT_TRUE(     message.GetExtension(unittest::repeated_bool_extension    , 1));
   2172   EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension  , 1));
   2173   EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension   , 1));
   2174 
   2175   EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());
   2176   EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());
   2177   EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());
   2178   EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 1).d());
   2179   EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension   , 1).bb());
   2180 
   2181   EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 1));
   2182   EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));
   2183   EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 1));
   2184 
   2185   EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 1));
   2186   EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 1));
   2187 
   2188   EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension   , 0));
   2189   EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension   , 0));
   2190   EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension  , 0));
   2191   EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension  , 0));
   2192   EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension  , 0));
   2193   EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension  , 0));
   2194   EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension , 0));
   2195   EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension , 0));
   2196   EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));
   2197   EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
   2198   EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension   , 0));
   2199   EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension  , 0));
   2200   EXPECT_FALSE(    message.GetExtension(unittest::repeated_bool_extension    , 0));
   2201   EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension  , 0));
   2202   EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension   , 0));
   2203 
   2204   EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());
   2205   EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());
   2206   EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());
   2207   EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 0).d());
   2208   EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension   , 0).bb());
   2209 
   2210   EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 0));
   2211   EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));
   2212   EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 0));
   2213 
   2214   EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 0));
   2215   EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 0));
   2216 }
   2217 
   2218 void TestUtil::SetOneof1(unittest::TestOneof2* message) {
   2219   message->mutable_foo_lazy_message()->set_qux_int(100);
   2220   message->set_bar_string("101");
   2221   message->set_baz_int(102);
   2222   message->set_baz_string("103");
   2223 }
   2224 
   2225 void TestUtil::SetOneof2(unittest::TestOneof2* message) {
   2226   message->set_foo_int(200);
   2227   message->set_bar_enum(unittest::TestOneof2::BAZ);
   2228   message->set_baz_int(202);
   2229   message->set_baz_string("203");
   2230 }
   2231 
   2232 void TestUtil::ExpectOneofSet1(const unittest::TestOneof2& message) {
   2233   ExpectAtMostOneFieldSetInOneof(message);
   2234 
   2235   EXPECT_TRUE(message.has_foo_lazy_message          ());
   2236   EXPECT_TRUE(message.foo_lazy_message().has_qux_int());
   2237 
   2238   EXPECT_TRUE(message.has_bar_string());
   2239   EXPECT_TRUE(message.has_baz_int   ());
   2240   EXPECT_TRUE(message.has_baz_string());
   2241 
   2242   ASSERT_EQ(0, message.foo_lazy_message().corge_int_size());
   2243 
   2244   EXPECT_EQ(100  , message.foo_lazy_message().qux_int());
   2245   EXPECT_EQ("101", message.bar_string                ());
   2246   EXPECT_EQ(102  , message.baz_int                   ());
   2247   EXPECT_EQ("103", message.baz_string                ());
   2248 }
   2249 
   2250 void TestUtil::ExpectOneofSet2(const unittest::TestOneof2& message) {
   2251   ExpectAtMostOneFieldSetInOneof(message);
   2252 
   2253   EXPECT_TRUE(message.has_foo_int   ());
   2254   EXPECT_TRUE(message.has_bar_enum  ());
   2255   EXPECT_TRUE(message.has_baz_int   ());
   2256   EXPECT_TRUE(message.has_baz_string());
   2257 
   2258   EXPECT_EQ(200                      , message.foo_int   ());
   2259   EXPECT_EQ(unittest::TestOneof2::BAZ, message.bar_enum  ());
   2260   EXPECT_EQ(202                      , message.baz_int   ());
   2261   EXPECT_EQ("203"                    , message.baz_string());
   2262 }
   2263 
   2264 void TestUtil::ExpectOneofClear(const unittest::TestOneof2& message) {
   2265   EXPECT_FALSE(message.has_foo_int());
   2266   EXPECT_FALSE(message.has_foo_string());
   2267   EXPECT_FALSE(message.has_foo_bytes());
   2268   EXPECT_FALSE(message.has_foo_enum());
   2269   EXPECT_FALSE(message.has_foo_message());
   2270   EXPECT_FALSE(message.has_foogroup());
   2271   EXPECT_FALSE(message.has_foo_lazy_message());
   2272 
   2273   EXPECT_FALSE(message.has_bar_int());
   2274   EXPECT_FALSE(message.has_bar_string());
   2275   EXPECT_FALSE(message.has_bar_bytes());
   2276   EXPECT_FALSE(message.has_bar_enum());
   2277 
   2278   EXPECT_FALSE(message.has_baz_int());
   2279   EXPECT_FALSE(message.has_baz_string());
   2280 
   2281   EXPECT_EQ(unittest::TestOneof2::FOO_NOT_SET, message.foo_case());
   2282   EXPECT_EQ(unittest::TestOneof2::BAR_NOT_SET, message.bar_case());
   2283 }
   2284 
   2285 void TestUtil::ExpectAtMostOneFieldSetInOneof(
   2286     const unittest::TestOneof2& message) {
   2287   int count = 0;
   2288   if (message.has_foo_int()) count++;
   2289   if (message.has_foo_string()) count++;
   2290   if (message.has_foo_bytes()) count++;
   2291   if (message.has_foo_enum()) count++;
   2292   if (message.has_foo_message()) count++;
   2293   if (message.has_foogroup()) count++;
   2294   if (message.has_foo_lazy_message()) count++;
   2295   EXPECT_LE(count, 1);
   2296   count = 0;
   2297   if (message.has_bar_int()) count++;
   2298   if (message.has_bar_string()) count++;
   2299   if (message.has_bar_bytes()) count++;
   2300   if (message.has_bar_enum()) count++;
   2301   EXPECT_TRUE(count == 0 || count == 1);
   2302 }
   2303 
   2304 // ===================================================================
   2305 
   2306 TestUtil::ReflectionTester::ReflectionTester(
   2307     const Descriptor* base_descriptor)
   2308   : base_descriptor_(base_descriptor) {
   2309 
   2310   const DescriptorPool* pool = base_descriptor->file()->pool();
   2311 
   2312   nested_b_ =
   2313     pool->FindFieldByName("protobuf_unittest.TestAllTypes.NestedMessage.bb");
   2314   foreign_c_ =
   2315     pool->FindFieldByName("protobuf_unittest.ForeignMessage.c");
   2316   import_d_ =
   2317     pool->FindFieldByName("protobuf_unittest_import.ImportMessage.d");
   2318   import_e_ =
   2319     pool->FindFieldByName("protobuf_unittest_import.PublicImportMessage.e");
   2320   nested_foo_ =
   2321     pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.FOO");
   2322   nested_bar_ =
   2323     pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAR");
   2324   nested_baz_ =
   2325     pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAZ");
   2326   foreign_foo_ =
   2327     pool->FindEnumValueByName("protobuf_unittest.FOREIGN_FOO");
   2328   foreign_bar_ =
   2329     pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAR");
   2330   foreign_baz_ =
   2331     pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAZ");
   2332   import_foo_ =
   2333     pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_FOO");
   2334   import_bar_ =
   2335     pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAR");
   2336   import_baz_ =
   2337     pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAZ");
   2338 
   2339   if (base_descriptor_->name() == "TestAllExtensions") {
   2340     group_a_ =
   2341       pool->FindFieldByName("protobuf_unittest.OptionalGroup_extension.a");
   2342     repeated_group_a_ =
   2343       pool->FindFieldByName("protobuf_unittest.RepeatedGroup_extension.a");
   2344   } else {
   2345     group_a_ =
   2346       pool->FindFieldByName("protobuf_unittest.TestAllTypes.OptionalGroup.a");
   2347     repeated_group_a_ =
   2348       pool->FindFieldByName("protobuf_unittest.TestAllTypes.RepeatedGroup.a");
   2349   }
   2350 
   2351   EXPECT_TRUE(group_a_          != NULL);
   2352   EXPECT_TRUE(repeated_group_a_ != NULL);
   2353   EXPECT_TRUE(nested_b_         != NULL);
   2354   EXPECT_TRUE(foreign_c_        != NULL);
   2355   EXPECT_TRUE(import_d_         != NULL);
   2356   EXPECT_TRUE(import_e_         != NULL);
   2357   EXPECT_TRUE(nested_foo_       != NULL);
   2358   EXPECT_TRUE(nested_bar_       != NULL);
   2359   EXPECT_TRUE(nested_baz_       != NULL);
   2360   EXPECT_TRUE(foreign_foo_      != NULL);
   2361   EXPECT_TRUE(foreign_bar_      != NULL);
   2362   EXPECT_TRUE(foreign_baz_      != NULL);
   2363   EXPECT_TRUE(import_foo_       != NULL);
   2364   EXPECT_TRUE(import_bar_       != NULL);
   2365   EXPECT_TRUE(import_baz_       != NULL);
   2366 }
   2367 
   2368 // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
   2369 const FieldDescriptor* TestUtil::ReflectionTester::F(const string& name) {
   2370   const FieldDescriptor* result = NULL;
   2371   if (base_descriptor_->name() == "TestAllExtensions" ||
   2372       base_descriptor_->name() == "TestPackedExtensions") {
   2373     result = base_descriptor_->file()->FindExtensionByName(name + "_extension");
   2374   } else {
   2375     result = base_descriptor_->FindFieldByName(name);
   2376   }
   2377   GOOGLE_CHECK(result != NULL);
   2378   return result;
   2379 }
   2380 
   2381 // -------------------------------------------------------------------
   2382 
   2383 void TestUtil::ReflectionTester::SetAllFieldsViaReflection(Message* message) {
   2384   const Reflection* reflection = message->GetReflection();
   2385   Message* sub_message;
   2386 
   2387   reflection->SetInt32 (message, F("optional_int32"   ), 101);
   2388   reflection->SetInt64 (message, F("optional_int64"   ), 102);
   2389   reflection->SetUInt32(message, F("optional_uint32"  ), 103);
   2390   reflection->SetUInt64(message, F("optional_uint64"  ), 104);
   2391   reflection->SetInt32 (message, F("optional_sint32"  ), 105);
   2392   reflection->SetInt64 (message, F("optional_sint64"  ), 106);
   2393   reflection->SetUInt32(message, F("optional_fixed32" ), 107);
   2394   reflection->SetUInt64(message, F("optional_fixed64" ), 108);
   2395   reflection->SetInt32 (message, F("optional_sfixed32"), 109);
   2396   reflection->SetInt64 (message, F("optional_sfixed64"), 110);
   2397   reflection->SetFloat (message, F("optional_float"   ), 111);
   2398   reflection->SetDouble(message, F("optional_double"  ), 112);
   2399   reflection->SetBool  (message, F("optional_bool"    ), true);
   2400   reflection->SetString(message, F("optional_string"  ), "115");
   2401   reflection->SetString(message, F("optional_bytes"   ), "116");
   2402 
   2403   sub_message = reflection->MutableMessage(message, F("optionalgroup"));
   2404   sub_message->GetReflection()->SetInt32(sub_message, group_a_, 117);
   2405   sub_message = reflection->MutableMessage(message, F("optional_nested_message"));
   2406   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 118);
   2407   sub_message = reflection->MutableMessage(message, F("optional_foreign_message"));
   2408   sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 119);
   2409   sub_message = reflection->MutableMessage(message, F("optional_import_message"));
   2410   sub_message->GetReflection()->SetInt32(sub_message, import_d_, 120);
   2411 
   2412   reflection->SetEnum(message, F("optional_nested_enum" ),  nested_baz_);
   2413   reflection->SetEnum(message, F("optional_foreign_enum"), foreign_baz_);
   2414   reflection->SetEnum(message, F("optional_import_enum" ),  import_baz_);
   2415 
   2416   reflection->SetString(message, F("optional_string_piece"), "124");
   2417   reflection->SetString(message, F("optional_cord"), "125");
   2418 
   2419   sub_message = reflection->MutableMessage(message, F("optional_public_import_message"));
   2420   sub_message->GetReflection()->SetInt32(sub_message, import_e_, 126);
   2421 
   2422   sub_message = reflection->MutableMessage(message, F("optional_lazy_message"));
   2423   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 127);
   2424 
   2425   // -----------------------------------------------------------------
   2426 
   2427   reflection->AddInt32 (message, F("repeated_int32"   ), 201);
   2428   reflection->AddInt64 (message, F("repeated_int64"   ), 202);
   2429   reflection->AddUInt32(message, F("repeated_uint32"  ), 203);
   2430   reflection->AddUInt64(message, F("repeated_uint64"  ), 204);
   2431   reflection->AddInt32 (message, F("repeated_sint32"  ), 205);
   2432   reflection->AddInt64 (message, F("repeated_sint64"  ), 206);
   2433   reflection->AddUInt32(message, F("repeated_fixed32" ), 207);
   2434   reflection->AddUInt64(message, F("repeated_fixed64" ), 208);
   2435   reflection->AddInt32 (message, F("repeated_sfixed32"), 209);
   2436   reflection->AddInt64 (message, F("repeated_sfixed64"), 210);
   2437   reflection->AddFloat (message, F("repeated_float"   ), 211);
   2438   reflection->AddDouble(message, F("repeated_double"  ), 212);
   2439   reflection->AddBool  (message, F("repeated_bool"    ), true);
   2440   reflection->AddString(message, F("repeated_string"  ), "215");
   2441   reflection->AddString(message, F("repeated_bytes"   ), "216");
   2442 
   2443   sub_message = reflection->AddMessage(message, F("repeatedgroup"));
   2444   sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 217);
   2445   sub_message = reflection->AddMessage(message, F("repeated_nested_message"));
   2446   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 218);
   2447   sub_message = reflection->AddMessage(message, F("repeated_foreign_message"));
   2448   sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 219);
   2449   sub_message = reflection->AddMessage(message, F("repeated_import_message"));
   2450   sub_message->GetReflection()->SetInt32(sub_message, import_d_, 220);
   2451   sub_message = reflection->AddMessage(message, F("repeated_lazy_message"));
   2452   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 227);
   2453 
   2454   reflection->AddEnum(message, F("repeated_nested_enum" ),  nested_bar_);
   2455   reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_bar_);
   2456   reflection->AddEnum(message, F("repeated_import_enum" ),  import_bar_);
   2457 
   2458   reflection->AddString(message, F("repeated_string_piece"), "224");
   2459   reflection->AddString(message, F("repeated_cord"), "225");
   2460 
   2461   // Add a second one of each field.
   2462   reflection->AddInt32 (message, F("repeated_int32"   ), 301);
   2463   reflection->AddInt64 (message, F("repeated_int64"   ), 302);
   2464   reflection->AddUInt32(message, F("repeated_uint32"  ), 303);
   2465   reflection->AddUInt64(message, F("repeated_uint64"  ), 304);
   2466   reflection->AddInt32 (message, F("repeated_sint32"  ), 305);
   2467   reflection->AddInt64 (message, F("repeated_sint64"  ), 306);
   2468   reflection->AddUInt32(message, F("repeated_fixed32" ), 307);
   2469   reflection->AddUInt64(message, F("repeated_fixed64" ), 308);
   2470   reflection->AddInt32 (message, F("repeated_sfixed32"), 309);
   2471   reflection->AddInt64 (message, F("repeated_sfixed64"), 310);
   2472   reflection->AddFloat (message, F("repeated_float"   ), 311);
   2473   reflection->AddDouble(message, F("repeated_double"  ), 312);
   2474   reflection->AddBool  (message, F("repeated_bool"    ), false);
   2475   reflection->AddString(message, F("repeated_string"  ), "315");
   2476   reflection->AddString(message, F("repeated_bytes"   ), "316");
   2477 
   2478   sub_message = reflection->AddMessage(message, F("repeatedgroup"));
   2479   sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 317);
   2480   sub_message = reflection->AddMessage(message, F("repeated_nested_message"));
   2481   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 318);
   2482   sub_message = reflection->AddMessage(message, F("repeated_foreign_message"));
   2483   sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 319);
   2484   sub_message = reflection->AddMessage(message, F("repeated_import_message"));
   2485   sub_message->GetReflection()->SetInt32(sub_message, import_d_, 320);
   2486   sub_message = reflection->AddMessage(message, F("repeated_lazy_message"));
   2487   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 327);
   2488 
   2489   reflection->AddEnum(message, F("repeated_nested_enum" ),  nested_baz_);
   2490   reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_baz_);
   2491   reflection->AddEnum(message, F("repeated_import_enum" ),  import_baz_);
   2492 
   2493   reflection->AddString(message, F("repeated_string_piece"), "324");
   2494   reflection->AddString(message, F("repeated_cord"), "325");
   2495 
   2496   // -----------------------------------------------------------------
   2497 
   2498   reflection->SetInt32 (message, F("default_int32"   ), 401);
   2499   reflection->SetInt64 (message, F("default_int64"   ), 402);
   2500   reflection->SetUInt32(message, F("default_uint32"  ), 403);
   2501   reflection->SetUInt64(message, F("default_uint64"  ), 404);
   2502   reflection->SetInt32 (message, F("default_sint32"  ), 405);
   2503   reflection->SetInt64 (message, F("default_sint64"  ), 406);
   2504   reflection->SetUInt32(message, F("default_fixed32" ), 407);
   2505   reflection->SetUInt64(message, F("default_fixed64" ), 408);
   2506   reflection->SetInt32 (message, F("default_sfixed32"), 409);
   2507   reflection->SetInt64 (message, F("default_sfixed64"), 410);
   2508   reflection->SetFloat (message, F("default_float"   ), 411);
   2509   reflection->SetDouble(message, F("default_double"  ), 412);
   2510   reflection->SetBool  (message, F("default_bool"    ), false);
   2511   reflection->SetString(message, F("default_string"  ), "415");
   2512   reflection->SetString(message, F("default_bytes"   ), "416");
   2513 
   2514   reflection->SetEnum(message, F("default_nested_enum" ),  nested_foo_);
   2515   reflection->SetEnum(message, F("default_foreign_enum"), foreign_foo_);
   2516   reflection->SetEnum(message, F("default_import_enum" ),  import_foo_);
   2517 
   2518   reflection->SetString(message, F("default_string_piece"), "424");
   2519   reflection->SetString(message, F("default_cord"), "425");
   2520 
   2521   reflection->SetUInt32(message, F("oneof_uint32"   ), 601);
   2522   sub_message = reflection->MutableMessage(message, F("oneof_nested_message"));
   2523   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 602);
   2524   reflection->SetString(message, F("oneof_string"), "603");
   2525   reflection->SetString(message, F("oneof_bytes" ), "604");
   2526 }
   2527 
   2528 void TestUtil::ReflectionTester::SetOneofViaReflection(Message* message) {
   2529   const Descriptor* descriptor = message->GetDescriptor();
   2530   const Reflection* reflection = message->GetReflection();
   2531   Message* sub_message = reflection->MutableMessage(
   2532       message, descriptor->FindFieldByName("foo_lazy_message"));
   2533   sub_message->GetReflection()->SetInt64(
   2534       sub_message,
   2535       descriptor->file()->pool()->FindFieldByName(
   2536           "protobuf_unittest.TestOneof2.NestedMessage.qux_int"),
   2537       100);
   2538 
   2539   reflection->SetString(message,
   2540                         descriptor->FindFieldByName("bar_cord"),
   2541                         "101");
   2542   reflection->SetInt32(message,
   2543                         descriptor->FindFieldByName("baz_int"),
   2544                        102);
   2545   reflection->SetString(message,
   2546                         descriptor->FindFieldByName("baz_string"),
   2547                         "103");
   2548 }
   2549 
   2550 void TestUtil::ReflectionTester::ExpectOneofSetViaReflection(
   2551     const Message& message) {
   2552   const Descriptor* descriptor = message.GetDescriptor();
   2553   const Reflection* reflection = message.GetReflection();
   2554   string scratch;
   2555   EXPECT_TRUE(reflection->HasField(
   2556       message, descriptor->FindFieldByName("foo_lazy_message")));
   2557   EXPECT_TRUE(reflection->HasField(
   2558       message, descriptor->FindFieldByName("bar_cord")));
   2559   EXPECT_TRUE(reflection->HasField(
   2560       message, descriptor->FindFieldByName("baz_int")));
   2561   EXPECT_TRUE(reflection->HasField(
   2562       message, descriptor->FindFieldByName("baz_string")));
   2563 
   2564   const Message* sub_message = &reflection->GetMessage(
   2565       message, descriptor->FindFieldByName("foo_lazy_message"));
   2566   EXPECT_EQ(100, sub_message->GetReflection()->GetInt64(
   2567       *sub_message,
   2568       descriptor->file()->pool()->FindFieldByName(
   2569           "protobuf_unittest.TestOneof2.NestedMessage.qux_int")));
   2570 
   2571   EXPECT_EQ("101", reflection->GetString(
   2572       message, descriptor->FindFieldByName("bar_cord")));
   2573   EXPECT_EQ("101", reflection->GetStringReference(
   2574       message, descriptor->FindFieldByName("bar_cord"), &scratch));
   2575 
   2576   EXPECT_EQ(102, reflection->GetInt32(
   2577       message, descriptor->FindFieldByName("baz_int")));
   2578 
   2579   EXPECT_EQ("103", reflection->GetString(
   2580       message, descriptor->FindFieldByName("baz_string")));
   2581   EXPECT_EQ("103", reflection->GetStringReference(
   2582       message, descriptor->FindFieldByName("baz_string"), &scratch));
   2583 }
   2584 
   2585 void TestUtil::ReflectionTester::SetPackedFieldsViaReflection(
   2586     Message* message) {
   2587   const Reflection* reflection = message->GetReflection();
   2588   reflection->AddInt32 (message, F("packed_int32"   ), 601);
   2589   reflection->AddInt64 (message, F("packed_int64"   ), 602);
   2590   reflection->AddUInt32(message, F("packed_uint32"  ), 603);
   2591   reflection->AddUInt64(message, F("packed_uint64"  ), 604);
   2592   reflection->AddInt32 (message, F("packed_sint32"  ), 605);
   2593   reflection->AddInt64 (message, F("packed_sint64"  ), 606);
   2594   reflection->AddUInt32(message, F("packed_fixed32" ), 607);
   2595   reflection->AddUInt64(message, F("packed_fixed64" ), 608);
   2596   reflection->AddInt32 (message, F("packed_sfixed32"), 609);
   2597   reflection->AddInt64 (message, F("packed_sfixed64"), 610);
   2598   reflection->AddFloat (message, F("packed_float"   ), 611);
   2599   reflection->AddDouble(message, F("packed_double"  ), 612);
   2600   reflection->AddBool  (message, F("packed_bool"    ), true);
   2601   reflection->AddEnum  (message, F("packed_enum"    ), foreign_bar_);
   2602 
   2603   reflection->AddInt32 (message, F("packed_int32"   ), 701);
   2604   reflection->AddInt64 (message, F("packed_int64"   ), 702);
   2605   reflection->AddUInt32(message, F("packed_uint32"  ), 703);
   2606   reflection->AddUInt64(message, F("packed_uint64"  ), 704);
   2607   reflection->AddInt32 (message, F("packed_sint32"  ), 705);
   2608   reflection->AddInt64 (message, F("packed_sint64"  ), 706);
   2609   reflection->AddUInt32(message, F("packed_fixed32" ), 707);
   2610   reflection->AddUInt64(message, F("packed_fixed64" ), 708);
   2611   reflection->AddInt32 (message, F("packed_sfixed32"), 709);
   2612   reflection->AddInt64 (message, F("packed_sfixed64"), 710);
   2613   reflection->AddFloat (message, F("packed_float"   ), 711);
   2614   reflection->AddDouble(message, F("packed_double"  ), 712);
   2615   reflection->AddBool  (message, F("packed_bool"    ), false);
   2616   reflection->AddEnum  (message, F("packed_enum"    ), foreign_baz_);
   2617 }
   2618 
   2619 // -------------------------------------------------------------------
   2620 
   2621 void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection(
   2622     const Message& message) {
   2623   // We have to split this into three function otherwise it creates a stack
   2624   // frame so large that it triggers a warning.
   2625   ExpectAllFieldsSetViaReflection1(message);
   2626   ExpectAllFieldsSetViaReflection2(message);
   2627   ExpectAllFieldsSetViaReflection3(message);
   2628 }
   2629 
   2630 void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection1(
   2631     const Message& message) {
   2632   const Reflection* reflection = message.GetReflection();
   2633   string scratch;
   2634   const Message* sub_message;
   2635 
   2636   EXPECT_TRUE(reflection->HasField(message, F("optional_int32"   )));
   2637   EXPECT_TRUE(reflection->HasField(message, F("optional_int64"   )));
   2638   EXPECT_TRUE(reflection->HasField(message, F("optional_uint32"  )));
   2639   EXPECT_TRUE(reflection->HasField(message, F("optional_uint64"  )));
   2640   EXPECT_TRUE(reflection->HasField(message, F("optional_sint32"  )));
   2641   EXPECT_TRUE(reflection->HasField(message, F("optional_sint64"  )));
   2642   EXPECT_TRUE(reflection->HasField(message, F("optional_fixed32" )));
   2643   EXPECT_TRUE(reflection->HasField(message, F("optional_fixed64" )));
   2644   EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed32")));
   2645   EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed64")));
   2646   EXPECT_TRUE(reflection->HasField(message, F("optional_float"   )));
   2647   EXPECT_TRUE(reflection->HasField(message, F("optional_double"  )));
   2648   EXPECT_TRUE(reflection->HasField(message, F("optional_bool"    )));
   2649   EXPECT_TRUE(reflection->HasField(message, F("optional_string"  )));
   2650   EXPECT_TRUE(reflection->HasField(message, F("optional_bytes"   )));
   2651 
   2652   EXPECT_TRUE(reflection->HasField(message, F("optionalgroup"                 )));
   2653   EXPECT_TRUE(reflection->HasField(message, F("optional_nested_message"       )));
   2654   EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_message"      )));
   2655   EXPECT_TRUE(reflection->HasField(message, F("optional_import_message"       )));
   2656   EXPECT_TRUE(reflection->HasField(message, F("optional_public_import_message")));
   2657   EXPECT_TRUE(reflection->HasField(message, F("optional_lazy_message"         )));
   2658 
   2659   sub_message = &reflection->GetMessage(message, F("optionalgroup"));
   2660   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, group_a_));
   2661   sub_message = &reflection->GetMessage(message, F("optional_nested_message"));
   2662   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));
   2663   sub_message = &reflection->GetMessage(message, F("optional_foreign_message"));
   2664   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_));
   2665   sub_message = &reflection->GetMessage(message, F("optional_import_message"));
   2666   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_d_));
   2667   sub_message = &reflection->GetMessage(message, F("optional_public_import_message"));
   2668   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_e_));
   2669   sub_message = &reflection->GetMessage(message, F("optional_lazy_message"));
   2670   EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));
   2671 
   2672   EXPECT_TRUE(reflection->HasField(message, F("optional_nested_enum" )));
   2673   EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_enum")));
   2674   EXPECT_TRUE(reflection->HasField(message, F("optional_import_enum" )));
   2675 
   2676   EXPECT_TRUE(reflection->HasField(message, F("optional_string_piece")));
   2677   EXPECT_TRUE(reflection->HasField(message, F("optional_cord")));
   2678 
   2679   EXPECT_EQ(101  , reflection->GetInt32 (message, F("optional_int32"   )));
   2680   EXPECT_EQ(102  , reflection->GetInt64 (message, F("optional_int64"   )));
   2681   EXPECT_EQ(103  , reflection->GetUInt32(message, F("optional_uint32"  )));
   2682   EXPECT_EQ(104  , reflection->GetUInt64(message, F("optional_uint64"  )));
   2683   EXPECT_EQ(105  , reflection->GetInt32 (message, F("optional_sint32"  )));
   2684   EXPECT_EQ(106  , reflection->GetInt64 (message, F("optional_sint64"  )));
   2685   EXPECT_EQ(107  , reflection->GetUInt32(message, F("optional_fixed32" )));
   2686   EXPECT_EQ(108  , reflection->GetUInt64(message, F("optional_fixed64" )));
   2687   EXPECT_EQ(109  , reflection->GetInt32 (message, F("optional_sfixed32")));
   2688   EXPECT_EQ(110  , reflection->GetInt64 (message, F("optional_sfixed64")));
   2689   EXPECT_EQ(111  , reflection->GetFloat (message, F("optional_float"   )));
   2690   EXPECT_EQ(112  , reflection->GetDouble(message, F("optional_double"  )));
   2691   EXPECT_TRUE(     reflection->GetBool  (message, F("optional_bool"    )));
   2692   EXPECT_EQ("115", reflection->GetString(message, F("optional_string"  )));
   2693   EXPECT_EQ("116", reflection->GetString(message, F("optional_bytes"   )));
   2694 
   2695   EXPECT_EQ("115", reflection->GetStringReference(message, F("optional_string"), &scratch));
   2696   EXPECT_EQ("116", reflection->GetStringReference(message, F("optional_bytes" ), &scratch));
   2697 
   2698   sub_message = &reflection->GetMessage(message, F("optionalgroup"));
   2699   EXPECT_EQ(117, sub_message->GetReflection()->GetInt32(*sub_message, group_a_));
   2700   sub_message = &reflection->GetMessage(message, F("optional_nested_message"));
   2701   EXPECT_EQ(118, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2702   sub_message = &reflection->GetMessage(message, F("optional_foreign_message"));
   2703   EXPECT_EQ(119, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));
   2704   sub_message = &reflection->GetMessage(message, F("optional_import_message"));
   2705   EXPECT_EQ(120, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));
   2706   sub_message = &reflection->GetMessage(message, F("optional_public_import_message"));
   2707   EXPECT_EQ(126, sub_message->GetReflection()->GetInt32(*sub_message, import_e_));
   2708   sub_message = &reflection->GetMessage(message, F("optional_lazy_message"));
   2709   EXPECT_EQ(127, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2710 
   2711   EXPECT_EQ( nested_baz_, reflection->GetEnum(message, F("optional_nested_enum" )));
   2712   EXPECT_EQ(foreign_baz_, reflection->GetEnum(message, F("optional_foreign_enum")));
   2713   EXPECT_EQ( import_baz_, reflection->GetEnum(message, F("optional_import_enum" )));
   2714 
   2715   EXPECT_EQ("124", reflection->GetString(message, F("optional_string_piece")));
   2716   EXPECT_EQ("124", reflection->GetStringReference(message, F("optional_string_piece"), &scratch));
   2717 
   2718   EXPECT_EQ("125", reflection->GetString(message, F("optional_cord")));
   2719   EXPECT_EQ("125", reflection->GetStringReference(message, F("optional_cord"), &scratch));
   2720 
   2721   EXPECT_TRUE(reflection->HasField(message, F("oneof_bytes" )));
   2722   EXPECT_EQ("604", reflection->GetString(message, F("oneof_bytes"   )));
   2723 
   2724   if (base_descriptor_->name() == "TestAllTypes") {
   2725     EXPECT_FALSE(reflection->HasField(message, F("oneof_uint32")));
   2726     EXPECT_FALSE(reflection->HasField(message, F("oneof_string")));
   2727   } else {
   2728     EXPECT_TRUE(reflection->HasField(message, F("oneof_uint32")));
   2729     EXPECT_TRUE(reflection->HasField(message, F("oneof_string")));
   2730     EXPECT_EQ(601  , reflection->GetUInt32(message, F("oneof_uint32")));
   2731     EXPECT_EQ("603", reflection->GetString(message, F("oneof_string")));
   2732     sub_message = &reflection->GetMessage(message, F("oneof_nested_message"));
   2733     EXPECT_EQ(602, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2734   }
   2735 }
   2736 
   2737 void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2(
   2738     const Message& message) {
   2739   const Reflection* reflection = message.GetReflection();
   2740   string scratch;
   2741   const Message* sub_message;
   2742 
   2743   // -----------------------------------------------------------------
   2744 
   2745   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int32"   )));
   2746   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int64"   )));
   2747   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint32"  )));
   2748   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint64"  )));
   2749   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint32"  )));
   2750   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint64"  )));
   2751   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed32" )));
   2752   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed64" )));
   2753   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed32")));
   2754   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed64")));
   2755   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_float"   )));
   2756   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_double"  )));
   2757   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bool"    )));
   2758   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string"  )));
   2759   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bytes"   )));
   2760 
   2761   ASSERT_EQ(2, reflection->FieldSize(message, F("repeatedgroup"           )));
   2762   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_message" )));
   2763   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_message")));
   2764   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_message" )));
   2765   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_lazy_message"   )));
   2766   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_enum"    )));
   2767   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_enum"   )));
   2768   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_enum"    )));
   2769 
   2770   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string_piece")));
   2771   ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_cord")));
   2772 
   2773   EXPECT_EQ(201  , reflection->GetRepeatedInt32 (message, F("repeated_int32"   ), 0));
   2774   EXPECT_EQ(202  , reflection->GetRepeatedInt64 (message, F("repeated_int64"   ), 0));
   2775   EXPECT_EQ(203  , reflection->GetRepeatedUInt32(message, F("repeated_uint32"  ), 0));
   2776   EXPECT_EQ(204  , reflection->GetRepeatedUInt64(message, F("repeated_uint64"  ), 0));
   2777   EXPECT_EQ(205  , reflection->GetRepeatedInt32 (message, F("repeated_sint32"  ), 0));
   2778   EXPECT_EQ(206  , reflection->GetRepeatedInt64 (message, F("repeated_sint64"  ), 0));
   2779   EXPECT_EQ(207  , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 0));
   2780   EXPECT_EQ(208  , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 0));
   2781   EXPECT_EQ(209  , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 0));
   2782   EXPECT_EQ(210  , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 0));
   2783   EXPECT_EQ(211  , reflection->GetRepeatedFloat (message, F("repeated_float"   ), 0));
   2784   EXPECT_EQ(212  , reflection->GetRepeatedDouble(message, F("repeated_double"  ), 0));
   2785   EXPECT_TRUE(     reflection->GetRepeatedBool  (message, F("repeated_bool"    ), 0));
   2786   EXPECT_EQ("215", reflection->GetRepeatedString(message, F("repeated_string"  ), 0));
   2787   EXPECT_EQ("216", reflection->GetRepeatedString(message, F("repeated_bytes"   ), 0));
   2788 
   2789   EXPECT_EQ("215", reflection->GetRepeatedStringReference(message, F("repeated_string"), 0, &scratch));
   2790   EXPECT_EQ("216", reflection->GetRepeatedStringReference(message, F("repeated_bytes"), 0, &scratch));
   2791 
   2792   sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 0);
   2793   EXPECT_EQ(217, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_));
   2794   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 0);
   2795   EXPECT_EQ(218, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2796   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 0);
   2797   EXPECT_EQ(219, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));
   2798   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 0);
   2799   EXPECT_EQ(220, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));
   2800   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_lazy_message"), 0);
   2801   EXPECT_EQ(227, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2802 
   2803   EXPECT_EQ( nested_bar_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),0));
   2804   EXPECT_EQ(foreign_bar_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),0));
   2805   EXPECT_EQ( import_bar_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),0));
   2806 
   2807   EXPECT_EQ("224", reflection->GetRepeatedString(message, F("repeated_string_piece"), 0));
   2808   EXPECT_EQ("224", reflection->GetRepeatedStringReference(
   2809                         message, F("repeated_string_piece"), 0, &scratch));
   2810 
   2811   EXPECT_EQ("225", reflection->GetRepeatedString(message, F("repeated_cord"), 0));
   2812   EXPECT_EQ("225", reflection->GetRepeatedStringReference(
   2813                         message, F("repeated_cord"), 0, &scratch));
   2814 
   2815   EXPECT_EQ(301  , reflection->GetRepeatedInt32 (message, F("repeated_int32"   ), 1));
   2816   EXPECT_EQ(302  , reflection->GetRepeatedInt64 (message, F("repeated_int64"   ), 1));
   2817   EXPECT_EQ(303  , reflection->GetRepeatedUInt32(message, F("repeated_uint32"  ), 1));
   2818   EXPECT_EQ(304  , reflection->GetRepeatedUInt64(message, F("repeated_uint64"  ), 1));
   2819   EXPECT_EQ(305  , reflection->GetRepeatedInt32 (message, F("repeated_sint32"  ), 1));
   2820   EXPECT_EQ(306  , reflection->GetRepeatedInt64 (message, F("repeated_sint64"  ), 1));
   2821   EXPECT_EQ(307  , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 1));
   2822   EXPECT_EQ(308  , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 1));
   2823   EXPECT_EQ(309  , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 1));
   2824   EXPECT_EQ(310  , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 1));
   2825   EXPECT_EQ(311  , reflection->GetRepeatedFloat (message, F("repeated_float"   ), 1));
   2826   EXPECT_EQ(312  , reflection->GetRepeatedDouble(message, F("repeated_double"  ), 1));
   2827   EXPECT_FALSE(    reflection->GetRepeatedBool  (message, F("repeated_bool"    ), 1));
   2828   EXPECT_EQ("315", reflection->GetRepeatedString(message, F("repeated_string"  ), 1));
   2829   EXPECT_EQ("316", reflection->GetRepeatedString(message, F("repeated_bytes"   ), 1));
   2830 
   2831   EXPECT_EQ("315", reflection->GetRepeatedStringReference(message, F("repeated_string"),
   2832                                                           1, &scratch));
   2833   EXPECT_EQ("316", reflection->GetRepeatedStringReference(message, F("repeated_bytes"),
   2834                                                           1, &scratch));
   2835 
   2836   sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 1);
   2837   EXPECT_EQ(317, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_));
   2838   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 1);
   2839   EXPECT_EQ(318, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2840   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 1);
   2841   EXPECT_EQ(319, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));
   2842   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 1);
   2843   EXPECT_EQ(320, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));
   2844   sub_message = &reflection->GetRepeatedMessage(message, F("repeated_lazy_message"), 1);
   2845   EXPECT_EQ(327, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   2846 
   2847   EXPECT_EQ( nested_baz_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),1));
   2848   EXPECT_EQ(foreign_baz_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),1));
   2849   EXPECT_EQ( import_baz_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),1));
   2850 
   2851   EXPECT_EQ("324", reflection->GetRepeatedString(message, F("repeated_string_piece"), 1));
   2852   EXPECT_EQ("324", reflection->GetRepeatedStringReference(
   2853                         message, F("repeated_string_piece"), 1, &scratch));
   2854 
   2855   EXPECT_EQ("325", reflection->GetRepeatedString(message, F("repeated_cord"), 1));
   2856   EXPECT_EQ("325", reflection->GetRepeatedStringReference(
   2857                         message, F("repeated_cord"), 1, &scratch));
   2858 }
   2859 
   2860 void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection3(
   2861     const Message& message) {
   2862   const Reflection* reflection = message.GetReflection();
   2863   string scratch;
   2864 
   2865   // -----------------------------------------------------------------
   2866 
   2867   EXPECT_TRUE(reflection->HasField(message, F("default_int32"   )));
   2868   EXPECT_TRUE(reflection->HasField(message, F("default_int64"   )));
   2869   EXPECT_TRUE(reflection->HasField(message, F("default_uint32"  )));
   2870   EXPECT_TRUE(reflection->HasField(message, F("default_uint64"  )));
   2871   EXPECT_TRUE(reflection->HasField(message, F("default_sint32"  )));
   2872   EXPECT_TRUE(reflection->HasField(message, F("default_sint64"  )));
   2873   EXPECT_TRUE(reflection->HasField(message, F("default_fixed32" )));
   2874   EXPECT_TRUE(reflection->HasField(message, F("default_fixed64" )));
   2875   EXPECT_TRUE(reflection->HasField(message, F("default_sfixed32")));
   2876   EXPECT_TRUE(reflection->HasField(message, F("default_sfixed64")));
   2877   EXPECT_TRUE(reflection->HasField(message, F("default_float"   )));
   2878   EXPECT_TRUE(reflection->HasField(message, F("default_double"  )));
   2879   EXPECT_TRUE(reflection->HasField(message, F("default_bool"    )));
   2880   EXPECT_TRUE(reflection->HasField(message, F("default_string"  )));
   2881   EXPECT_TRUE(reflection->HasField(message, F("default_bytes"   )));
   2882 
   2883   EXPECT_TRUE(reflection->HasField(message, F("default_nested_enum" )));
   2884   EXPECT_TRUE(reflection->HasField(message, F("default_foreign_enum")));
   2885   EXPECT_TRUE(reflection->HasField(message, F("default_import_enum" )));
   2886 
   2887   EXPECT_TRUE(reflection->HasField(message, F("default_string_piece")));
   2888   EXPECT_TRUE(reflection->HasField(message, F("default_cord")));
   2889 
   2890   EXPECT_EQ(401  , reflection->GetInt32 (message, F("default_int32"   )));
   2891   EXPECT_EQ(402  , reflection->GetInt64 (message, F("default_int64"   )));
   2892   EXPECT_EQ(403  , reflection->GetUInt32(message, F("default_uint32"  )));
   2893   EXPECT_EQ(404  , reflection->GetUInt64(message, F("default_uint64"  )));
   2894   EXPECT_EQ(405  , reflection->GetInt32 (message, F("default_sint32"  )));
   2895   EXPECT_EQ(406  , reflection->GetInt64 (message, F("default_sint64"  )));
   2896   EXPECT_EQ(407  , reflection->GetUInt32(message, F("default_fixed32" )));
   2897   EXPECT_EQ(408  , reflection->GetUInt64(message, F("default_fixed64" )));
   2898   EXPECT_EQ(409  , reflection->GetInt32 (message, F("default_sfixed32")));
   2899   EXPECT_EQ(410  , reflection->GetInt64 (message, F("default_sfixed64")));
   2900   EXPECT_EQ(411  , reflection->GetFloat (message, F("default_float"   )));
   2901   EXPECT_EQ(412  , reflection->GetDouble(message, F("default_double"  )));
   2902   EXPECT_FALSE(    reflection->GetBool  (message, F("default_bool"    )));
   2903   EXPECT_EQ("415", reflection->GetString(message, F("default_string"  )));
   2904   EXPECT_EQ("416", reflection->GetString(message, F("default_bytes"   )));
   2905 
   2906   EXPECT_EQ("415", reflection->GetStringReference(message, F("default_string"), &scratch));
   2907   EXPECT_EQ("416", reflection->GetStringReference(message, F("default_bytes" ), &scratch));
   2908 
   2909   EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("default_nested_enum" )));
   2910   EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("default_foreign_enum")));
   2911   EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("default_import_enum" )));
   2912 
   2913   EXPECT_EQ("424", reflection->GetString(message, F("default_string_piece")));
   2914   EXPECT_EQ("424", reflection->GetStringReference(message, F("default_string_piece"),
   2915                                                   &scratch));
   2916 
   2917   EXPECT_EQ("425", reflection->GetString(message, F("default_cord")));
   2918   EXPECT_EQ("425", reflection->GetStringReference(message, F("default_cord"), &scratch));
   2919 }
   2920 
   2921 void TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection(
   2922     const Message& message) {
   2923   const Reflection* reflection = message.GetReflection();
   2924 
   2925   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int32"   )));
   2926   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int64"   )));
   2927   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint32"  )));
   2928   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint64"  )));
   2929   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint32"  )));
   2930   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint64"  )));
   2931   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed32" )));
   2932   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed64" )));
   2933   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed32")));
   2934   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed64")));
   2935   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_float"   )));
   2936   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_double"  )));
   2937   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_bool"    )));
   2938   ASSERT_EQ(2, reflection->FieldSize(message, F("packed_enum"    )));
   2939 
   2940   EXPECT_EQ(601  , reflection->GetRepeatedInt32 (message, F("packed_int32"   ), 0));
   2941   EXPECT_EQ(602  , reflection->GetRepeatedInt64 (message, F("packed_int64"   ), 0));
   2942   EXPECT_EQ(603  , reflection->GetRepeatedUInt32(message, F("packed_uint32"  ), 0));
   2943   EXPECT_EQ(604  , reflection->GetRepeatedUInt64(message, F("packed_uint64"  ), 0));
   2944   EXPECT_EQ(605  , reflection->GetRepeatedInt32 (message, F("packed_sint32"  ), 0));
   2945   EXPECT_EQ(606  , reflection->GetRepeatedInt64 (message, F("packed_sint64"  ), 0));
   2946   EXPECT_EQ(607  , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 0));
   2947   EXPECT_EQ(608  , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 0));
   2948   EXPECT_EQ(609  , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 0));
   2949   EXPECT_EQ(610  , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 0));
   2950   EXPECT_EQ(611  , reflection->GetRepeatedFloat (message, F("packed_float"   ), 0));
   2951   EXPECT_EQ(612  , reflection->GetRepeatedDouble(message, F("packed_double"  ), 0));
   2952   EXPECT_TRUE(     reflection->GetRepeatedBool  (message, F("packed_bool"    ), 0));
   2953   EXPECT_EQ(foreign_bar_,
   2954             reflection->GetRepeatedEnum(message, F("packed_enum"), 0));
   2955 
   2956   EXPECT_EQ(701  , reflection->GetRepeatedInt32 (message, F("packed_int32"   ), 1));
   2957   EXPECT_EQ(702  , reflection->GetRepeatedInt64 (message, F("packed_int64"   ), 1));
   2958   EXPECT_EQ(703  , reflection->GetRepeatedUInt32(message, F("packed_uint32"  ), 1));
   2959   EXPECT_EQ(704  , reflection->GetRepeatedUInt64(message, F("packed_uint64"  ), 1));
   2960   EXPECT_EQ(705  , reflection->GetRepeatedInt32 (message, F("packed_sint32"  ), 1));
   2961   EXPECT_EQ(706  , reflection->GetRepeatedInt64 (message, F("packed_sint64"  ), 1));
   2962   EXPECT_EQ(707  , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 1));
   2963   EXPECT_EQ(708  , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 1));
   2964   EXPECT_EQ(709  , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 1));
   2965   EXPECT_EQ(710  , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 1));
   2966   EXPECT_EQ(711  , reflection->GetRepeatedFloat (message, F("packed_float"   ), 1));
   2967   EXPECT_EQ(712  , reflection->GetRepeatedDouble(message, F("packed_double"  ), 1));
   2968   EXPECT_FALSE(    reflection->GetRepeatedBool  (message, F("packed_bool"    ), 1));
   2969   EXPECT_EQ(foreign_baz_,
   2970             reflection->GetRepeatedEnum(message, F("packed_enum"), 1));
   2971 }
   2972 
   2973 // -------------------------------------------------------------------
   2974 
   2975 void TestUtil::ReflectionTester::ExpectClearViaReflection(
   2976     const Message& message) {
   2977   const Reflection* reflection = message.GetReflection();
   2978   string scratch;
   2979   const Message* sub_message;
   2980 
   2981   // has_blah() should initially be false for all optional fields.
   2982   EXPECT_FALSE(reflection->HasField(message, F("optional_int32"   )));
   2983   EXPECT_FALSE(reflection->HasField(message, F("optional_int64"   )));
   2984   EXPECT_FALSE(reflection->HasField(message, F("optional_uint32"  )));
   2985   EXPECT_FALSE(reflection->HasField(message, F("optional_uint64"  )));
   2986   EXPECT_FALSE(reflection->HasField(message, F("optional_sint32"  )));
   2987   EXPECT_FALSE(reflection->HasField(message, F("optional_sint64"  )));
   2988   EXPECT_FALSE(reflection->HasField(message, F("optional_fixed32" )));
   2989   EXPECT_FALSE(reflection->HasField(message, F("optional_fixed64" )));
   2990   EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed32")));
   2991   EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed64")));
   2992   EXPECT_FALSE(reflection->HasField(message, F("optional_float"   )));
   2993   EXPECT_FALSE(reflection->HasField(message, F("optional_double"  )));
   2994   EXPECT_FALSE(reflection->HasField(message, F("optional_bool"    )));
   2995   EXPECT_FALSE(reflection->HasField(message, F("optional_string"  )));
   2996   EXPECT_FALSE(reflection->HasField(message, F("optional_bytes"   )));
   2997 
   2998   EXPECT_FALSE(reflection->HasField(message, F("optionalgroup"           )));
   2999   EXPECT_FALSE(reflection->HasField(message, F("optional_nested_message" )));
   3000   EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_message")));
   3001   EXPECT_FALSE(reflection->HasField(message, F("optional_import_message" )));
   3002   EXPECT_FALSE(reflection->HasField(message, F("optional_public_import_message")));
   3003   EXPECT_FALSE(reflection->HasField(message, F("optional_lazy_message")));
   3004 
   3005   EXPECT_FALSE(reflection->HasField(message, F("optional_nested_enum" )));
   3006   EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_enum")));
   3007   EXPECT_FALSE(reflection->HasField(message, F("optional_import_enum" )));
   3008 
   3009   EXPECT_FALSE(reflection->HasField(message, F("optional_string_piece")));
   3010   EXPECT_FALSE(reflection->HasField(message, F("optional_cord")));
   3011 
   3012   // Optional fields without defaults are set to zero or something like it.
   3013   EXPECT_EQ(0    , reflection->GetInt32 (message, F("optional_int32"   )));
   3014   EXPECT_EQ(0    , reflection->GetInt64 (message, F("optional_int64"   )));
   3015   EXPECT_EQ(0    , reflection->GetUInt32(message, F("optional_uint32"  )));
   3016   EXPECT_EQ(0    , reflection->GetUInt64(message, F("optional_uint64"  )));
   3017   EXPECT_EQ(0    , reflection->GetInt32 (message, F("optional_sint32"  )));
   3018   EXPECT_EQ(0    , reflection->GetInt64 (message, F("optional_sint64"  )));
   3019   EXPECT_EQ(0    , reflection->GetUInt32(message, F("optional_fixed32" )));
   3020   EXPECT_EQ(0    , reflection->GetUInt64(message, F("optional_fixed64" )));
   3021   EXPECT_EQ(0    , reflection->GetInt32 (message, F("optional_sfixed32")));
   3022   EXPECT_EQ(0    , reflection->GetInt64 (message, F("optional_sfixed64")));
   3023   EXPECT_EQ(0    , reflection->GetFloat (message, F("optional_float"   )));
   3024   EXPECT_EQ(0    , reflection->GetDouble(message, F("optional_double"  )));
   3025   EXPECT_FALSE(    reflection->GetBool  (message, F("optional_bool"    )));
   3026   EXPECT_EQ(""   , reflection->GetString(message, F("optional_string"  )));
   3027   EXPECT_EQ(""   , reflection->GetString(message, F("optional_bytes"   )));
   3028 
   3029   EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string"), &scratch));
   3030   EXPECT_EQ("", reflection->GetStringReference(message, F("optional_bytes" ), &scratch));
   3031 
   3032   // Embedded messages should also be clear.
   3033   sub_message = &reflection->GetMessage(message, F("optionalgroup"));
   3034   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, group_a_));
   3035   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, group_a_));
   3036   sub_message = &reflection->GetMessage(message, F("optional_nested_message"));
   3037   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));
   3038   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   3039   sub_message = &reflection->GetMessage(message, F("optional_foreign_message"));
   3040   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_));
   3041   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));
   3042   sub_message = &reflection->GetMessage(message, F("optional_import_message"));
   3043   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_d_));
   3044   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));
   3045   sub_message = &reflection->GetMessage(message, F("optional_public_import_message"));
   3046   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_e_));
   3047   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_e_));
   3048   sub_message = &reflection->GetMessage(message, F("optional_lazy_message"));
   3049   EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));
   3050   EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));
   3051 
   3052   // Enums without defaults are set to the first value in the enum.
   3053   EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("optional_nested_enum" )));
   3054   EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("optional_foreign_enum")));
   3055   EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("optional_import_enum" )));
   3056 
   3057   EXPECT_EQ("", reflection->GetString(message, F("optional_string_piece")));
   3058   EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string_piece"), &scratch));
   3059 
   3060   EXPECT_EQ("", reflection->GetString(message, F("optional_cord")));
   3061   EXPECT_EQ("", reflection->GetStringReference(message, F("optional_cord"), &scratch));
   3062 
   3063   // Repeated fields are empty.
   3064   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int32"   )));
   3065   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int64"   )));
   3066   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint32"  )));
   3067   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint64"  )));
   3068   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint32"  )));
   3069   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint64"  )));
   3070   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed32" )));
   3071   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed64" )));
   3072   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed32")));
   3073   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed64")));
   3074   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_float"   )));
   3075   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_double"  )));
   3076   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bool"    )));
   3077   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string"  )));
   3078   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bytes"   )));
   3079 
   3080   EXPECT_EQ(0, reflection->FieldSize(message, F("repeatedgroup"           )));
   3081   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_message" )));
   3082   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_message")));
   3083   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_message" )));
   3084   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_lazy_message"   )));
   3085   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_enum"    )));
   3086   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_enum"   )));
   3087   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_enum"    )));
   3088 
   3089   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string_piece")));
   3090   EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_cord")));
   3091 
   3092   // has_blah() should also be false for all default fields.
   3093   EXPECT_FALSE(reflection->HasField(message, F("default_int32"   )));
   3094   EXPECT_FALSE(reflection->HasField(message, F("default_int64"   )));
   3095   EXPECT_FALSE(reflection->HasField(message, F("default_uint32"  )));
   3096   EXPECT_FALSE(reflection->HasField(message, F("default_uint64"  )));
   3097   EXPECT_FALSE(reflection->HasField(message, F("default_sint32"  )));
   3098   EXPECT_FALSE(reflection->HasField(message, F("default_sint64"  )));
   3099   EXPECT_FALSE(reflection->HasField(message, F("default_fixed32" )));
   3100   EXPECT_FALSE(reflection->HasField(message, F("default_fixed64" )));
   3101   EXPECT_FALSE(reflection->HasField(message, F("default_sfixed32")));
   3102   EXPECT_FALSE(reflection->HasField(message, F("default_sfixed64")));
   3103   EXPECT_FALSE(reflection->HasField(message, F("default_float"   )));
   3104   EXPECT_FALSE(reflection->HasField(message, F("default_double"  )));
   3105   EXPECT_FALSE(reflection->HasField(message, F("default_bool"    )));
   3106   EXPECT_FALSE(reflection->HasField(message, F("default_string"  )));
   3107   EXPECT_FALSE(reflection->HasField(message, F("default_bytes"   )));
   3108 
   3109   EXPECT_FALSE(reflection->HasField(message, F("default_nested_enum" )));
   3110   EXPECT_FALSE(reflection->HasField(message, F("default_foreign_enum")));
   3111   EXPECT_FALSE(reflection->HasField(message, F("default_import_enum" )));
   3112 
   3113   EXPECT_FALSE(reflection->HasField(message, F("default_string_piece")));
   3114   EXPECT_FALSE(reflection->HasField(message, F("default_cord")));
   3115 
   3116   // Fields with defaults have their default values (duh).
   3117   EXPECT_EQ( 41    , reflection->GetInt32 (message, F("default_int32"   )));
   3118   EXPECT_EQ( 42    , reflection->GetInt64 (message, F("default_int64"   )));
   3119   EXPECT_EQ( 43    , reflection->GetUInt32(message, F("default_uint32"  )));
   3120   EXPECT_EQ( 44    , reflection->GetUInt64(message, F("default_uint64"  )));
   3121   EXPECT_EQ(-45    , reflection->GetInt32 (message, F("default_sint32"  )));
   3122   EXPECT_EQ( 46    , reflection->GetInt64 (message, F("default_sint64"  )));
   3123   EXPECT_EQ( 47    , reflection->GetUInt32(message, F("default_fixed32" )));
   3124   EXPECT_EQ( 48    , reflection->GetUInt64(message, F("default_fixed64" )));
   3125   EXPECT_EQ( 49    , reflection->GetInt32 (message, F("default_sfixed32")));
   3126   EXPECT_EQ(-50    , reflection->GetInt64 (message, F("default_sfixed64")));
   3127   EXPECT_EQ( 51.5  , reflection->GetFloat (message, F("default_float"   )));
   3128   EXPECT_EQ( 52e3  , reflection->GetDouble(message, F("default_double"  )));
   3129   EXPECT_TRUE(       reflection->GetBool  (message, F("default_bool"    )));
   3130   EXPECT_EQ("hello", reflection->GetString(message, F("default_string"  )));
   3131   EXPECT_EQ("world", reflection->GetString(message, F("default_bytes"   )));
   3132 
   3133   EXPECT_EQ("hello", reflection->GetStringReference(message, F("default_string"), &scratch));
   3134   EXPECT_EQ("world", reflection->GetStringReference(message, F("default_bytes" ), &scratch));
   3135 
   3136   EXPECT_EQ( nested_bar_, reflection->GetEnum(message, F("default_nested_enum" )));
   3137   EXPECT_EQ(foreign_bar_, reflection->GetEnum(message, F("default_foreign_enum")));
   3138   EXPECT_EQ( import_bar_, reflection->GetEnum(message, F("default_import_enum" )));
   3139 
   3140   EXPECT_EQ("abc", reflection->GetString(message, F("default_string_piece")));
   3141   EXPECT_EQ("abc", reflection->GetStringReference(message, F("default_string_piece"), &scratch));
   3142 
   3143   EXPECT_EQ("123", reflection->GetString(message, F("default_cord")));
   3144   EXPECT_EQ("123", reflection->GetStringReference(message, F("default_cord"), &scratch));
   3145 }
   3146 
   3147 void TestUtil::ReflectionTester::ExpectPackedClearViaReflection(
   3148     const Message& message) {
   3149   const Reflection* reflection = message.GetReflection();
   3150 
   3151   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int32"   )));
   3152   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int64"   )));
   3153   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint32"  )));
   3154   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint64"  )));
   3155   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint32"  )));
   3156   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint64"  )));
   3157   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed32" )));
   3158   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed64" )));
   3159   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed32")));
   3160   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed64")));
   3161   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_float"   )));
   3162   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_double"  )));
   3163   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_bool"    )));
   3164   EXPECT_EQ(0, reflection->FieldSize(message, F("packed_enum"    )));
   3165 }
   3166 
   3167 // -------------------------------------------------------------------
   3168 
   3169 void TestUtil::ReflectionTester::ModifyRepeatedFieldsViaReflection(
   3170     Message* message) {
   3171   const Reflection* reflection = message->GetReflection();
   3172   Message* sub_message;
   3173 
   3174   reflection->SetRepeatedInt32 (message, F("repeated_int32"   ), 1, 501);
   3175   reflection->SetRepeatedInt64 (message, F("repeated_int64"   ), 1, 502);
   3176   reflection->SetRepeatedUInt32(message, F("repeated_uint32"  ), 1, 503);
   3177   reflection->SetRepeatedUInt64(message, F("repeated_uint64"  ), 1, 504);
   3178   reflection->SetRepeatedInt32 (message, F("repeated_sint32"  ), 1, 505);
   3179   reflection->SetRepeatedInt64 (message, F("repeated_sint64"  ), 1, 506);
   3180   reflection->SetRepeatedUInt32(message, F("repeated_fixed32" ), 1, 507);
   3181   reflection->SetRepeatedUInt64(message, F("repeated_fixed64" ), 1, 508);
   3182   reflection->SetRepeatedInt32 (message, F("repeated_sfixed32"), 1, 509);
   3183   reflection->SetRepeatedInt64 (message, F("repeated_sfixed64"), 1, 510);
   3184   reflection->SetRepeatedFloat (message, F("repeated_float"   ), 1, 511);
   3185   reflection->SetRepeatedDouble(message, F("repeated_double"  ), 1, 512);
   3186   reflection->SetRepeatedBool  (message, F("repeated_bool"    ), 1, true);
   3187   reflection->SetRepeatedString(message, F("repeated_string"  ), 1, "515");
   3188   reflection->SetRepeatedString(message, F("repeated_bytes"   ), 1, "516");
   3189 
   3190   sub_message = reflection->MutableRepeatedMessage(message, F("repeatedgroup"), 1);
   3191   sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 517);
   3192   sub_message = reflection->MutableRepeatedMessage(message, F("repeated_nested_message"), 1);
   3193   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 518);
   3194   sub_message = reflection->MutableRepeatedMessage(message, F("repeated_foreign_message"), 1);
   3195   sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 519);
   3196   sub_message = reflection->MutableRepeatedMessage(message, F("repeated_import_message"), 1);
   3197   sub_message->GetReflection()->SetInt32(sub_message, import_d_, 520);
   3198   sub_message = reflection->MutableRepeatedMessage(message, F("repeated_lazy_message"), 1);
   3199   sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 527);
   3200 
   3201   reflection->SetRepeatedEnum(message, F("repeated_nested_enum" ), 1,  nested_foo_);
   3202   reflection->SetRepeatedEnum(message, F("repeated_foreign_enum"), 1, foreign_foo_);
   3203   reflection->SetRepeatedEnum(message, F("repeated_import_enum" ), 1,  import_foo_);
   3204 
   3205   reflection->SetRepeatedString(message, F("repeated_string_piece"), 1, "524");
   3206   reflection->SetRepeatedString(message, F("repeated_cord"), 1, "525");
   3207 }
   3208 
   3209 void TestUtil::ReflectionTester::ModifyPackedFieldsViaReflection(
   3210     Message* message) {
   3211   const Reflection* reflection = message->GetReflection();
   3212   reflection->SetRepeatedInt32 (message, F("packed_int32"   ), 1, 801);
   3213   reflection->SetRepeatedInt64 (message, F("packed_int64"   ), 1, 802);
   3214   reflection->SetRepeatedUInt32(message, F("packed_uint32"  ), 1, 803);
   3215   reflection->SetRepeatedUInt64(message, F("packed_uint64"  ), 1, 804);
   3216   reflection->SetRepeatedInt32 (message, F("packed_sint32"  ), 1, 805);
   3217   reflection->SetRepeatedInt64 (message, F("packed_sint64"  ), 1, 806);
   3218   reflection->SetRepeatedUInt32(message, F("packed_fixed32" ), 1, 807);
   3219   reflection->SetRepeatedUInt64(message, F("packed_fixed64" ), 1, 808);
   3220   reflection->SetRepeatedInt32 (message, F("packed_sfixed32"), 1, 809);
   3221   reflection->SetRepeatedInt64 (message, F("packed_sfixed64"), 1, 810);
   3222   reflection->SetRepeatedFloat (message, F("packed_float"   ), 1, 811);
   3223   reflection->SetRepeatedDouble(message, F("packed_double"  ), 1, 812);
   3224   reflection->SetRepeatedBool  (message, F("packed_bool"    ), 1, true);
   3225   reflection->SetRepeatedEnum  (message, F("packed_enum"    ), 1, foreign_foo_);
   3226 }
   3227 
   3228 void TestUtil::ReflectionTester::RemoveLastRepeatedsViaReflection(
   3229     Message* message) {
   3230   const Reflection* reflection = message->GetReflection();
   3231 
   3232   vector<const FieldDescriptor*> output;
   3233   reflection->ListFields(*message, &output);
   3234   for (int i=0; i<output.size(); ++i) {
   3235     const FieldDescriptor* field = output[i];
   3236     if (!field->is_repeated()) continue;
   3237 
   3238     reflection->RemoveLast(message, field);
   3239   }
   3240 }
   3241 
   3242 void TestUtil::ReflectionTester::ReleaseLastRepeatedsViaReflection(
   3243     Message* message, bool expect_extensions_notnull) {
   3244   const Reflection* reflection = message->GetReflection();
   3245 
   3246   vector<const FieldDescriptor*> output;
   3247   reflection->ListFields(*message, &output);
   3248   for (int i=0; i<output.size(); ++i) {
   3249     const FieldDescriptor* field = output[i];
   3250     if (!field->is_repeated()) continue;
   3251     if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue;
   3252 
   3253     Message* released = reflection->ReleaseLast(message, field);
   3254     if (!field->is_extension() || expect_extensions_notnull) {
   3255       ASSERT_TRUE(released != NULL) << "ReleaseLast returned NULL for: "
   3256                                     << field->name();
   3257     }
   3258     delete released;
   3259   }
   3260 }
   3261 
   3262 void TestUtil::ReflectionTester::SwapRepeatedsViaReflection(Message* message) {
   3263   const Reflection* reflection = message->GetReflection();
   3264 
   3265   vector<const FieldDescriptor*> output;
   3266   reflection->ListFields(*message, &output);
   3267   for (int i=0; i<output.size(); ++i) {
   3268     const FieldDescriptor* field = output[i];
   3269     if (!field->is_repeated()) continue;
   3270 
   3271     reflection->SwapElements(message, field, 0, 1);
   3272   }
   3273 }
   3274 
   3275 void TestUtil::ReflectionTester::
   3276 SetAllocatedOptionalMessageFieldsToNullViaReflection(
   3277     Message* message) {
   3278   const Reflection* reflection = message->GetReflection();
   3279 
   3280   vector<const FieldDescriptor*> fields;
   3281   reflection->ListFields(*message, &fields);
   3282 
   3283   for (int i = 0; i < fields.size(); ++i) {
   3284     const FieldDescriptor* field = fields[i];
   3285     if (!field->is_optional() ||
   3286         field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue;
   3287 
   3288     reflection->SetAllocatedMessage(message, NULL, field);
   3289   }
   3290 }
   3291 
   3292 void TestUtil::ReflectionTester::
   3293 SetAllocatedOptionalMessageFieldsToMessageViaReflection(
   3294     Message* from_message,
   3295     Message* to_message) {
   3296   EXPECT_EQ(from_message->GetDescriptor(), to_message->GetDescriptor());
   3297   const Reflection* from_reflection = from_message->GetReflection();
   3298   const Reflection* to_reflection = to_message->GetReflection();
   3299 
   3300   vector<const FieldDescriptor*> fields;
   3301   from_reflection->ListFields(*from_message, &fields);
   3302 
   3303   for (int i = 0; i < fields.size(); ++i) {
   3304     const FieldDescriptor* field = fields[i];
   3305     if (!field->is_optional() ||
   3306         field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue;
   3307 
   3308     Message* sub_message =
   3309         from_reflection->ReleaseMessage(from_message, field);
   3310     to_reflection->SetAllocatedMessage(to_message, sub_message, field);
   3311   }
   3312 }
   3313 
   3314 void TestUtil::ReflectionTester::ExpectMessagesReleasedViaReflection(
   3315     Message* message,
   3316     TestUtil::ReflectionTester::MessageReleaseState expected_release_state) {
   3317   const Reflection* reflection = message->GetReflection();
   3318 
   3319   static const char* fields[] = {
   3320     "optionalgroup",
   3321     "optional_nested_message",
   3322     "optional_foreign_message",
   3323     "optional_import_message",
   3324   };
   3325   for (int i = 0; i < GOOGLE_ARRAYSIZE(fields); i++) {
   3326     const Message& sub_message = reflection->GetMessage(*message, F(fields[i]));
   3327     Message* released = reflection->ReleaseMessage(message, F(fields[i]));
   3328     switch (expected_release_state) {
   3329       case IS_NULL:
   3330         EXPECT_TRUE(released == NULL);
   3331         break;
   3332       case NOT_NULL:
   3333         EXPECT_TRUE(released != NULL);
   3334         EXPECT_EQ(&sub_message, released);
   3335         break;
   3336       case CAN_BE_NULL:
   3337         break;
   3338     }
   3339     delete released;
   3340     EXPECT_FALSE(reflection->HasField(*message, F(fields[i])));
   3341   }
   3342 }
   3343 
   3344 }  // namespace protobuf
   3345 }  // namespace google
   3346