@@ -559,3 +559,90 @@ TEST_F(ControlBlocksTest, RepeatUntil)
559559 }
560560 }
561561}
562+
563+ TEST_F (ControlBlocksTest, While)
564+ {
565+ auto target = std::make_shared<Sprite>();
566+
567+ {
568+ ScriptBuilder builder (m_extension.get (), m_engine, target);
569+
570+ builder.addBlock (" control_while" );
571+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
572+ builder.addObscuredInput (" SUBSTACK" , substack);
573+ builder.addValueInput (" CONDITION" , true );
574+ builder.build ();
575+ m_engine->start ();
576+
577+ for (int i = 0 ; i < 2 ; i++) {
578+ testing::internal::CaptureStdout ();
579+ m_engine->step ();
580+ ASSERT_EQ (testing::internal::GetCapturedStdout ().substr (0 , 10 ), " test\n test\n " );
581+ ASSERT_TRUE (m_engine->isRunning ());
582+ }
583+ }
584+
585+ m_engine->clear ();
586+ target = std::make_shared<Sprite>();
587+
588+ {
589+ ScriptBuilder builder (m_extension.get (), m_engine, target);
590+
591+ builder.addBlock (" control_while" );
592+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
593+ builder.addObscuredInput (" SUBSTACK" , substack);
594+ builder.addValueInput (" CONDITION" , false );
595+ builder.build ();
596+ m_engine->start ();
597+
598+ testing::internal::CaptureStdout ();
599+ m_engine->step ();
600+ m_engine->step ();
601+ ASSERT_TRUE (testing::internal::GetCapturedStdout ().empty ());
602+ ASSERT_FALSE (m_engine->isRunning ());
603+ }
604+
605+ m_engine->clear ();
606+ target = std::make_shared<Sprite>();
607+
608+ {
609+ ScriptBuilder builder (m_extension.get (), m_engine, target);
610+
611+ builder.addBlock (" control_while" );
612+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
613+ builder.addObscuredInput (" SUBSTACK" , substack);
614+ auto block = std::make_shared<Block>(" " , " test_condition" );
615+ builder.addObscuredInput (" CONDITION" , block);
616+ builder.build ();
617+
618+ conditionReturnValue = true ;
619+ m_engine->start ();
620+
621+ testing::internal::CaptureStdout ();
622+ m_engine->step ();
623+ ASSERT_EQ (testing::internal::GetCapturedStdout ().substr (0 , 10 ), " test\n test\n " );
624+ ASSERT_TRUE (m_engine->isRunning ());
625+
626+ conditionReturnValue = false ;
627+ m_engine->step ();
628+ m_engine->step ();
629+ ASSERT_FALSE (m_engine->isRunning ());
630+ }
631+
632+ m_engine->clear ();
633+ target = std::make_shared<Sprite>();
634+
635+ {
636+ ScriptBuilder builder (m_extension.get (), m_engine, target);
637+ builder.addBlock (" control_while" );
638+ builder.addValueInput (" CONDITION" , true );
639+
640+ builder.build ();
641+ m_engine->start ();
642+
643+ for (int i = 0 ; i < 2 ; i++) {
644+ m_engine->step ();
645+ ASSERT_TRUE (m_engine->isRunning ());
646+ }
647+ }
648+ }
0 commit comments