33 #include <google/protobuf/unittest.pb.h>
37 #include <type_traits>
46 namespace cpp_unittest {
51 TEST(MovableMessageTest, MoveConstructor) {
52 protobuf_unittest::TestAllTypes message1;
54 const auto* nested = &message1.optional_nested_message();
56 protobuf_unittest::TestAllTypes message2(std::move(message1));
61 EXPECT_EQ(nested, &message2.optional_nested_message());
62 EXPECT_NE(nested, &message1.optional_nested_message());
65 TEST(MovableMessageTest, MoveAssignmentOperator) {
66 protobuf_unittest::TestAllTypes message1;
68 const auto* nested = &message1.optional_nested_message();
70 protobuf_unittest::TestAllTypes message2;
71 message2 = std::move(message1);
76 EXPECT_EQ(nested, &message2.optional_nested_message());
77 EXPECT_NE(nested, &message1.optional_nested_message());
80 TEST(MovableMessageTest, SelfMoveAssignment) {
88 TEST(MovableMessageTest, MoveSameArena) {
91 auto* message1_on_arena =
92 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
94 const auto* nested = &message1_on_arena->optional_nested_message();
96 auto* message2_on_arena =
97 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
100 *message2_on_arena = std::move(*message1_on_arena);
101 EXPECT_EQ(nested, &message2_on_arena->optional_nested_message());
104 TEST(MovableMessageTest, MoveDifferentArenas) {
105 Arena arena1, arena2;
107 auto* message1_on_arena =
108 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena1);
110 const auto* nested = &message1_on_arena->optional_nested_message();
112 auto* message2_on_arena =
113 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena2);
116 *message2_on_arena = std::move(*message1_on_arena);
117 EXPECT_NE(nested, &message2_on_arena->optional_nested_message());
122 TEST(MovableMessageTest, MoveFromArena) {
125 auto* message1_on_arena =
126 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
128 const auto* nested = &message1_on_arena->optional_nested_message();
130 protobuf_unittest::TestAllTypes message2;
133 message2 = std::move(*message1_on_arena);
134 EXPECT_NE(nested, &message2.optional_nested_message());
139 TEST(MovableMessageTest, MoveToArena) {
142 protobuf_unittest::TestAllTypes message1;
144 const auto* nested = &message1.optional_nested_message();
146 auto* message2_on_arena =
147 Arena::CreateMessage<protobuf_unittest::TestAllTypes>(&arena);
150 *message2_on_arena = std::move(message1);
151 EXPECT_NE(nested, &message2_on_arena->optional_nested_message());
156 TEST(MovableMessageTest, Noexcept) {
158 std::is_nothrow_move_constructible<protobuf_unittest::TestAllTypes>());
159 EXPECT_TRUE(std::is_nothrow_move_assignable<protobuf_unittest::TestAllTypes>());