@@ -110,6 +110,7 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
110110 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_setx" , &MotionBlocks::compileSetX));
111111 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_changeyby" , &MotionBlocks::compileChangeYBy));
112112 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_sety" , &MotionBlocks::compileSetY));
113+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " motion_setrotationstyle" , &MotionBlocks::compileSetRotationStyle));
113114
114115 // Inputs
115116 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " STEPS" , MotionBlocks::STEPS));
@@ -123,6 +124,9 @@ TEST_F(MotionBlocksTest, RegisterBlocks)
123124 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DX" , MotionBlocks::DX));
124125 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " DY" , MotionBlocks::DY));
125126
127+ // Fields
128+ EXPECT_CALL (m_engineMock, addField (m_section.get (), " STYLE" , MotionBlocks::STYLE));
129+
126130 m_section->registerBlocks (&m_engineMock);
127131}
128132
@@ -1082,3 +1086,70 @@ TEST_F(MotionBlocksTest, SetYImpl)
10821086 ASSERT_EQ (vm.registerCount (), 0 );
10831087 ASSERT_EQ (sprite.y (), 189.42 );
10841088}
1089+
1090+ TEST_F (MotionBlocksTest, SetRotationStyle)
1091+ {
1092+ Compiler compiler (&m_engineMock);
1093+
1094+ // set rotation style [left-right]
1095+ auto block1 = std::make_shared<Block>(" a" , " motion_setrotationstyle" );
1096+ addDropdownField (block1, " STYLE" , MotionBlocks::STYLE, " left-right" , MotionBlocks::LeftRight);
1097+
1098+ // set rotation style [don't rotate]
1099+ auto block2 = std::make_shared<Block>(" b" , " motion_setrotationstyle" );
1100+ addDropdownField (block2, " STYLE" , MotionBlocks::STYLE, " don't rotate" , MotionBlocks::DoNotRotate);
1101+
1102+ // set rotation style [all around]
1103+ auto block3 = std::make_shared<Block>(" c" , " motion_setrotationstyle" );
1104+ addDropdownField (block3, " STYLE" , MotionBlocks::STYLE, " all around" , MotionBlocks::AllAround);
1105+
1106+ compiler.init ();
1107+
1108+ EXPECT_CALL (m_engineMock, functionIndex (&MotionBlocks::setLeftRightRotationStyle)).WillOnce (Return (0 ));
1109+ compiler.setBlock (block1);
1110+ MotionBlocks::compileSetRotationStyle (&compiler);
1111+
1112+ EXPECT_CALL (m_engineMock, functionIndex (&MotionBlocks::setDoNotRotateRotationStyle)).WillOnce (Return (1 ));
1113+ compiler.setBlock (block2);
1114+ MotionBlocks::compileSetRotationStyle (&compiler);
1115+
1116+ EXPECT_CALL (m_engineMock, functionIndex (&MotionBlocks::setAllAroundRotationStyle)).WillOnce (Return (2 ));
1117+ compiler.setBlock (block3);
1118+ MotionBlocks::compileSetRotationStyle (&compiler);
1119+
1120+ compiler.end ();
1121+
1122+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_EXEC, 0 , vm::OP_EXEC, 1 , vm::OP_EXEC, 2 , vm::OP_HALT }));
1123+ ASSERT_TRUE (compiler.constValues ().empty ());
1124+ }
1125+
1126+ TEST_F (MotionBlocksTest, SetRotationStyleImpl)
1127+ {
1128+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT };
1129+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1 , vm::OP_HALT };
1130+ static unsigned int bytecode3[] = { vm::OP_START, vm::OP_EXEC, 2 , vm::OP_HALT };
1131+ static BlockFunc functions[] = { &MotionBlocks::setLeftRightRotationStyle, &MotionBlocks::setDoNotRotateRotationStyle, &MotionBlocks::setAllAroundRotationStyle };
1132+
1133+ Sprite sprite;
1134+
1135+ VirtualMachine vm (&sprite, nullptr , nullptr );
1136+ vm.setFunctions (functions);
1137+
1138+ vm.setBytecode (bytecode1);
1139+ vm.run ();
1140+
1141+ ASSERT_EQ (vm.registerCount (), 0 );
1142+ ASSERT_EQ (sprite.rotationStyle (), Sprite::RotationStyle::LeftRight);
1143+
1144+ vm.setBytecode (bytecode2);
1145+ vm.run ();
1146+
1147+ ASSERT_EQ (vm.registerCount (), 0 );
1148+ ASSERT_EQ (sprite.rotationStyle (), Sprite::RotationStyle::DoNotRotate);
1149+
1150+ vm.setBytecode (bytecode3);
1151+ vm.run ();
1152+
1153+ ASSERT_EQ (vm.registerCount (), 0 );
1154+ ASSERT_EQ (sprite.rotationStyle (), Sprite::RotationStyle::AllAround);
1155+ }
0 commit comments