#include #include namespace mln { namespace style { namespace conversion { class MockConvertible { public: MockConvertible() = default; MockConvertible(int* counter_) : counter(counter_) {} MockConvertible(MockConvertible&& other) noexcept : counter(other.counter) {} ~MockConvertible() { ++*counter; } int* counter = nullptr; }; template <> class ConversionTraits { public: static bool isUndefined(const MockConvertible&) { return false; } static bool isArray(const MockConvertible&) { return false; } static bool isObject(const MockConvertible&) { return false; } static std::size_t arrayLength(const MockConvertible&) { return 0u; } static MockConvertible arrayMember(const MockConvertible&, std::size_t) { return {}; } static std::optional objectMember(const MockConvertible&, const char*) { return std::nullopt; } template static std::optional eachMember(const MockConvertible&, Fn&&) { return std::nullopt; } static std::optional toBool(const MockConvertible&) { return std::nullopt; } static std::optional toNumber(const MockConvertible&) { return std::nullopt; } static std::optional toDouble(const MockConvertible&) { return std::nullopt; } static std::optional toString(const MockConvertible&) { return std::nullopt; } static std::optional toValue(const MockConvertible&) { return std::nullopt; } static std::optional toGeoJSON(const MockConvertible&, Error&) { return std::nullopt; } }; } // namespace conversion } // namespace style } // namespace mln using namespace mln; using namespace mln::style; using namespace mln::style::conversion; TEST(Conversion, Move) { int dtorCounter = 0; { MockConvertible mock(&dtorCounter); Convertible a(std::move(mock)); Convertible b(std::move(a)); a = std::move(b); Convertible* c = &a; a = std::move(*c); } ASSERT_EQ(dtorCounter, 4); }