55#include < scratchcpp/dev/test/scriptbuilder.h>
66#include < scratchcpp/script.h>
77#include < scratchcpp/thread.h>
8+ #include < scratchcpp/block.h>
9+ #include < scratchcpp/input.h>
10+ #include < scratchcpp/field.h>
811#include < scratchcpp/dev/executioncontext.h>
912#include < scratchcpp/dev/executablecode.h>
1013#include < enginemock.h>
1114#include < randomgeneratormock.h>
1215
1316#include " ../common.h"
17+ #include " util.h"
1418#include " dev/blocks/listblocks.h"
1519
1620using namespace libscratchcpp ;
@@ -26,6 +30,7 @@ class ListBlocksTest : public testing::Test
2630 m_extension = std::make_unique<ListBlocks>();
2731 m_engine = m_project.engine ().get ();
2832 m_extension->registerBlocks (m_engine);
33+ registerBlocks (m_engine, m_extension.get ());
2934 }
3035
3136 std::unique_ptr<IExtension> m_extension;
@@ -267,3 +272,67 @@ TEST_F(ListBlocksTest, ReplaceItemOfList)
267272 ASSERT_EQ (list1->toString (), " Lorem ipsum dolor sit -53.18" );
268273 ASSERT_EQ (list2->toString (), " dolor world false ipsum abc lorem" );
269274}
275+
276+ TEST_F (ListBlocksTest, ItemOfList)
277+ {
278+ auto target = std::make_shared<Sprite>();
279+
280+ auto list = std::make_shared<List>(" list" , " " );
281+ list->append (" Lorem" );
282+ list->append (" ipsum" );
283+ list->append (" dolor" );
284+ list->append (123 );
285+ list->append (true );
286+ target->addList (list);
287+
288+ ScriptBuilder builder (m_extension.get (), m_engine, target);
289+
290+ auto addTest = [&builder](const Value &index, std::shared_ptr<List> list) {
291+ builder.addBlock (" test_const_string" );
292+ builder.addValueInput (" STRING" , index);
293+ auto valueBlock = builder.takeBlock ();
294+
295+ builder.addBlock (" data_itemoflist" );
296+ builder.addObscuredInput (" INDEX" , valueBlock);
297+ builder.addEntityField (" LIST" , list);
298+ auto block = builder.takeBlock ();
299+
300+ builder.addBlock (" test_print" );
301+ builder.addObscuredInput (" STRING" , block);
302+ return builder.currentBlock ();
303+ };
304+
305+ auto block = addTest (3 , list);
306+ addTest (5 , list);
307+ addTest (0 , list);
308+ addTest (6 , list);
309+
310+ addTest (" last" , list);
311+ addTest (" random" , list);
312+ addTest (" any" , list);
313+
314+ builder.build ();
315+
316+ Compiler compiler (&m_engineMock, target.get ());
317+ auto code = compiler.compile (block);
318+ Script script (target.get (), block, &m_engineMock);
319+ script.setCode (code);
320+ Thread thread (target.get (), &m_engineMock, &script);
321+ auto ctx = code->createExecutionContext (&thread);
322+ ctx->setRng (&m_rng);
323+
324+ static const std::string expected =
325+ " dolor\n "
326+ " true\n "
327+ " 0\n "
328+ " 0\n "
329+ " true\n "
330+ " 123\n "
331+ " Lorem\n " ;
332+
333+ EXPECT_CALL (m_rng, randint (1 , 5 )).WillOnce (Return (4 )).WillOnce (Return (1 ));
334+ testing::internal::CaptureStdout ();
335+ code->run (ctx.get ());
336+ ASSERT_EQ (testing::internal::GetCapturedStdout (), expected);
337+ ASSERT_EQ (list->toString (), " Lorem ipsum dolor 123 true" );
338+ }
0 commit comments