Skip to content

Commit 069f2aa

Browse files
committed
Implement sensing_answer block
1 parent 76718fd commit 069f2aa

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
2929
// Blocks
3030
engine->addCompileFunction(this, "sensing_distanceto", &compileDistanceTo);
3131
engine->addCompileFunction(this, "sensing_askandwait", &compileAskAndWait);
32+
engine->addCompileFunction(this, "sensing_answer", &compileAnswer);
3233
engine->addCompileFunction(this, "sensing_keypressed", &compileKeyPressed);
3334
engine->addCompileFunction(this, "sensing_mousedown", &compileMouseDown);
3435
engine->addCompileFunction(this, "sensing_mousex", &compileMouseX);
@@ -110,6 +111,11 @@ void SensingBlocks::compileAskAndWait(Compiler *compiler)
110111
compiler->addFunctionCall(&askAndWait);
111112
}
112113

114+
void SensingBlocks::compileAnswer(Compiler *compiler)
115+
{
116+
compiler->addFunctionCall(&answer);
117+
}
118+
113119
void SensingBlocks::compileKeyPressed(Compiler *compiler)
114120
{
115121
compiler->addInput(KEY_OPTION);
@@ -531,6 +537,12 @@ unsigned int SensingBlocks::askAndWait(VirtualMachine *vm)
531537
return 1;
532538
}
533539

540+
unsigned int SensingBlocks::answer(VirtualMachine *vm)
541+
{
542+
vm->addReturnValue(m_answer);
543+
return 0;
544+
}
545+
534546
unsigned int SensingBlocks::timer(VirtualMachine *vm)
535547
{
536548
vm->addReturnValue(vm->engine()->timer()->value());

src/blocks/sensingblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class SensingBlocks : public IBlockSection
6060

6161
static void compileDistanceTo(Compiler *compiler);
6262
static void compileAskAndWait(Compiler *compiler);
63+
static void compileAnswer(Compiler *compiler);
6364
static void compileKeyPressed(Compiler *compiler);
6465
static void compileMouseDown(Compiler *compiler);
6566
static void compileMouseX(Compiler *compiler);
@@ -92,6 +93,7 @@ class SensingBlocks : public IBlockSection
9293

9394
static void onAnswer(const std::string &answer);
9495
static unsigned int askAndWait(VirtualMachine *vm);
96+
static unsigned int answer(VirtualMachine *vm);
9597

9698
static unsigned int timer(VirtualMachine *vm);
9799
static unsigned int resetTimer(VirtualMachine *vm);

test/blocks/sensing_blocks_test.cpp

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
123123
// Blocks
124124
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_distanceto", &SensingBlocks::compileDistanceTo));
125125
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_askandwait", &SensingBlocks::compileAskAndWait));
126+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_answer", &SensingBlocks::compileAnswer));
126127
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_keypressed", &SensingBlocks::compileKeyPressed));
127128
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousedown", &SensingBlocks::compileMouseDown));
128129
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousex", &SensingBlocks::compileMouseX));
@@ -343,12 +344,31 @@ TEST_F(SensingBlocksTest, AskAndWait)
343344
ASSERT_EQ(compiler.constValues()[0].toString(), "test");
344345
}
345346

346-
TEST_F(SensingBlocksTest, AskAndWaitImpl)
347+
TEST_F(SensingBlocksTest, Answer)
348+
{
349+
Compiler compiler(&m_engineMock);
350+
351+
auto block = std::make_shared<Block>("a", "sensing_answer");
352+
353+
compiler.init();
354+
355+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::answer)).WillOnce(Return(0));
356+
compiler.setBlock(block);
357+
SensingBlocks::compileAnswer(&compiler);
358+
359+
compiler.end();
360+
361+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
362+
ASSERT_TRUE(compiler.constValues().empty());
363+
}
364+
365+
TEST_F(SensingBlocksTest, AskAndWaitAndAnswerImpl)
347366
{
348367
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
349368
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1, vm::OP_EXEC, 0, vm::OP_HALT };
350369
static unsigned int bytecode3[] = { vm::OP_START, vm::OP_CONST, 2, vm::OP_EXEC, 0, vm::OP_HALT };
351-
static BlockFunc functions[] = { &SensingBlocks::askAndWait };
370+
static unsigned int bytecode4[] = { vm::OP_START, vm::OP_EXEC, 1, vm::OP_HALT };
371+
static BlockFunc functions[] = { &SensingBlocks::askAndWait, &SensingBlocks::answer };
352372
static Value constValues[] = { "test1", "test2", "test3" };
353373

354374
Sprite sprite;
@@ -415,19 +435,40 @@ TEST_F(SensingBlocksTest, AskAndWaitImpl)
415435
ASSERT_EQ(sprite.bubbleType(), Target::BubbleType::Say);
416436
ASSERT_EQ(sprite.bubbleText(), "test2");
417437

438+
vm1.reset();
439+
vm1.setBytecode(bytecode4);
440+
vm1.run();
441+
ASSERT_EQ(vm1.registerCount(), 1);
442+
ASSERT_EQ(vm1.getInput(0, 1)->toString(), "hi");
443+
418444
EXPECT_CALL(m_engineMock, questionAsked()).WillOnce(ReturnRef(asked));
419445
EXPECT_CALL(spy, asked("test3"));
420446
SensingBlocks::onAnswer("hello");
421447
ASSERT_TRUE(sprite.bubbleText().empty());
422448

449+
vm1.reset();
450+
vm1.run();
451+
ASSERT_EQ(vm1.registerCount(), 1);
452+
ASSERT_EQ(vm1.getInput(0, 1)->toString(), "hello");
453+
423454
EXPECT_CALL(m_engineMock, questionAsked()).WillOnce(ReturnRef(asked));
424455
EXPECT_CALL(spy, asked("test2"));
425456
SensingBlocks::onAnswer("world");
426457
ASSERT_TRUE(sprite.bubbleText().empty());
427458
ASSERT_TRUE(stage.bubbleText().empty());
428459

460+
vm1.reset();
461+
vm1.run();
462+
ASSERT_EQ(vm1.registerCount(), 1);
463+
ASSERT_EQ(vm1.getInput(0, 1)->toString(), "world");
464+
429465
EXPECT_CALL(m_engineMock, questionAsked).Times(0);
430466
SensingBlocks::onAnswer("test");
467+
468+
vm1.reset();
469+
vm1.run();
470+
ASSERT_EQ(vm1.registerCount(), 1);
471+
ASSERT_EQ(vm1.getInput(0, 1)->toString(), "test");
431472
}
432473

433474
TEST_F(SensingBlocksTest, KeyPressed)

0 commit comments

Comments
 (0)