@@ -46,6 +46,7 @@ TEST_F(PenBlocksTest, RegisterBlocks)
4646 // Blocks
4747 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_clear" , &PenBlocks::compileClear));
4848 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_penDown" , &PenBlocks::compilePenDown));
49+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_penUp" , &PenBlocks::compilePenUp));
4950
5051 m_section->registerBlocks (&m_engineMock);
5152}
@@ -127,3 +128,45 @@ TEST_F(PenBlocksTest, PenDownImpl)
127128 ASSERT_EQ (vm.registerCount (), 0 );
128129 ASSERT_TRUE (model.penDown ());
129130}
131+
132+ TEST_F (PenBlocksTest, PenUp)
133+ {
134+ Compiler compiler (&m_engineMock);
135+
136+ auto block = std::make_shared<Block>(" a" , " pen_penUp" );
137+
138+ EXPECT_CALL (m_engineMock, functionIndex (&PenBlocks::penUp)).WillOnce (Return (2 ));
139+ compiler.init ();
140+ compiler.setBlock (block);
141+ PenBlocks::compilePenUp (&compiler);
142+ compiler.end ();
143+
144+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_EXEC, 2 , vm::OP_HALT }));
145+ ASSERT_TRUE (compiler.constValues ().empty ());
146+ ASSERT_TRUE (compiler.variables ().empty ());
147+ ASSERT_TRUE (compiler.lists ().empty ());
148+ }
149+
150+ TEST_F (PenBlocksTest, PenUpImpl)
151+ {
152+ static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0 , vm::OP_HALT };
153+ static BlockFunc functions[] = { &PenBlocks::penUp };
154+
155+ SpriteModel model;
156+ model.setPenDown (true );
157+ Sprite sprite;
158+ sprite.setInterface (&model);
159+
160+ VirtualMachine vm (&sprite, &m_engineMock, nullptr );
161+ vm.setBytecode (bytecode);
162+ vm.setFunctions (functions);
163+
164+ vm.run ();
165+ ASSERT_EQ (vm.registerCount (), 0 );
166+ ASSERT_FALSE (model.penDown ());
167+
168+ vm.reset ();
169+ vm.run ();
170+ ASSERT_EQ (vm.registerCount (), 0 );
171+ ASSERT_FALSE (model.penDown ());
172+ }
0 commit comments