From 4c95f9045f3aae6e3f04eca7fc0b43e21057b782 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:10:48 +0100 Subject: [PATCH 1/3] Add setPosition() method to Sprite --- include/scratchcpp/sprite.h | 2 ++ src/scratch/sprite.cpp | 11 +++++++++++ test/scratch_classes/sprite_test.cpp | 9 ++++++++- test/target_interfaces/ispritehandler_test.cpp | 9 +++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/scratchcpp/sprite.h b/include/scratchcpp/sprite.h index 17be2725..cc8b9736 100644 --- a/include/scratchcpp/sprite.h +++ b/include/scratchcpp/sprite.h @@ -47,6 +47,8 @@ class LIBSCRATCHCPP_EXPORT Sprite double y() const; void setY(double newY); + void setPosition(double x, double y); + double size() const; void setSize(double newSize); diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index eef2ffdb..37d19942 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -184,6 +184,17 @@ void Sprite::setY(double newY) impl->iface->onYChanged(impl->y); } +/* Sets the position of the sprite. */ +void Sprite::setPosition(double x, double y) +{ + setXY(x, y); + + if (impl->iface) { + impl->iface->onXChanged(impl->x); + impl->iface->onYChanged(impl->y); + } +} + /*! Returns the size. */ double Sprite::size() const { diff --git a/test/scratch_classes/sprite_test.cpp b/test/scratch_classes/sprite_test.cpp index ac964315..d201e474 100644 --- a/test/scratch_classes/sprite_test.cpp +++ b/test/scratch_classes/sprite_test.cpp @@ -233,7 +233,7 @@ TEST(SpriteTest, XY) EngineMock engine; sprite.setEngine(&engine); - EXPECT_CALL(engine, requestRedraw()).Times(17); + EXPECT_CALL(engine, requestRedraw()).Times(18); EXPECT_CALL(engine, spriteFencingEnabled()).Times(4).WillRepeatedly(Return(false)); sprite.setX(-53.25); @@ -340,6 +340,13 @@ TEST(SpriteTest, XY) EXPECT_CALL(handler, onYChanged); sprite.setY(-340); ASSERT_EQ(sprite.y(), -340); + + EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onXChanged); + EXPECT_CALL(handler, onYChanged); + sprite.setPosition(56, -23); + ASSERT_EQ(sprite.x(), 56); + ASSERT_EQ(sprite.y(), -23); } TEST(SpriteTest, Size) diff --git a/test/target_interfaces/ispritehandler_test.cpp b/test/target_interfaces/ispritehandler_test.cpp index 42bd6fd9..b44f6a9e 100644 --- a/test/target_interfaces/ispritehandler_test.cpp +++ b/test/target_interfaces/ispritehandler_test.cpp @@ -93,6 +93,15 @@ TEST_F(ISpriteHandlerTest, Y) m_sprite.setY(207.08); } +TEST_F(ISpriteHandlerTest, Position) +{ + EXPECT_CALL(m_handler, onXChanged(284.61)); + EXPECT_CALL(m_handler, onYChanged(207.08)); + EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(m_engine, requestRedraw()); + m_sprite.setPosition(284.61, 207.08); +} + TEST_F(ISpriteHandlerTest, Size) { EXPECT_CALL(m_handler, onSizeChanged(53.8)).Times(1); From 23d0f0d1bbabb758b1fd8a0d4241ec8cfb147b4a Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:03:14 +0100 Subject: [PATCH 2/3] Add onMoved() method to ISpriteHandler --- include/scratchcpp/ispritehandler.h | 3 +++ src/scratch/sprite.cpp | 6 ++++++ test/mocks/spritehandlermock.h | 1 + test/scratch_classes/sprite_test.cpp | 14 ++++++++++++++ test/target_interfaces/ispritehandler_test.cpp | 12 ++++++++++++ 5 files changed, 36 insertions(+) diff --git a/include/scratchcpp/ispritehandler.h b/include/scratchcpp/ispritehandler.h index c413901e..546d18f4 100644 --- a/include/scratchcpp/ispritehandler.h +++ b/include/scratchcpp/ispritehandler.h @@ -35,6 +35,9 @@ class LIBSCRATCHCPP_EXPORT ISpriteHandler /*! Called when the Y-coordinate changes. */ virtual void onYChanged(double y) = 0; + /*! Called when the sprite position changes. */ + virtual void onMoved(double oldX, double oldY, double newX, double newY) = 0; + /*! Called when the size changes. */ virtual void onSizeChanged(double size) = 0; diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index 37d19942..d7d19cdc 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -432,6 +432,9 @@ void Sprite::setXY(double x, double y) { IEngine *eng = engine(); + double oldX = impl->x; + double oldY = impl->y; + if (eng && !eng->spriteFencingEnabled()) { impl->x = x; impl->y = y; @@ -444,4 +447,7 @@ void Sprite::setXY(double x, double y) if (eng) eng->requestRedraw(); } + + if (impl->iface) + impl->iface->onMoved(oldX, oldY, impl->x, impl->y); } diff --git a/test/mocks/spritehandlermock.h b/test/mocks/spritehandlermock.h index 7a3c3de0..cf4b331e 100644 --- a/test/mocks/spritehandlermock.h +++ b/test/mocks/spritehandlermock.h @@ -18,6 +18,7 @@ class SpriteHandlerMock : public ISpriteHandler MOCK_METHOD(void, onVisibleChanged, (bool), (override)); MOCK_METHOD(void, onXChanged, (double), (override)); MOCK_METHOD(void, onYChanged, (double), (override)); + MOCK_METHOD(void, onMoved, (double, double, double, double), (override)); MOCK_METHOD(void, onSizeChanged, (double), (override)); MOCK_METHOD(void, onDirectionChanged, (double), (override)); MOCK_METHOD(void, onRotationStyleChanged, (Sprite::RotationStyle), (override)); diff --git a/test/scratch_classes/sprite_test.cpp b/test/scratch_classes/sprite_test.cpp index d201e474..5e78d92c 100644 --- a/test/scratch_classes/sprite_test.cpp +++ b/test/scratch_classes/sprite_test.cpp @@ -261,6 +261,7 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(319); ASSERT_EQ(sprite.x(), 319); @@ -269,6 +270,7 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(75); ASSERT_EQ(sprite.x(), 75); @@ -277,11 +279,13 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(400); ASSERT_EQ(sprite.x(), 344); EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(400); ASSERT_EQ(sprite.x(), 400); @@ -290,11 +294,13 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(-400); ASSERT_EQ(sprite.x(), 155); EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); sprite.setX(-400); ASSERT_EQ(sprite.x(), -400); @@ -303,6 +309,7 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(150); ASSERT_EQ(sprite.y(), 150); @@ -311,6 +318,7 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(-103); ASSERT_EQ(sprite.y(), -103); @@ -319,11 +327,13 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(340); ASSERT_EQ(sprite.y(), 62); EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(340); ASSERT_EQ(sprite.y(), 340); @@ -332,16 +342,19 @@ TEST(SpriteTest, XY) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); EXPECT_CALL(handler, boundingRect()).WillOnce(Return(rect)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(-340); ASSERT_EQ(sprite.y(), 86); EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onYChanged); sprite.setY(-340); ASSERT_EQ(sprite.y(), -340); EXPECT_CALL(engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(handler, onMoved); EXPECT_CALL(handler, onXChanged); EXPECT_CALL(handler, onYChanged); sprite.setPosition(56, -23); @@ -532,6 +545,7 @@ TEST(SpriteTest, KeepInFence) EXPECT_CALL(engine, requestRedraw()).Times(2); EXPECT_CALL(engine, spriteFencingEnabled()).Times(2).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(2); EXPECT_CALL(handler, onXChanged); EXPECT_CALL(handler, onYChanged); sprite.setX(100); diff --git a/test/target_interfaces/ispritehandler_test.cpp b/test/target_interfaces/ispritehandler_test.cpp index b44f6a9e..81953a67 100644 --- a/test/target_interfaces/ispritehandler_test.cpp +++ b/test/target_interfaces/ispritehandler_test.cpp @@ -63,6 +63,7 @@ TEST_F(ISpriteHandlerTest, Visible) TEST_F(ISpriteHandlerTest, X) { + EXPECT_CALL(m_handler, onMoved(0, 0, 189.46, 0)); EXPECT_CALL(m_handler, onXChanged(189.46)).Times(1); EXPECT_CALL(m_handler, boundingRect()).WillOnce(Return(Rect())); EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(true)); @@ -71,6 +72,7 @@ TEST_F(ISpriteHandlerTest, X) EXPECT_CALL(m_engine, requestRedraw()); m_sprite.setX(189.46); + EXPECT_CALL(m_handler, onMoved(189.46, 0, 284.61, 0)); EXPECT_CALL(m_handler, onXChanged(284.61)).Times(1); EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(false)); EXPECT_CALL(m_engine, requestRedraw()); @@ -79,6 +81,7 @@ TEST_F(ISpriteHandlerTest, X) TEST_F(ISpriteHandlerTest, Y) { + EXPECT_CALL(m_handler, onMoved(0, 0, 0, -153.7)).Times(1); EXPECT_CALL(m_handler, onYChanged(-153.7)).Times(1); EXPECT_CALL(m_handler, boundingRect()).WillOnce(Return(Rect())); EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(true)); @@ -87,6 +90,7 @@ TEST_F(ISpriteHandlerTest, Y) EXPECT_CALL(m_engine, requestRedraw()); m_sprite.setY(-153.7); + EXPECT_CALL(m_handler, onMoved(0, -153.7, 0, 207.08)).Times(1); EXPECT_CALL(m_handler, onYChanged(207.08)).Times(1); EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(false)); EXPECT_CALL(m_engine, requestRedraw()); @@ -95,11 +99,19 @@ TEST_F(ISpriteHandlerTest, Y) TEST_F(ISpriteHandlerTest, Position) { + EXPECT_CALL(m_handler, onMoved(0, 0, 284.61, 207.08)).Times(1); EXPECT_CALL(m_handler, onXChanged(284.61)); EXPECT_CALL(m_handler, onYChanged(207.08)); EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(false)); EXPECT_CALL(m_engine, requestRedraw()); m_sprite.setPosition(284.61, 207.08); + + EXPECT_CALL(m_handler, onMoved(284.61, 207.08, -45.9, -20.05)).Times(1); + EXPECT_CALL(m_handler, onXChanged(-45.9)); + EXPECT_CALL(m_handler, onYChanged(-20.05)); + EXPECT_CALL(m_engine, spriteFencingEnabled()).WillOnce(Return(false)); + EXPECT_CALL(m_engine, requestRedraw()); + m_sprite.setPosition(-45.9, -20.05); } TEST_F(ISpriteHandlerTest, Size) From fdff24cda8061f1a1624fdf5e81ea2da071e8446 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:16:00 +0100 Subject: [PATCH 3/3] Use setPosition() in motion blocks --- src/blocks/motionblocks.cpp | 55 +++++++++++------------------- test/blocks/motion_blocks_test.cpp | 25 ++++++++------ 2 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/blocks/motionblocks.cpp b/src/blocks/motionblocks.cpp index 8c38001f..c49a3dd0 100644 --- a/src/blocks/motionblocks.cpp +++ b/src/blocks/motionblocks.cpp @@ -275,8 +275,7 @@ unsigned int MotionBlocks::moveSteps(VirtualMachine *vm) if (sprite) { double dir = sprite->direction(); double steps = vm->getInput(0, 1)->toDouble(); - sprite->setX(sprite->x() + std::sin(dir * pi / 180) * steps); - sprite->setY(sprite->y() + std::cos(dir * pi / 180) * steps); + sprite->setPosition(sprite->x() + std::sin(dir * pi / 180) * steps, sprite->y() + std::cos(dir * pi / 180) * steps); } return 1; @@ -392,8 +391,7 @@ unsigned int MotionBlocks::goToXY(VirtualMachine *vm) Sprite *sprite = dynamic_cast(vm->target()); if (sprite) { - sprite->setX(vm->getInput(0, 2)->toDouble()); - sprite->setY(vm->getInput(1, 2)->toDouble()); + sprite->setPosition(vm->getInput(0, 2)->toDouble(), vm->getInput(1, 2)->toDouble()); } return 2; @@ -408,26 +406,22 @@ unsigned int MotionBlocks::goTo(VirtualMachine *vm) std::string value = vm->getInput(0, 1)->toString(); - if (value == "_mouse_") { - sprite->setX(vm->engine()->mouseX()); - sprite->setY(vm->engine()->mouseY()); - } else if (value == "_random_") { + if (value == "_mouse_") + sprite->setPosition(vm->engine()->mouseX(), vm->engine()->mouseY()); + else if (value == "_random_") { const unsigned int stageWidth = vm->engine()->stageWidth(); const unsigned int stageHeight = vm->engine()->stageHeight(); if (!rng) rng = RandomGenerator::instance().get(); - sprite->setX(rng->randint(-static_cast(stageWidth / 2), stageWidth / 2)); - sprite->setY(rng->randint(-static_cast(stageHeight / 2), stageHeight / 2)); + sprite->setPosition(rng->randint(-static_cast(stageWidth / 2), stageWidth / 2), rng->randint(-static_cast(stageHeight / 2), stageHeight / 2)); } else { Target *target = vm->engine()->targetAt(vm->engine()->findTarget(value)); Sprite *targetSprite = dynamic_cast(target); - if (targetSprite) { - sprite->setX(targetSprite->x()); - sprite->setY(targetSprite->y()); - } + if (targetSprite) + sprite->setPosition(targetSprite->x(), targetSprite->y()); } return 1; @@ -439,10 +433,8 @@ unsigned int MotionBlocks::goToByIndex(VirtualMachine *vm) Target *target = vm->engine()->targetAt(vm->getInput(0, 1)->toInt()); Sprite *targetSprite = dynamic_cast(target); - if (sprite && targetSprite) { - sprite->setX(targetSprite->x()); - sprite->setY(targetSprite->y()); - } + if (sprite && targetSprite) + sprite->setPosition(targetSprite->x(), targetSprite->y()); return 1; } @@ -451,10 +443,8 @@ unsigned int MotionBlocks::goToMousePointer(VirtualMachine *vm) { Sprite *sprite = dynamic_cast(vm->target()); - if (sprite) { - sprite->setX(vm->engine()->mouseX()); - sprite->setY(vm->engine()->mouseY()); - } + if (sprite) + sprite->setPosition(vm->engine()->mouseX(), vm->engine()->mouseY()); return 0; } @@ -470,8 +460,7 @@ unsigned int MotionBlocks::goToRandomPosition(VirtualMachine *vm) if (!rng) rng = RandomGenerator::instance().get(); - sprite->setX(rng->randint(-static_cast(stageWidth / 2), stageWidth / 2)); - sprite->setY(rng->randint(-static_cast(stageHeight / 2), stageHeight / 2)); + sprite->setPosition(rng->randint(-static_cast(stageWidth / 2), stageWidth / 2), rng->randint(-static_cast(stageHeight / 2), stageHeight / 2)); } return 0; @@ -485,10 +474,8 @@ void MotionBlocks::startGlidingToPos(VirtualMachine *vm, double x, double y, dou return; if (secs <= 0) { - if (sprite) { - sprite->setX(x); - sprite->setY(y); - } + if (sprite) + sprite->setPosition(x, y); return; } @@ -516,10 +503,8 @@ void MotionBlocks::continueGliding(VirtualMachine *vm) double y = m_glideMap[vm].second.second; if (elapsedTime >= maxTime) { - if (sprite) { - sprite->setX(x); - sprite->setY(y); - } + if (sprite) + sprite->setPosition(x, y); m_timeMap.erase(vm); m_glideMap.erase(vm); @@ -530,8 +515,7 @@ void MotionBlocks::continueGliding(VirtualMachine *vm) double factor = elapsedTime / static_cast(maxTime); assert(factor >= 0 && factor < 1); - sprite->setX(startX + (x - startX) * factor); - sprite->setY(startY + (y - startY) * factor); + sprite->setPosition(startX + (x - startX) * factor, startY + (y - startY) * factor); } vm->stop(true, true, true); @@ -750,8 +734,7 @@ unsigned int MotionBlocks::ifOnEdgeBounce(VirtualMachine *vm) // Keep within the stage double fencedX, fencedY; sprite->keepInFence(sprite->x(), sprite->y(), &fencedX, &fencedY); - sprite->setX(fencedX); - sprite->setY(fencedY); + sprite->setPosition(fencedX, fencedY); return 0; } diff --git a/test/blocks/motion_blocks_test.cpp b/test/blocks/motion_blocks_test.cpp index beb8f2d4..399b2030 100644 --- a/test/blocks/motion_blocks_test.cpp +++ b/test/blocks/motion_blocks_test.cpp @@ -1132,12 +1132,13 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl) vm.setBytecode(bytecode); vm.setFunctions(functions); - EXPECT_CALL(m_engineMock, stageWidth()).Times(9).WillRepeatedly(Return(480)); - EXPECT_CALL(m_engineMock, stageHeight()).Times(9).WillRepeatedly(Return(360)); + EXPECT_CALL(m_engineMock, stageWidth()).WillRepeatedly(Return(480)); + EXPECT_CALL(m_engineMock, stageHeight()).WillRepeatedly(Return(360)); // No edge EXPECT_CALL(m_engineMock, requestRedraw()).Times(3); EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(2).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(2); EXPECT_CALL(handler, onXChanged); EXPECT_CALL(handler, onYChanged); EXPECT_CALL(handler, onDirectionChanged); @@ -1153,8 +1154,9 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl) ASSERT_EQ(sprite.direction(), -45); // Left edge - EXPECT_CALL(m_engineMock, requestRedraw()).Times(5); - EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(4).WillRepeatedly(Return(false)); + EXPECT_CALL(m_engineMock, requestRedraw()).Times(4); + EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(3).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(3); EXPECT_CALL(handler, onXChanged).Times(2); EXPECT_CALL(handler, onYChanged).Times(2); EXPECT_CALL(handler, onDirectionChanged); @@ -1170,8 +1172,9 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl) ASSERT_EQ(std::round(sprite.direction() * 100) / 100, 45); // Top edge - EXPECT_CALL(m_engineMock, requestRedraw()).Times(6); - EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(4).WillRepeatedly(Return(false)); + EXPECT_CALL(m_engineMock, requestRedraw()).Times(5); + EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(3).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(3); EXPECT_CALL(handler, onXChanged).Times(2); EXPECT_CALL(handler, onYChanged).Times(2); EXPECT_CALL(handler, onDirectionChanged).Times(2); @@ -1188,8 +1191,9 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl) ASSERT_EQ(sprite.direction(), 135); // Right edge - EXPECT_CALL(m_engineMock, requestRedraw()).Times(5); - EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(4).WillRepeatedly(Return(false)); + EXPECT_CALL(m_engineMock, requestRedraw()).Times(4); + EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(3).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(3); EXPECT_CALL(handler, onXChanged).Times(2); EXPECT_CALL(handler, onYChanged).Times(2); EXPECT_CALL(handler, onDirectionChanged); @@ -1205,8 +1209,9 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl) ASSERT_EQ(sprite.direction(), -135); // Bottom edge - EXPECT_CALL(m_engineMock, requestRedraw()).Times(5); - EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(4).WillRepeatedly(Return(false)); + EXPECT_CALL(m_engineMock, requestRedraw()).Times(4); + EXPECT_CALL(m_engineMock, spriteFencingEnabled()).Times(3).WillRepeatedly(Return(false)); + EXPECT_CALL(handler, onMoved).Times(3); EXPECT_CALL(handler, onXChanged).Times(2); EXPECT_CALL(handler, onYChanged).Times(2); EXPECT_CALL(handler, onDirectionChanged);