@@ -472,3 +472,90 @@ TEST_F(ControlBlocksTest, WaitUntil)
472472 ASSERT_FALSE (m_engine->isRunning ());
473473 }
474474}
475+
476+ TEST_F (ControlBlocksTest, RepeatUntil)
477+ {
478+ auto target = std::make_shared<Sprite>();
479+
480+ {
481+ ScriptBuilder builder (m_extension.get (), m_engine, target);
482+
483+ builder.addBlock (" control_repeat_until" );
484+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
485+ builder.addObscuredInput (" SUBSTACK" , substack);
486+ builder.addValueInput (" CONDITION" , false );
487+ builder.build ();
488+ m_engine->start ();
489+
490+ for (int i = 0 ; i < 2 ; i++) {
491+ testing::internal::CaptureStdout ();
492+ m_engine->step ();
493+ ASSERT_EQ (testing::internal::GetCapturedStdout ().substr (0 , 10 ), " test\n test\n " );
494+ ASSERT_TRUE (m_engine->isRunning ());
495+ }
496+ }
497+
498+ m_engine->clear ();
499+ target = std::make_shared<Sprite>();
500+
501+ {
502+ ScriptBuilder builder (m_extension.get (), m_engine, target);
503+
504+ builder.addBlock (" control_repeat_until" );
505+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
506+ builder.addObscuredInput (" SUBSTACK" , substack);
507+ builder.addValueInput (" CONDITION" , true );
508+ builder.build ();
509+ m_engine->start ();
510+
511+ testing::internal::CaptureStdout ();
512+ m_engine->step ();
513+ m_engine->step ();
514+ ASSERT_TRUE (testing::internal::GetCapturedStdout ().empty ());
515+ ASSERT_FALSE (m_engine->isRunning ());
516+ }
517+
518+ m_engine->clear ();
519+ target = std::make_shared<Sprite>();
520+
521+ {
522+ ScriptBuilder builder (m_extension.get (), m_engine, target);
523+
524+ builder.addBlock (" control_repeat_until" );
525+ auto substack = std::make_shared<Block>(" " , " test_print_test" );
526+ builder.addObscuredInput (" SUBSTACK" , substack);
527+ auto block = std::make_shared<Block>(" " , " test_condition" );
528+ builder.addObscuredInput (" CONDITION" , block);
529+ builder.build ();
530+
531+ conditionReturnValue = false ;
532+ m_engine->start ();
533+
534+ testing::internal::CaptureStdout ();
535+ m_engine->step ();
536+ ASSERT_EQ (testing::internal::GetCapturedStdout ().substr (0 , 10 ), " test\n test\n " );
537+ ASSERT_TRUE (m_engine->isRunning ());
538+
539+ conditionReturnValue = true ;
540+ m_engine->step ();
541+ m_engine->step ();
542+ ASSERT_FALSE (m_engine->isRunning ());
543+ }
544+
545+ m_engine->clear ();
546+ target = std::make_shared<Sprite>();
547+
548+ {
549+ ScriptBuilder builder (m_extension.get (), m_engine, target);
550+ builder.addBlock (" control_repeat_until" );
551+ builder.addValueInput (" CONDITION" , false );
552+
553+ builder.build ();
554+ m_engine->start ();
555+
556+ for (int i = 0 ; i < 2 ; i++) {
557+ m_engine->step ();
558+ ASSERT_TRUE (m_engine->isRunning ());
559+ }
560+ }
561+ }
0 commit comments