88#include < scratchcpp/thread.h>
99#include < scratchcpp/executablecode.h>
1010#include < enginemock.h>
11+ #include < targetmock.h>
1112
1213#include " ../common.h"
1314#include " blocks/eventblocks.h"
@@ -33,12 +34,10 @@ class EventBlocksTest : public testing::Test
3334 EngineMock m_engineMock;
3435};
3536
36- // TODO: Add test for when touching object hat predicate
37-
3837TEST_F (EventBlocksTest, WhenTouchingObject)
3938{
4039 auto target = std::make_shared<Sprite>();
41- ScriptBuilder builder (m_extension.get (), m_engine, target);
40+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
4241
4342 builder.addBlock (" event_whentouchingobject" );
4443 builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " Sprite1" );
@@ -49,6 +48,103 @@ TEST_F(EventBlocksTest, WhenTouchingObject)
4948 compiler.compile (block);
5049}
5150
51+ TEST_F (EventBlocksTest, WhenTouchingObjectPredicate)
52+ {
53+ auto target = std::make_shared<TargetMock>();
54+ target->setEngine (&m_engineMock);
55+ Sprite sprite;
56+
57+ // "Sprite1"
58+ {
59+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
60+ builder.addBlock (" event_whentouchingobject" );
61+ builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " Sprite1" );
62+ auto block = builder.currentBlock ();
63+
64+ Compiler compiler (&m_engineMock, target.get ());
65+ auto code = compiler.compile (block, true );
66+ Script script (target.get (), block, &m_engineMock);
67+ script.setHatPredicateCode (code);
68+ Thread thread (target.get (), &m_engineMock, &script);
69+
70+ EXPECT_CALL (m_engineMock, findTarget (" Sprite1" )).WillOnce (Return (3 ));
71+ EXPECT_CALL (m_engineMock, targetAt (3 )).WillOnce (Return (&sprite));
72+ EXPECT_CALL (*target, touchingClones).WillOnce (Return (false ));
73+ ASSERT_FALSE (thread.runPredicate ());
74+
75+ EXPECT_CALL (m_engineMock, findTarget (" Sprite1" )).WillOnce (Return (3 ));
76+ EXPECT_CALL (m_engineMock, targetAt (3 )).WillOnce (Return (&sprite));
77+ EXPECT_CALL (*target, touchingClones).WillOnce (Return (true ));
78+ ASSERT_TRUE (thread.runPredicate ());
79+ }
80+
81+ // "_mouse_"
82+ {
83+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
84+ builder.addBlock (" event_whentouchingobject" );
85+ builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " _mouse_" );
86+ auto block = builder.currentBlock ();
87+
88+ Compiler compiler (&m_engineMock, target.get ());
89+ auto code = compiler.compile (block, true );
90+ Script script (target.get (), block, &m_engineMock);
91+ script.setHatPredicateCode (code);
92+ Thread thread (target.get (), &m_engineMock, &script);
93+
94+ EXPECT_CALL (m_engineMock, mouseX ()).WillOnce (Return (24.5 ));
95+ EXPECT_CALL (m_engineMock, mouseY ()).WillOnce (Return (-16.04 ));
96+ EXPECT_CALL (*target, touchingPoint (24.5 , -16.04 )).WillOnce (Return (false ));
97+ ASSERT_FALSE (thread.runPredicate ());
98+
99+ EXPECT_CALL (m_engineMock, mouseX ()).WillOnce (Return (24.5 ));
100+ EXPECT_CALL (m_engineMock, mouseY ()).WillOnce (Return (-16.04 ));
101+ EXPECT_CALL (*target, touchingPoint (24.5 , -16.04 )).WillOnce (Return (true ));
102+ ASSERT_TRUE (thread.runPredicate ());
103+ }
104+
105+ // "_edge_"
106+ {
107+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
108+ builder.addBlock (" event_whentouchingobject" );
109+ builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " _edge_" );
110+ auto block = builder.currentBlock ();
111+
112+ Compiler compiler (&m_engineMock, target.get ());
113+ auto code = compiler.compile (block, true );
114+ Script script (target.get (), block, &m_engineMock);
115+ script.setHatPredicateCode (code);
116+ Thread thread (target.get (), &m_engineMock, &script);
117+
118+ EXPECT_CALL (m_engineMock, stageWidth ()).WillOnce (Return (10 ));
119+ EXPECT_CALL (m_engineMock, stageHeight ()).WillOnce (Return (10 ));
120+ EXPECT_CALL (*target, boundingRect ()).WillOnce (Return (Rect (-5 , 5 , 5 , -5 )));
121+ ASSERT_FALSE (thread.runPredicate ());
122+
123+ EXPECT_CALL (m_engineMock, stageWidth ()).WillOnce (Return (0 ));
124+ EXPECT_CALL (m_engineMock, stageHeight ()).WillOnce (Return (0 ));
125+ EXPECT_CALL (*target, boundingRect ()).WillOnce (Return (Rect (-5 , 5 , 5 , -5 )));
126+ ASSERT_TRUE (thread.runPredicate ());
127+ }
128+
129+ // ""
130+ {
131+ ScriptBuilder builder (m_extension.get (), m_engine, target, false );
132+ builder.addBlock (" event_whentouchingobject" );
133+ builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " " );
134+ auto block = builder.currentBlock ();
135+
136+ Compiler compiler (&m_engineMock, target.get ());
137+ auto code = compiler.compile (block, true );
138+ Script script (target.get (), block, &m_engineMock);
139+ script.setHatPredicateCode (code);
140+ Thread thread (target.get (), &m_engineMock, &script);
141+
142+ EXPECT_CALL (m_engineMock, findTarget (" " )).WillOnce (Return (-1 ));
143+ EXPECT_CALL (m_engineMock, targetAt (-1 )).WillOnce (Return (nullptr ));
144+ ASSERT_FALSE (thread.runPredicate ());
145+ }
146+ }
147+
52148TEST_F (EventBlocksTest, WhenFlagClicked)
53149{
54150 auto target = std::make_shared<Sprite>();
0 commit comments