#include #include namespace mbgl { 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 optional objectMember(const MockConvertible&, const char *) { return nullopt; } template static optional eachMember(const MockConvertible&, Fn&&) { return nullopt; } static optional toBool(const MockConvertible&) { return nullopt; } static optional toNumber(const MockConvertible&) { return nullopt; } static optional toDouble(const MockConvertible&) { return nullopt; } static optional toString(const MockConvertible&) { return nullopt; } static optional toValue(const MockConvertible&) { return nullopt; } static optional toGeoJSON(const MockConvertible&, Error&) { return nullopt; } }; } // namespace conversion } // namespace style } // namespace mbgl using namespace mbgl; using namespace mbgl::style; using namespace mbgl::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); }