@@ -67,10 +67,12 @@ TEST_F(PenBlocksTest, RegisterBlocks)
6767 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_setPenColorToColor" 
6868 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_changePenSizeBy" 
6969 EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_setPenSizeTo" 
70+  EXPECT_CALL (m_engineMock, addCompileFunction (m_section.get (), " pen_changePenHueBy" 
7071
7172 //  Inputs
7273 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " COLOR" 
7374 EXPECT_CALL (m_engineMock, addInput (m_section.get (), " SIZE" 
75+  EXPECT_CALL (m_engineMock, addInput (m_section.get (), " HUE" 
7476
7577 m_section->registerBlocks (&m_engineMock);
7678}
@@ -425,3 +427,77 @@ TEST_F(PenBlocksTest, SetPenSizeToImpl)
425427 ASSERT_EQ (vm.registerCount (), 0 );
426428 ASSERT_EQ (model.penAttributes ().diameter , 1200 );
427429}
430+ 
431+ TEST_F (PenBlocksTest, ChangePenHueBy)
432+ {
433+  Compiler compiler (&m_engineMock);
434+ 
435+  //  change pen hue by (4.5)
436+  auto  block1 = std::make_shared<Block>(" a" " pen_changePenHueBy" 
437+  addValueInput (block1, " HUE" 4.5 );
438+ 
439+  //  change pen hue by (null block)
440+  auto  block2 = std::make_shared<Block>(" b" " pen_changePenHueBy" 
441+  addObscuredInput (block2, " HUE" createNullBlock (" c" 
442+ 
443+  compiler.init ();
444+ 
445+  EXPECT_CALL (m_engineMock, functionIndex (&PenBlocks::changePenHueBy)).WillOnce (Return (2 ));
446+  compiler.setBlock (block1);
447+  PenBlocks::compileChangePenHueBy (&compiler);
448+ 
449+  EXPECT_CALL (m_engineMock, functionIndex (&PenBlocks::changePenHueBy)).WillOnce (Return (2 ));
450+  compiler.setBlock (block2);
451+  PenBlocks::compileChangePenHueBy (&compiler);
452+ 
453+  compiler.end ();
454+ 
455+  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 }));
456+  ASSERT_EQ (compiler.constValues ().size (), 1 );
457+  ASSERT_EQ (compiler.constValues ()[0 ].toDouble (), 4.5 );
458+  ASSERT_TRUE (compiler.variables ().empty ());
459+  ASSERT_TRUE (compiler.lists ().empty ());
460+ }
461+ 
462+ TEST_F (PenBlocksTest, ChangePenHueByImpl)
463+ {
464+  static  unsigned  int  bytecode1[] = { vm::OP_START, vm::OP_CONST, 0 , vm::OP_EXEC, 0 , vm::OP_HALT };
465+  static  unsigned  int  bytecode2[] = { vm::OP_START, vm::OP_CONST, 1 , vm::OP_EXEC, 0 , vm::OP_HALT };
466+  static  BlockFunc functions[] = { &PenBlocks::changePenHueBy };
467+  static  Value constValues[] = { 125.7 , -114.09  };
468+ 
469+  SpriteModel model;
470+  model.penAttributes ().color .setAlpha (150 );
471+  Sprite sprite;
472+  sprite.setInterface (&model);
473+ 
474+  VirtualMachine vm (&sprite, &m_engineMock, nullptr );
475+  vm.setBytecode (bytecode1);
476+  vm.setFunctions (functions);
477+  vm.setConstValues (constValues);
478+ 
479+  vm.run ();
480+  ASSERT_EQ (vm.registerCount (), 0 );
481+  ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (103 , 255 , 255 , 150 ));
482+ 
483+  vm.reset ();
484+  vm.run ();
485+  ASSERT_EQ (vm.registerCount (), 0 );
486+  ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (329 , 255 , 255 , 150 ));
487+ 
488+  vm.reset ();
489+  vm.run ();
490+  ASSERT_EQ (vm.registerCount (), 0 );
491+  ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (192 , 255 , 255 , 150 ));
492+ 
493+  vm.reset ();
494+  vm.setBytecode (bytecode2);
495+  vm.run ();
496+  ASSERT_EQ (vm.registerCount (), 0 );
497+  ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (350 , 255 , 255 , 150 ));
498+ 
499+  vm.reset ();
500+  vm.run ();
501+  ASSERT_EQ (vm.registerCount (), 0 );
502+  ASSERT_EQ (model.penAttributes ().color , QColor::fromHsv (145 , 255 , 255 , 150 ));
503+ }
0 commit comments