|
7 | 7 | #include <scratchcpp/list.h>
|
8 | 8 | #include <scratchcpp/keyevent.h>
|
9 | 9 | #include <scratchcpp/monitor.h>
|
| 10 | +#include <scratchcpp/field.h> |
10 | 11 | #include <scratch/sound_p.h>
|
11 | 12 | #include <timermock.h>
|
12 | 13 | #include <clockmock.h>
|
|
19 | 20 | #include "engine/internal/engine.h"
|
20 | 21 | #include "engine/internal/clock.h"
|
21 | 22 |
|
| 23 | +// TODO: Remove this |
| 24 | +#include "blocks/variableblocks.h" |
| 25 | +#include "blocks/listblocks.h" |
| 26 | + |
22 | 27 | using namespace libscratchcpp;
|
23 | 28 |
|
24 | 29 | using ::testing::Return;
|
@@ -1141,6 +1146,104 @@ TEST(EngineTest, Monitors)
|
1141 | 1146 | ASSERT_EQ(engine.monitors(), std::vector<std::shared_ptr<Monitor>>({ m1, m2, m3 }));
|
1142 | 1147 | }
|
1143 | 1148 |
|
| 1149 | +TEST(EngineTest, CreateMissingMonitors) |
| 1150 | +{ |
| 1151 | + auto var1 = std::make_shared<Variable>("a", "var1"); |
| 1152 | + auto var2 = std::make_shared<Variable>("b", "var2"); |
| 1153 | + auto var3 = std::make_shared<Variable>("c", "var3"); |
| 1154 | + auto var4 = std::make_shared<Variable>("d", "var4"); |
| 1155 | + auto var5 = std::make_shared<Variable>("e", "var5"); |
| 1156 | + auto list1 = std::make_shared<List>("f", "list1"); |
| 1157 | + auto list2 = std::make_shared<List>("g", "list2"); |
| 1158 | + auto target1 = std::make_shared<Stage>(); |
| 1159 | + auto target2 = std::make_shared<Sprite>(); |
| 1160 | + target1->addVariable(var1); |
| 1161 | + target1->addVariable(var2); |
| 1162 | + target1->addList(list1); |
| 1163 | + target2->addVariable(var3); |
| 1164 | + target2->addVariable(var4); |
| 1165 | + target2->addVariable(var5); |
| 1166 | + target2->addList(list2); |
| 1167 | + |
| 1168 | + auto m1 = std::make_shared<Monitor>(var1->id(), "data_variable"); |
| 1169 | + auto m2 = std::make_shared<Monitor>(var3->id(), "data_variable"); |
| 1170 | + auto m3 = std::make_shared<Monitor>(list2->id(), "data_listcontents"); |
| 1171 | + |
| 1172 | + auto checkVariableMonitor = [](std::shared_ptr<Monitor> monitor, std::shared_ptr<Variable> var) { |
| 1173 | + auto block = monitor->block(); |
| 1174 | + ASSERT_EQ(monitor->id(), var->id()); |
| 1175 | + ASSERT_EQ(monitor->opcode(), "data_variable"); |
| 1176 | + ASSERT_EQ(monitor->mode(), Monitor::Mode::Default); |
| 1177 | + ASSERT_FALSE(monitor->visible()); |
| 1178 | + ASSERT_EQ(block->fields().size(), 1); |
| 1179 | + |
| 1180 | + auto field = block->fieldAt(0); |
| 1181 | + ASSERT_EQ(field->name(), "VARIABLE"); |
| 1182 | + ASSERT_EQ(field->fieldId(), VariableBlocks::VARIABLE); |
| 1183 | + ASSERT_EQ(field->value(), var->name()); |
| 1184 | + ASSERT_EQ(field->valuePtr(), var); |
| 1185 | + |
| 1186 | + if (var->target()->isStage()) |
| 1187 | + ASSERT_EQ(monitor->sprite(), nullptr); |
| 1188 | + else |
| 1189 | + ASSERT_EQ(monitor->sprite(), dynamic_cast<Sprite *>(var->target())); |
| 1190 | + }; |
| 1191 | + |
| 1192 | + auto checkListMonitor = [](std::shared_ptr<Monitor> monitor, std::shared_ptr<List> list) { |
| 1193 | + auto block = monitor->block(); |
| 1194 | + ASSERT_EQ(monitor->id(), list->id()); |
| 1195 | + ASSERT_EQ(monitor->opcode(), "data_listcontents"); |
| 1196 | + ASSERT_EQ(monitor->mode(), Monitor::Mode::Default); |
| 1197 | + ASSERT_FALSE(monitor->visible()); |
| 1198 | + ASSERT_EQ(block->fields().size(), 1); |
| 1199 | + |
| 1200 | + auto field = block->fieldAt(0); |
| 1201 | + ASSERT_EQ(field->name(), "LIST"); |
| 1202 | + ASSERT_EQ(field->fieldId(), ListBlocks::LIST); |
| 1203 | + ASSERT_EQ(field->value(), list->name()); |
| 1204 | + ASSERT_EQ(field->valuePtr(), list); |
| 1205 | + |
| 1206 | + if (list->target()->isStage()) |
| 1207 | + ASSERT_EQ(monitor->sprite(), nullptr); |
| 1208 | + else |
| 1209 | + ASSERT_EQ(monitor->sprite(), dynamic_cast<Sprite *>(list->target())); |
| 1210 | + }; |
| 1211 | + |
| 1212 | + // Set monitors after setting targets |
| 1213 | + { |
| 1214 | + Engine engine; |
| 1215 | + engine.setTargets({ target1, target2 }); |
| 1216 | + engine.setMonitors({ m1, m2, m3 }); |
| 1217 | + |
| 1218 | + const auto &monitors = engine.monitors(); |
| 1219 | + ASSERT_EQ(monitors.size(), 7); |
| 1220 | + ASSERT_EQ(monitors[0], m1); |
| 1221 | + ASSERT_EQ(monitors[1], m2); |
| 1222 | + ASSERT_EQ(monitors[2], m3); |
| 1223 | + checkVariableMonitor(monitors[3], var2); |
| 1224 | + checkListMonitor(monitors[4], list1); |
| 1225 | + checkVariableMonitor(monitors[5], var4); |
| 1226 | + checkVariableMonitor(monitors[6], var5); |
| 1227 | + } |
| 1228 | + |
| 1229 | + // Set monitors before setting targets |
| 1230 | + { |
| 1231 | + Engine engine; |
| 1232 | + engine.setMonitors({ m1, m2, m3 }); |
| 1233 | + engine.setTargets({ target1, target2 }); |
| 1234 | + |
| 1235 | + const auto &monitors = engine.monitors(); |
| 1236 | + ASSERT_EQ(monitors.size(), 7); |
| 1237 | + ASSERT_EQ(monitors[0], m1); |
| 1238 | + ASSERT_EQ(monitors[1], m2); |
| 1239 | + ASSERT_EQ(monitors[2], m3); |
| 1240 | + checkVariableMonitor(monitors[3], var2); |
| 1241 | + checkListMonitor(monitors[4], list1); |
| 1242 | + checkVariableMonitor(monitors[5], var4); |
| 1243 | + checkVariableMonitor(monitors[6], var5); |
| 1244 | + } |
| 1245 | +} |
| 1246 | + |
1144 | 1247 | TEST(EngineTest, Clones)
|
1145 | 1248 | {
|
1146 | 1249 | Project p("clones.sb3");
|
|
0 commit comments