@@ -67,12 +67,14 @@ TEST_F(PenBlocksTest, RegisterBlocks)
6767 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_setPenColorToColor" , &PenBlocks::compileSetPenColorToColor));
6868 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_changePenSizeBy" , &PenBlocks::compileChangePenSizeBy));
6969 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_setPenSizeTo" , &PenBlocks::compileSetPenSizeTo));
70+ EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_changePenShadeBy" , &PenBlocks::compileChangePenShadeBy));
7071 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_changePenHueBy" , &PenBlocks::compileChangePenHueBy));
7172 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_setPenHueToNumber" , &PenBlocks::compileSetPenHueToNumber));
7273
7374 // Inputs
7475 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " COLOR" , PenBlocks::COLOR));
7576 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " SIZE" , PenBlocks::SIZE));
77+ EXPECT_CALL (m_engineMock, addInput (m_section.get (), " SHADE" , PenBlocks::SHADE));
7678 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " HUE" , PenBlocks::HUE));
7779
7880 m_section->registerBlocks (&m_engineMock);
@@ -429,6 +431,80 @@ TEST_F(PenBlocksTest, SetPenSizeToImpl)
429431 ASSERT_EQ (model.penAttributes ().diameter , 1200 );
430432}
431433
434+ TEST_F (PenBlocksTest, ChangePenShadeBy)
435+ {
436+ Compiler compiler (&m_engineMock);
437+
438+ // change pen shade by (4.5)
439+ auto block1 = std::make_shared<Block>(" a" , " pen_changePenShadeBy" );
440+ addValueInput (block1, " SHADE" , PenBlocks::SHADE, 4.5 );
441+
442+ // change pen shade by (null block)
443+ auto block2 = std::make_shared<Block>(" b" , " pen_changePenShadeBy" );
444+ addObscuredInput (block2, " SHADE" , PenBlocks::SHADE, createNullBlock (" c" ));
445+
446+ compiler.init ();
447+
448+ EXPECT_CALL (m_engineMock, functionIndex (&PenBlocks::changePenShadeBy)).WillOnce (Return (2 ));
449+ compiler.setBlock (block1);
450+ PenBlocks::compileChangePenShadeBy (&compiler);
451+
452+ EXPECT_CALL (m_engineMock, functionIndex (&PenBlocks::changePenShadeBy)).WillOnce (Return (2 ));
453+ compiler.setBlock (block2);
454+ PenBlocks::compileChangePenShadeBy (&compiler);
455+
456+ compiler.end ();
457+
458+ ASSERT_EQ (compiler.bytecode (), std::vector<unsigned int >({ vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 2 , vm::OP_NULL, vm::OP_EXEC, 2 , vm::OP_HALT }));
459+ ASSERT_EQ (compiler.constValues ().size (), 1 );
460+ ASSERT_EQ (compiler.constValues ()[0 ].toDouble (), 4.5 );
461+ ASSERT_TRUE (compiler.variables ().empty ());
462+ ASSERT_TRUE (compiler.lists ().empty ());
463+ }
464+
465+ TEST_F (PenBlocksTest, ChangePenShadeByImpl)
466+ {
467+ static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_HALT };
468+ static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
469+ static BlockFunc functions[] = { &PenBlocks::changePenShadeBy };
470+ static Value constValues[] = { 134.09 , -124.45 };
471+
472+ SpriteModel model;
473+ model.penState ().transparency = 100 * (1 - 150 / 255.0 );
474+ Sprite sprite;
475+ sprite.setInterface (&model);
476+
477+ VirtualMachine vm (&sprite, &m_engineMock, nullptr );
478+ vm.setBytecode (bytecode1);
479+ vm.setFunctions (functions);
480+ vm.setConstValues (constValues);
481+
482+ vm.run ();
483+ ASSERT_EQ (vm.registerCount (), 0 );
484+ ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (240 , 255 , 110 , 150 ));
485+
486+ vm.reset ();
487+ vm.run ();
488+ ASSERT_EQ (vm.registerCount (), 0 );
489+ ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (240 , 119 , 255 , 150 ));
490+
491+ vm.reset ();
492+ vm.run ();
493+ ASSERT_EQ (vm.registerCount (), 0 );
494+ ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (240 , 247 , 255 , 150 ));
495+
496+ vm.reset ();
497+ vm.setBytecode (bytecode2);
498+ vm.run ();
499+ ASSERT_EQ (vm.registerCount (), 0 );
500+ ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (240 , 162 , 255 , 150 ));
501+
502+ vm.reset ();
503+ vm.run ();
504+ ASSERT_EQ (vm.registerCount (), 0 );
505+ ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (240 , 255 , 55 , 150 ));
506+ }
507+
432508TEST_F (PenBlocksTest, ChangePenHueBy)
433509{
434510 Compiler compiler (&m_engineMock);
0 commit comments