source/base: Implement moving
diff --git a/test/source/base.cpp b/test/source/base.cpp
index 4b89d52..a649166 100644
--- a/test/source/base.cpp
+++ b/test/source/base.cpp
@@ -11,6 +11,7 @@
 #include <system_error>
 #include <systemd/sd-event.h>
 #include <type_traits>
+#include <utility>
 
 namespace sdeventplus
 {
@@ -115,6 +116,167 @@
     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
 }
 
+TEST_F(BaseTest, MoveConstruct)
+{
+    EXPECT_CALL(mock, sd_event_ref(expected_event))
+        .WillOnce(Return(expected_event));
+    BaseImpl source(*event, expected_source, std::false_type());
+    EXPECT_EQ(expected_source, source.get());
+    EXPECT_EQ(expected_event, source.get_event().get());
+    EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
+        .WillOnce(Return(0));
+    source.set_prepare([](Base&) {});
+    EXPECT_TRUE(source.get_prepare());
+
+    BaseImpl source2(std::move(source));
+    EXPECT_EQ(nullptr, source.get());
+    EXPECT_EQ(nullptr, source.get_event().get());
+    EXPECT_FALSE(source.get_prepare());
+    EXPECT_EQ(expected_source, source2.get());
+    EXPECT_EQ(expected_event, source2.get_event().get());
+    EXPECT_TRUE(source2.get_prepare());
+
+    {
+        testing::InSequence seq;
+        EXPECT_CALL(mock,
+                    sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
+            .WillOnce(Return(0));
+        EXPECT_CALL(mock, sd_event_source_unref(expected_source))
+            .WillOnce(Return(nullptr));
+    }
+    EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+}
+
+TEST_F(BaseTest, MoveAssignSelf)
+{
+    EXPECT_CALL(mock, sd_event_ref(expected_event))
+        .WillOnce(Return(expected_event));
+    BaseImpl source(*event, expected_source, std::false_type());
+    EXPECT_EQ(expected_source, source.get());
+    EXPECT_EQ(expected_event, source.get_event().get());
+    EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
+        .WillOnce(Return(0));
+    source.set_prepare([](Base&) {});
+    EXPECT_TRUE(source.get_prepare());
+
+    source = std::move(source);
+    EXPECT_EQ(expected_source, source.get());
+    EXPECT_EQ(expected_event, source.get_event().get());
+    EXPECT_TRUE(source.get_prepare());
+
+    {
+        testing::InSequence seq;
+        EXPECT_CALL(mock,
+                    sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
+            .WillOnce(Return(0));
+        EXPECT_CALL(mock, sd_event_source_unref(expected_source))
+            .WillOnce(Return(nullptr));
+    }
+    EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+}
+
+TEST_F(BaseTest, MoveAssignEmpty)
+{
+    EXPECT_CALL(mock, sd_event_ref(expected_event))
+        .WillOnce(Return(expected_event));
+    BaseImpl source(*event, expected_source, std::false_type());
+    EXPECT_EQ(expected_source, source.get());
+    EXPECT_EQ(expected_event, source.get_event().get());
+    EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
+        .WillOnce(Return(0));
+    source.set_prepare([](Base&) {});
+    EXPECT_TRUE(source.get_prepare());
+
+    sd_event* const expected_event2 = reinterpret_cast<sd_event*>(1);
+    Event event2(expected_event2, std::false_type(), &mock);
+    EXPECT_CALL(mock, sd_event_ref(expected_event2))
+        .WillOnce(Return(expected_event2));
+    BaseImpl source2(event2, nullptr, std::false_type());
+    EXPECT_EQ(nullptr, source2.get());
+    EXPECT_EQ(expected_event2, source2.get_event().get());
+    EXPECT_FALSE(source2.get_prepare());
+
+    EXPECT_CALL(mock, sd_event_unref(expected_event2))
+        .WillOnce(Return(nullptr));
+    EXPECT_CALL(mock, sd_event_source_unref(nullptr)).WillOnce(Return(nullptr));
+    source2 = std::move(source);
+    EXPECT_EQ(nullptr, source.get());
+    EXPECT_EQ(nullptr, source.get_event().get());
+    EXPECT_FALSE(source.get_prepare());
+    EXPECT_EQ(expected_source, source2.get());
+    EXPECT_EQ(expected_event, source2.get_event().get());
+    EXPECT_TRUE(source2.get_prepare());
+
+    {
+        testing::InSequence seq;
+        EXPECT_CALL(mock,
+                    sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
+            .WillOnce(Return(0));
+        EXPECT_CALL(mock, sd_event_source_unref(expected_source))
+            .WillOnce(Return(nullptr));
+    }
+    EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+    EXPECT_CALL(mock, sd_event_unref(expected_event2))
+        .WillOnce(Return(nullptr));
+}
+
+TEST_F(BaseTest, MoveAssignExisting)
+{
+    EXPECT_CALL(mock, sd_event_ref(expected_event))
+        .WillOnce(Return(expected_event));
+    BaseImpl source(*event, expected_source, std::false_type());
+    EXPECT_EQ(expected_source, source.get());
+    EXPECT_EQ(expected_event, source.get_event().get());
+    EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source, testing::_))
+        .WillOnce(Return(0));
+    source.set_prepare([](Base&) {});
+    EXPECT_TRUE(source.get_prepare());
+
+    sd_event* const expected_event2 = reinterpret_cast<sd_event*>(1);
+    sd_event_source* const expected_source2 =
+        reinterpret_cast<sd_event_source*>(2);
+    Event event2(expected_event2, std::false_type(), &mock);
+    EXPECT_CALL(mock, sd_event_ref(expected_event2))
+        .WillOnce(Return(expected_event2));
+    BaseImpl source2(event2, expected_source2, std::false_type());
+    EXPECT_EQ(expected_source2, source2.get());
+    EXPECT_EQ(expected_event2, source2.get_event().get());
+    EXPECT_CALL(mock, sd_event_source_set_prepare(expected_source2, testing::_))
+        .WillOnce(Return(0));
+    source2.set_prepare([](Base&) {});
+    EXPECT_TRUE(source2.get_prepare());
+
+    {
+        testing::InSequence seq;
+        EXPECT_CALL(mock,
+                    sd_event_source_set_enabled(expected_source2, SD_EVENT_OFF))
+            .WillOnce(Return(0));
+        EXPECT_CALL(mock, sd_event_source_unref(expected_source2))
+            .WillOnce(Return(nullptr));
+    }
+    EXPECT_CALL(mock, sd_event_unref(expected_event2))
+        .WillOnce(Return(nullptr));
+    source2 = std::move(source);
+    EXPECT_EQ(nullptr, source.get());
+    EXPECT_EQ(nullptr, source.get_event().get());
+    EXPECT_FALSE(source.get_prepare());
+    EXPECT_EQ(expected_source, source2.get());
+    EXPECT_EQ(expected_event, source2.get_event().get());
+    EXPECT_TRUE(source2.get_prepare());
+
+    {
+        testing::InSequence seq;
+        EXPECT_CALL(mock,
+                    sd_event_source_set_enabled(expected_source, SD_EVENT_OFF))
+            .WillOnce(Return(0));
+        EXPECT_CALL(mock, sd_event_source_unref(expected_source))
+            .WillOnce(Return(nullptr));
+    }
+    EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+    EXPECT_CALL(mock, sd_event_unref(expected_event2))
+        .WillOnce(Return(nullptr));
+}
+
 class BaseMethodTest : public BaseTest
 {
   protected: