99#include < scratchcpp/executablecode.h>
1010#include < enginemock.h>
1111#include < targetmock.h>
12+ #include < audioinputmock.h>
13+ #include < audioloudnessmock.h>
14+ #include < timermock.h>
1215
1316#include " ../common.h"
1417#include " blocks/eventblocks.h"
@@ -126,6 +129,24 @@ TEST_F(EventBlocksTest, WhenTouchingObjectPredicate)
126129 ASSERT_TRUE (thread.runPredicate ());
127130 }
128131
132+ // "_stage_"
133+ {
134+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
135+ builder.addBlock (" event_whentouchingobject" );
136+ builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " " );
137+ auto block = builder.currentBlock ();
138+
139+ Compiler compiler (&m_engineMock, target.get ());
140+ auto code = compiler.compile (block, true );
141+ Script script (target.get (), block, &m_engineMock);
142+ script.setHatPredicateCode (code);
143+ Thread thread (target.get (), &m_engineMock, &script);
144+
145+ EXPECT_CALL (m_engineMock, findTarget (" " )).WillOnce (Return (-1 ));
146+ EXPECT_CALL (m_engineMock, targetAt (-1 )).WillOnce (Return (nullptr ));
147+ ASSERT_FALSE (thread.runPredicate ());
148+ }
149+
129150 // ""
130151 {
131152 ScriptBuilder builder (m_extension.get (), m_engine, target, false );
@@ -215,12 +236,10 @@ TEST_F(EventBlocksTest, WhenBackdropSwitchesTo)
215236 compiler.compile (block);
216237}
217238
218- // TODO: Add test for when greater than hat predicate
219-
220239TEST_F (EventBlocksTest, WhenGreaterThan)
221240{
222241 auto target = std::make_shared<Sprite>();
223- ScriptBuilder builder (m_extension.get (), m_engine, target);
242+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
224243
225244 builder.addBlock (" event_whengreaterthan" );
226245 builder.addDropdownField (" WHENGREATERTHANMENU" , " LOUDNESS" );
@@ -232,6 +251,61 @@ TEST_F(EventBlocksTest, WhenGreaterThan)
232251 compiler.compile (block);
233252}
234253
254+ TEST_F (EventBlocksTest, WhenGreaterThanPredicate)
255+ {
256+ auto target = std::make_shared<Sprite>();
257+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
258+
259+ const std::vector<Value> values = { 22.7 , 23 , 23.5 };
260+ const std::vector<bool > retValues = { true , false , false };
261+
262+ AudioInputMock audioInput;
263+ auto audioLoudness = std::make_shared<AudioLoudnessMock>();
264+ EventBlocks::audioInput = &audioInput;
265+ EXPECT_CALL (audioInput, audioLoudness ()).Times (3 ).WillRepeatedly (Return (audioLoudness));
266+ EXPECT_CALL (*audioLoudness, getLoudness ()).Times (3 ).WillRepeatedly (Return (23 ));
267+
268+ // when [loudness] > x
269+ for (int i = 0 ; i < values.size (); i++) {
270+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
271+ builder.addBlock (" event_whengreaterthan" );
272+ builder.addDropdownField (" WHENGREATERTHANMENU" , " LOUDNESS" );
273+ builder.addValueInput (" VALUE" , values[i]);
274+ auto block = builder.currentBlock ();
275+
276+ Compiler compiler (&m_engineMock, target.get ());
277+ auto code = compiler.compile (block, true );
278+ Script script (target.get (), block, &m_engineMock);
279+ script.setHatPredicateCode (code);
280+ Thread thread (target.get (), &m_engineMock, &script);
281+
282+ ASSERT_EQ (thread.runPredicate (), retValues[i]);
283+ }
284+
285+ EventBlocks::audioInput = nullptr ;
286+
287+ TimerMock timer;
288+ EXPECT_CALL (m_engineMock, timer ()).Times (3 ).WillRepeatedly (Return (&timer));
289+ EXPECT_CALL (timer, value ()).Times (3 ).WillRepeatedly (Return (23 ));
290+
291+ // when [timer] > x
292+ for (int i = 0 ; i < values.size (); i++) {
293+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
294+ builder.addBlock (" event_whengreaterthan" );
295+ builder.addDropdownField (" WHENGREATERTHANMENU" , " TIMER" );
296+ builder.addValueInput (" VALUE" , values[i]);
297+ auto block = builder.currentBlock ();
298+
299+ Compiler compiler (&m_engineMock, target.get ());
300+ auto code = compiler.compile (block, true );
301+ Script script (target.get (), block, &m_engineMock);
302+ script.setHatPredicateCode (code);
303+ Thread thread (target.get (), &m_engineMock, &script);
304+
305+ ASSERT_EQ (thread.runPredicate (), retValues[i]);
306+ }
307+ }
308+
235309TEST_F (EventBlocksTest, Broadcast)
236310{
237311 auto broadcast = std::make_shared<Broadcast>(" " , " test" );
0 commit comments