Skip to content

Commit 4ab5cec

Browse files
committed
Add deinitClone method to ISpriteHandler
1 parent 0f40da4 commit 4ab5cec

File tree

4 files changed

+13
-3
lines changed

4 files changed

+13
-3
lines changed

include/scratchcpp/ispritehandler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class LIBSCRATCHCPP_EXPORT ISpriteHandler
1717
/*! Called when the interface is set on a sprite. */
1818
virtual void init(Sprite *sprite) = 0;
1919

20+
/*! Called when the sprite is deinitialized (if it is a clone). */
21+
virtual void deinitClone() = 0;
22+
2023
/*! Called when the sprite clones. */
2124
virtual void onCloned(Sprite *clone) = 0;
2225

src/scratch/sprite.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ void Sprite::deleteClone()
101101
if (eng)
102102
eng->deinitClone(shared_from_this());
103103

104+
if (impl->iface)
105+
impl->iface->deinitClone();
106+
104107
assert(impl->cloneSprite);
105108
impl->cloneDeleted = true;
106109
impl->cloneSprite->impl->removeClone(this);

test/mocks/spritehandlermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class SpriteHandlerMock : public ISpriteHandler
99
{
1010
public:
1111
MOCK_METHOD(void, init, (Sprite *), (override));
12+
MOCK_METHOD(void, deinitClone, (), (override));
1213

1314
MOCK_METHOD(void, onCloned, (Sprite *), (override));
1415

test/target_interfaces/ispritehandler_test.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ TEST_F(ISpriteHandlerTest, Clone)
4343
ASSERT_EQ(cloneParam1, clone.get());
4444
ASSERT_EQ(cloneParam2, clone.get());
4545

46-
// Engine is used during deletion, so let's just set it to nullptr (this is tested elsewhere)
47-
m_sprite.setEngine(nullptr);
48-
clone->setEngine(nullptr);
46+
SpriteHandlerMock cloneHandler;
47+
EXPECT_CALL(cloneHandler, init(clone.get()));
48+
clone->setInterface(&cloneHandler);
49+
EXPECT_CALL(m_engine, deinitClone(clone));
50+
EXPECT_CALL(cloneHandler, deinitClone());
51+
clone->deleteClone();
4952
}
5053

5154
TEST_F(ISpriteHandlerTest, Visible)

0 commit comments

Comments
 (0)