Skip to content

Commit 746f508

Browse files
committed
Implement sensing_loud block
1 parent 0c52743 commit 746f508

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
3939
engine->addCompileFunction(this, "sensing_mousey", &compileMouseY);
4040
engine->addCompileFunction(this, "sensing_setdragmode", &compileSetDragMode);
4141
engine->addCompileFunction(this, "sensing_loudness", &compileLoudness);
42+
engine->addCompileFunction(this, "sensing_loud", &compileLoud);
4243
engine->addCompileFunction(this, "sensing_timer", &compileTimer);
4344
engine->addCompileFunction(this, "sensing_resettimer", &compileResetTimer);
4445
engine->addCompileFunction(this, "sensing_of", &compileOf);
@@ -166,6 +167,11 @@ void SensingBlocks::compileLoudness(Compiler *compiler)
166167
compiler->addFunctionCall(&loudness);
167168
}
168169

170+
void SensingBlocks::compileLoud(Compiler *compiler)
171+
{
172+
compiler->addFunctionCall(&loud);
173+
}
174+
169175
void SensingBlocks::compileTimer(Compiler *compiler)
170176
{
171177
compiler->addFunctionCall(&timer);
@@ -479,6 +485,16 @@ unsigned int SensingBlocks::loudness(VirtualMachine *vm)
479485
return 0;
480486
}
481487

488+
unsigned int SensingBlocks::loud(VirtualMachine *vm)
489+
{
490+
if (!audioInput)
491+
audioInput = AudioInput::instance().get();
492+
493+
auto audioLoudness = audioInput->audioLoudness();
494+
vm->addReturnValue(audioLoudness->getLoudness() > 10.0);
495+
return 0;
496+
}
497+
482498
unsigned int SensingBlocks::distanceTo(VirtualMachine *vm)
483499
{
484500
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());

src/blocks/sensingblocks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class SensingBlocks : public IBlockSection
6868
static void compileMouseY(Compiler *compiler);
6969
static void compileSetDragMode(Compiler *compiler);
7070
static void compileLoudness(Compiler *compiler);
71+
static void compileLoud(Compiler *compiler);
7172
static void compileTimer(Compiler *compiler);
7273
static void compileResetTimer(Compiler *compiler);
7374
static void compileOf(Compiler *compiler);
@@ -91,6 +92,7 @@ class SensingBlocks : public IBlockSection
9192
static unsigned int setNotDraggableMode(VirtualMachine *vm);
9293

9394
static unsigned int loudness(VirtualMachine *vm);
95+
static unsigned int loud(VirtualMachine *vm);
9496

9597
static unsigned int distanceTo(VirtualMachine *vm);
9698
static unsigned int distanceToByIndex(VirtualMachine *vm);

test/blocks/sensing_blocks_test.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
132132
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousey", &SensingBlocks::compileMouseY));
133133
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_setdragmode", &SensingBlocks::compileSetDragMode));
134134
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_loudness", &SensingBlocks::compileLoudness));
135+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_loud", &SensingBlocks::compileLoud));
135136
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_timer", &SensingBlocks::compileTimer));
136137
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_resettimer", &SensingBlocks::compileResetTimer));
137138
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_of", &SensingBlocks::compileOf));
@@ -804,6 +805,84 @@ TEST_F(SensingBlocksTest, LoudnessImpl)
804805
SensingBlocks::audioInput = nullptr;
805806
}
806807

808+
TEST_F(SensingBlocksTest, Loud)
809+
{
810+
Compiler compiler(&m_engineMock);
811+
812+
auto block = std::make_shared<Block>("a", "sensing_loud");
813+
814+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::loud)).WillOnce(Return(0));
815+
compiler.init();
816+
817+
compiler.setBlock(block);
818+
SensingBlocks::compileLoud(&compiler);
819+
820+
compiler.end();
821+
822+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT }));
823+
ASSERT_TRUE(compiler.constValues().empty());
824+
}
825+
826+
TEST_F(SensingBlocksTest, LoudImpl)
827+
{
828+
static unsigned int bytecode[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
829+
static BlockFunc functions[] = { &SensingBlocks::loud };
830+
831+
VirtualMachine vm(nullptr, &m_engineMock, nullptr);
832+
vm.setFunctions(functions);
833+
834+
vm.setBytecode(bytecode);
835+
vm.run();
836+
837+
ASSERT_EQ(vm.registerCount(), 1);
838+
839+
AudioInputMock audioInput;
840+
auto audioLoudness = std::make_shared<AudioLoudnessMock>();
841+
SensingBlocks::audioInput = &audioInput;
842+
843+
EXPECT_CALL(audioInput, audioLoudness()).WillOnce(Return(audioLoudness));
844+
EXPECT_CALL(*audioLoudness, getLoudness()).WillOnce(Return(-1));
845+
vm.reset();
846+
vm.run();
847+
848+
ASSERT_EQ(vm.registerCount(), 1);
849+
ASSERT_FALSE(vm.getInput(0, 1)->toBool());
850+
851+
EXPECT_CALL(audioInput, audioLoudness()).WillOnce(Return(audioLoudness));
852+
EXPECT_CALL(*audioLoudness, getLoudness()).WillOnce(Return(62));
853+
vm.reset();
854+
vm.run();
855+
856+
ASSERT_EQ(vm.registerCount(), 1);
857+
ASSERT_TRUE(vm.getInput(0, 1)->toBool());
858+
859+
EXPECT_CALL(audioInput, audioLoudness()).WillOnce(Return(audioLoudness));
860+
EXPECT_CALL(*audioLoudness, getLoudness()).WillOnce(Return(9));
861+
vm.reset();
862+
vm.run();
863+
864+
ASSERT_EQ(vm.registerCount(), 1);
865+
ASSERT_FALSE(vm.getInput(0, 1)->toBool());
866+
867+
EXPECT_CALL(audioInput, audioLoudness()).WillOnce(Return(audioLoudness));
868+
EXPECT_CALL(*audioLoudness, getLoudness()).WillOnce(Return(10));
869+
vm.reset();
870+
vm.run();
871+
872+
ASSERT_EQ(vm.registerCount(), 1);
873+
ASSERT_FALSE(vm.getInput(0, 1)->toBool());
874+
875+
EXPECT_CALL(audioInput, audioLoudness()).WillOnce(Return(audioLoudness));
876+
EXPECT_CALL(*audioLoudness, getLoudness()).WillOnce(Return(11));
877+
vm.reset();
878+
vm.run();
879+
880+
ASSERT_EQ(vm.registerCount(), 1);
881+
ASSERT_TRUE(vm.getInput(0, 1)->toBool());
882+
883+
SensingBlocks::audioInput = nullptr;
884+
}
885+
807886
TEST_F(SensingBlocksTest, Timer)
808887
{
809888
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)