|
14 | 14 | using namespace libscratchcpp; |
15 | 15 |
|
16 | 16 | using ::testing::Return; |
| 17 | +using ::testing::_; |
| 18 | +using ::testing::SaveArg; |
17 | 19 |
|
18 | 20 | class ControlBlocksTest : public testing::Test |
19 | 21 | { |
@@ -153,6 +155,7 @@ TEST_F(ControlBlocksTest, RegisterBlocks) |
153 | 155 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "control_wait_until", &ControlBlocks::compileWaitUntil)).Times(1); |
154 | 156 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "control_start_as_clone", &ControlBlocks::compileStartAsClone)).Times(1); |
155 | 157 | EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "control_create_clone_of", &ControlBlocks::compileCreateClone)).Times(1); |
| 158 | + EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "control_delete_this_clone", &ControlBlocks::compileDeleteThisClone)).Times(1); |
156 | 159 |
|
157 | 160 | // Inputs |
158 | 161 | EXPECT_CALL(m_engineMock, addInput(m_section.get(), "SUBSTACK", ControlBlocks::SUBSTACK)); |
@@ -938,3 +941,47 @@ TEST_F(ControlBlocksTest, StartAsClone) |
938 | 941 | EXPECT_CALL(m_engineMock, addCloneInitScript(block)).Times(1); |
939 | 942 | ControlBlocks::compileStartAsClone(&compiler); |
940 | 943 | } |
| 944 | + |
| 945 | +TEST_F(ControlBlocksTest, DeleteThisClone) |
| 946 | +{ |
| 947 | + Compiler compiler(&m_engineMock); |
| 948 | + |
| 949 | + auto block = createControlBlock("a", "control_delete_this_clone"); |
| 950 | + |
| 951 | + EXPECT_CALL(m_engineMock, functionIndex(&ControlBlocks::deleteThisClone)).WillOnce(Return(0)); |
| 952 | + |
| 953 | + compiler.init(); |
| 954 | + compiler.setBlock(block); |
| 955 | + ControlBlocks::compileDeleteThisClone(&compiler); |
| 956 | + compiler.end(); |
| 957 | + |
| 958 | + ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT })); |
| 959 | + ASSERT_TRUE(compiler.constValues().empty()); |
| 960 | + ASSERT_TRUE(compiler.variables().empty()); |
| 961 | + ASSERT_TRUE(compiler.lists().empty()); |
| 962 | +} |
| 963 | + |
| 964 | +TEST_F(ControlBlocksTest, DeleteThisCloneImpl) |
| 965 | +{ |
| 966 | + static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }; |
| 967 | + static BlockFunc functions[] = { &ControlBlocks::deleteThisClone }; |
| 968 | + |
| 969 | + Sprite sprite; |
| 970 | + sprite.setEngine(&m_engineMock); |
| 971 | + |
| 972 | + Sprite *clone; |
| 973 | + EXPECT_CALL(m_engineMock, initClone(_)).WillOnce(SaveArg<0>(&clone)); |
| 974 | + sprite.clone(); |
| 975 | + ASSERT_TRUE(clone); |
| 976 | + |
| 977 | + VirtualMachine vm(clone, &m_engineMock, nullptr); |
| 978 | + vm.setFunctions(functions); |
| 979 | + |
| 980 | + EXPECT_CALL(m_engineMock, stopTarget(clone, nullptr)).Times(1); |
| 981 | + |
| 982 | + vm.setBytecode(bytecode); |
| 983 | + vm.run(); |
| 984 | + |
| 985 | + ASSERT_EQ(vm.registerCount(), 0); |
| 986 | + ASSERT_TRUE(sprite.children().empty()); |
| 987 | +} |
0 commit comments