|
4 | 4 | #include <scratchcpp/sprite.h> |
5 | 5 | #include <scratchcpp/broadcast.h> |
6 | 6 | #include <scratchcpp/block.h> |
| 7 | +#include <scratchcpp/script.h> |
| 8 | +#include <scratchcpp/thread.h> |
| 9 | +#include <scratchcpp/dev/executablecode.h> |
7 | 10 | #include <enginemock.h> |
8 | 11 |
|
9 | 12 | #include "../common.h" |
|
12 | 15 | using namespace libscratchcpp; |
13 | 16 | using namespace libscratchcpp::test; |
14 | 17 |
|
| 18 | +using ::testing::Return; |
| 19 | + |
15 | 20 | class EventBlocksTest : public testing::Test |
16 | 21 | { |
17 | 22 | public: |
@@ -130,3 +135,50 @@ TEST_F(EventBlocksTest, WhenGreaterThan) |
130 | 135 | EXPECT_CALL(m_engineMock, addWhenGreaterThanScript(block)); |
131 | 136 | compiler.compile(block); |
132 | 137 | } |
| 138 | + |
| 139 | +TEST_F(EventBlocksTest, Broadcast) |
| 140 | +{ |
| 141 | + auto broadcast = std::make_shared<Broadcast>("", "test"); |
| 142 | + m_engine->setBroadcasts({ broadcast }); |
| 143 | + |
| 144 | + auto target = std::make_shared<Sprite>(); |
| 145 | + ScriptBuilder builder(m_extension.get(), m_engine, target); |
| 146 | + |
| 147 | + builder.addBlock("event_broadcast"); |
| 148 | + builder.addEntityInput("BROADCAST_INPUT", "test", InputValue::Type::Broadcast, broadcast); |
| 149 | + auto block1 = builder.currentBlock(); |
| 150 | + |
| 151 | + builder.addBlock("event_broadcast"); |
| 152 | + builder.addNullObscuredInput("BROADCAST_INPUT"); |
| 153 | + auto block2 = builder.currentBlock(); |
| 154 | + |
| 155 | + block1->setNext(nullptr); |
| 156 | + block2->setParent(nullptr); |
| 157 | + |
| 158 | + { |
| 159 | + Compiler compiler(&m_engineMock, target.get()); |
| 160 | + auto code = compiler.compile(block1); |
| 161 | + Script script(target.get(), block1, &m_engineMock); |
| 162 | + script.setCode(code); |
| 163 | + Thread thread(target.get(), &m_engineMock, &script); |
| 164 | + |
| 165 | + EXPECT_CALL(m_engineMock, findBroadcasts("test")).WillOnce(Return(std::vector<int>({ 1, 4 }))); |
| 166 | + EXPECT_CALL(m_engineMock, broadcast(1, &thread, false)); |
| 167 | + EXPECT_CALL(m_engineMock, broadcast(4, &thread, false)); |
| 168 | + thread.run(); |
| 169 | + } |
| 170 | + |
| 171 | + { |
| 172 | + Compiler compiler(&m_engineMock, target.get()); |
| 173 | + auto code = compiler.compile(block2); |
| 174 | + Script script(target.get(), block2, &m_engineMock); |
| 175 | + script.setCode(code); |
| 176 | + Thread thread(target.get(), &m_engineMock, &script); |
| 177 | + |
| 178 | + EXPECT_CALL(m_engineMock, findBroadcasts("0")).WillOnce(Return(std::vector<int>({ 5, 7, 8 }))); |
| 179 | + EXPECT_CALL(m_engineMock, broadcast(5, &thread, false)); |
| 180 | + EXPECT_CALL(m_engineMock, broadcast(7, &thread, false)); |
| 181 | + EXPECT_CALL(m_engineMock, broadcast(8, &thread, false)); |
| 182 | + thread.run(); |
| 183 | + } |
| 184 | +} |
0 commit comments