8
8
#include < scratchcpp/thread.h>
9
9
#include < scratchcpp/executablecode.h>
10
10
#include < enginemock.h>
11
+ #include < targetmock.h>
11
12
12
13
#include " ../common.h"
13
14
#include " blocks/eventblocks.h"
@@ -33,12 +34,10 @@ class EventBlocksTest : public testing::Test
33
34
EngineMock m_engineMock;
34
35
};
35
36
36
- // TODO: Add test for when touching object hat predicate
37
-
38
37
TEST_F (EventBlocksTest, WhenTouchingObject)
39
38
{
40
39
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 );
42
41
43
42
builder.addBlock (" event_whentouchingobject" );
44
43
builder.addDropdownInput (" TOUCHINGOBJECTMENU" , " Sprite1" );
@@ -49,6 +48,103 @@ TEST_F(EventBlocksTest, WhenTouchingObject)
49
48
compiler.compile (block);
50
49
}
51
50
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
+
52
148
TEST_F (EventBlocksTest, WhenFlagClicked)
53
149
{
54
150
auto target = std::make_shared<Sprite>();
0 commit comments