44#include < scratchcpp/field.h>
55#include < scratchcpp/sprite.h>
66#include < scratchcpp/costume.h>
7- #include < scratchcpp/scratchconfiguration .h>
7+ #include < scratchcpp/rect .h>
88#include < enginemock.h>
99#include < randomgeneratormock.h>
1010#include < clockmock.h>
11- #include < imageformatfactorymock.h>
12- #include < imageformatmock.h>
11+ #include < spritehandlermock.h>
1312
1413#include " ../common.h"
1514#include " blocks/motionblocks.h"
@@ -1117,54 +1116,27 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl)
11171116 static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT };
11181117 static BlockFunc functions[] = { &MotionBlocks::ifOnEdgeBounce };
11191118
1120- auto imageFormatFactory = std::make_shared<ImageFormatFactoryMock>();
1121- auto imageFormat = std::make_shared<ImageFormatMock>();
1122-
1123- ScratchConfiguration::registerImageFormat (" test" , imageFormatFactory);
1124- EXPECT_CALL (*imageFormatFactory, createInstance ()).WillOnce (Return (imageFormat));
1125- EXPECT_CALL (*imageFormat, width ()).WillOnce (Return (0 ));
1126- EXPECT_CALL (*imageFormat, height ()).WillOnce (Return (0 ));
1127- auto costume = std::make_shared<Costume>(" costume1" , " a" , " test" );
1128-
11291119 Sprite sprite;
1130- sprite.addCostume (costume);
1131- sprite.setCostumeIndex (0 );
1132-
1133- static char data[5 ] = " abcd" ;
1134- EXPECT_CALL (*imageFormat, setData (5 , data));
1135- EXPECT_CALL (*imageFormat, width ()).WillOnce (Return (4 ));
1136- EXPECT_CALL (*imageFormat, height ()).WillOnce (Return (3 ));
1137-
1138- EXPECT_CALL (*imageFormat, colorAt (0 , 0 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1139- EXPECT_CALL (*imageFormat, colorAt (1 , 0 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1140- EXPECT_CALL (*imageFormat, colorAt (2 , 0 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 255 )));
1141- EXPECT_CALL (*imageFormat, colorAt (3 , 0 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1142-
1143- EXPECT_CALL (*imageFormat, colorAt (0 , 1 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1144- EXPECT_CALL (*imageFormat, colorAt (1 , 1 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 255 )));
1145- EXPECT_CALL (*imageFormat, colorAt (2 , 1 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1146- EXPECT_CALL (*imageFormat, colorAt (3 , 1 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 255 )));
1147-
1148- EXPECT_CALL (*imageFormat, colorAt (0 , 2 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 255 )));
1149- EXPECT_CALL (*imageFormat, colorAt (1 , 2 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1150- EXPECT_CALL (*imageFormat, colorAt (2 , 2 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1151- EXPECT_CALL (*imageFormat, colorAt (3 , 2 , 1 )).WillOnce (Return (rgba (0 , 0 , 0 , 0 )));
1152- costume->setData (5 , data);
1120+ SpriteHandlerMock handler;
1121+ EXPECT_CALL (handler, init);
1122+ sprite.setInterface (&handler);
11531123
11541124 sprite.setEngine (&m_engineMock);
11551125
11561126 VirtualMachine vm (&sprite, &m_engineMock, nullptr );
11571127 vm.setBytecode (bytecode);
11581128 vm.setFunctions (functions);
11591129
1160- EXPECT_CALL (*imageFormat, width ()).Times (9 ).WillRepeatedly (Return (4 ));
1161- EXPECT_CALL (*imageFormat, height ()).Times (9 ).WillRepeatedly (Return (3 ));
11621130 EXPECT_CALL (m_engineMock, stageWidth ()).Times (9 ).WillRepeatedly (Return (480 ));
11631131 EXPECT_CALL (m_engineMock, stageHeight ()).Times (9 ).WillRepeatedly (Return (360 ));
11641132
11651133 // No edge
11661134 EXPECT_CALL (m_engineMock, requestRedraw ()).Times (3 );
11671135 EXPECT_CALL (m_engineMock, spriteFencingEnabled ()).Times (2 ).WillRepeatedly (Return (false ));
1136+ EXPECT_CALL (handler, onXChanged);
1137+ EXPECT_CALL (handler, onYChanged);
1138+ EXPECT_CALL (handler, onDirectionChanged);
1139+ EXPECT_CALL (handler, boundingRect ()).WillOnce (Return (Rect (80 , 80 , 120 , 40 )));
11681140 sprite.setX (100 );
11691141 sprite.setY (60 );
11701142 sprite.setDirection (-45 );
@@ -1178,19 +1150,27 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl)
11781150 // Left edge
11791151 EXPECT_CALL (m_engineMock, requestRedraw ()).Times (5 );
11801152 EXPECT_CALL (m_engineMock, spriteFencingEnabled ()).Times (4 ).WillRepeatedly (Return (false ));
1153+ EXPECT_CALL (handler, onXChanged).Times (2 );
1154+ EXPECT_CALL (handler, onYChanged).Times (2 );
1155+ EXPECT_CALL (handler, onDirectionChanged);
1156+ EXPECT_CALL (handler, boundingRect ()).Times (2 ).WillRepeatedly (Return (Rect (-260 , 80 , -220 , 40 )));
11811157 sprite.setX (-240 );
11821158 sprite.setY (60 );
11831159 vm.reset ();
11841160 vm.run ();
11851161
11861162 ASSERT_EQ (vm.registerCount (), 0 );
1187- ASSERT_EQ (std::round (sprite.x () * 100 ) / 100 , -238.23 );
1163+ ASSERT_EQ (std::round (sprite.x () * 100 ) / 100 , -220 );
11881164 ASSERT_EQ (sprite.y (), 60 );
11891165 ASSERT_EQ (std::round (sprite.direction () * 100 ) / 100 , 45 );
11901166
11911167 // Top edge
11921168 EXPECT_CALL (m_engineMock, requestRedraw ()).Times (6 );
11931169 EXPECT_CALL (m_engineMock, spriteFencingEnabled ()).Times (4 ).WillRepeatedly (Return (false ));
1170+ EXPECT_CALL (handler, onXChanged).Times (2 );
1171+ EXPECT_CALL (handler, onYChanged).Times (2 );
1172+ EXPECT_CALL (handler, onDirectionChanged).Times (2 );
1173+ EXPECT_CALL (handler, boundingRect ()).Times (2 ).WillRepeatedly (Return (Rect (80 , 200 , 120 , 160 )));
11941174 sprite.setX (100 );
11951175 sprite.setY (180 );
11961176 sprite.setDirection (45 );
@@ -1199,36 +1179,42 @@ TEST_F(MotionBlocksTest, IfOnEdgeBounceImpl)
11991179
12001180 ASSERT_EQ (vm.registerCount (), 0 );
12011181 ASSERT_EQ (sprite.x (), 100 );
1202- ASSERT_EQ (std::round (sprite.y () * 100 ) / 100 , 178.23 );
1182+ ASSERT_EQ (std::round (sprite.y () * 100 ) / 100 , 160 );
12031183 ASSERT_EQ (sprite.direction (), 135 );
12041184
12051185 // Right edge
12061186 EXPECT_CALL (m_engineMock, requestRedraw ()).Times (5 );
12071187 EXPECT_CALL (m_engineMock, spriteFencingEnabled ()).Times (4 ).WillRepeatedly (Return (false ));
1188+ EXPECT_CALL (handler, onXChanged).Times (2 );
1189+ EXPECT_CALL (handler, onYChanged).Times (2 );
1190+ EXPECT_CALL (handler, onDirectionChanged);
1191+ EXPECT_CALL (handler, boundingRect ()).Times (2 ).WillRepeatedly (Return (Rect (220 , 80 , 260 , 40 )));
12081192 sprite.setX (240 );
12091193 sprite.setY (60 );
12101194 vm.reset ();
12111195 vm.run ();
12121196
12131197 ASSERT_EQ (vm.registerCount (), 0 );
1214- ASSERT_EQ (std::round (sprite.x () * 100 ) / 100 , 238.23 );
1198+ ASSERT_EQ (std::round (sprite.x () * 100 ) / 100 , 220 );
12151199 ASSERT_EQ (sprite.y (), 60 );
12161200 ASSERT_EQ (sprite.direction (), -135 );
12171201
12181202 // Bottom edge
12191203 EXPECT_CALL (m_engineMock, requestRedraw ()).Times (5 );
12201204 EXPECT_CALL (m_engineMock, spriteFencingEnabled ()).Times (4 ).WillRepeatedly (Return (false ));
1205+ EXPECT_CALL (handler, onXChanged).Times (2 );
1206+ EXPECT_CALL (handler, onYChanged).Times (2 );
1207+ EXPECT_CALL (handler, onDirectionChanged);
1208+ EXPECT_CALL (handler, boundingRect ()).Times (2 ).WillRepeatedly (Return (Rect (-120 , -160 , -80 , -200 )));
12211209 sprite.setX (-100 );
12221210 sprite.setY (-180 );
12231211 vm.reset ();
12241212 vm.run ();
12251213
12261214 ASSERT_EQ (vm.registerCount (), 0 );
12271215 ASSERT_EQ (sprite.x (), -100 );
1228- ASSERT_EQ (std::round (sprite.y () * 100 ) / 100 , -178.23 );
1216+ ASSERT_EQ (std::round (sprite.y () * 100 ) / 100 , -160 );
12291217 ASSERT_EQ (std::round (sprite.direction () * 100 ) / 100 , -45 );
1230-
1231- ScratchConfiguration::removeImageFormat (" test" );
12321218}
12331219
12341220TEST_F (MotionBlocksTest, SetRotationStyle)
0 commit comments