Skip to content

Commit 71ff44a

Browse files
committed
Add question callbacks to IEngine
1 parent d4c0a98 commit 71ff44a

File tree

5 files changed

+78
-0
lines changed

5 files changed

+78
-0
lines changed

include/scratchcpp/iengine.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,18 @@ class LIBSCRATCHCPP_EXPORT IEngine
338338
/*! Sets the function which is called when a monitor is removed. */
339339
virtual void setRemoveMonitorHandler(const std::function<void(Monitor *, IMonitorHandler *)> &handler) = 0;
340340

341+
/*! Returns the function which is called when a question is asked, for example using the 'ask and wait' block. */
342+
virtual const std::function<void(const std::string &)> &questionAsked() const = 0;
343+
344+
/*! Sets the function which is called when a question is asked, for example using the 'ask and wait' block. */
345+
virtual void setQuestionAsked(const std::function<void(const std::string &)> &f) = 0;
346+
347+
/*! Returns the function which should be called when a question is answered. */
348+
virtual const std::function<void(const std::string &)> &questionAnswered() const = 0;
349+
350+
/*! Sets the function which should be called when a question is answered. */
351+
virtual void setQuestionAnswered(const std::function<void(const std::string &)> &f) = 0;
352+
341353
/*! Returns the list of extension names. */
342354
virtual const std::vector<std::string> &extensions() const = 0;
343355

src/engine/internal/engine.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,26 @@ void Engine::setRemoveMonitorHandler(const std::function<void(Monitor *, IMonito
11701170
m_removeMonitorHandler = handler;
11711171
}
11721172

1173+
const std::function<void(const std::string &)> &Engine::questionAsked() const
1174+
{
1175+
return m_questionAsked;
1176+
}
1177+
1178+
void Engine::setQuestionAsked(const std::function<void(const std::string &)> &f)
1179+
{
1180+
m_questionAsked = f;
1181+
}
1182+
1183+
const std::function<void(const std::string &)> &Engine::questionAnswered() const
1184+
{
1185+
return m_questionAnswered;
1186+
}
1187+
1188+
void Engine::setQuestionAnswered(const std::function<void(const std::string &)> &f)
1189+
{
1190+
m_questionAnswered = f;
1191+
}
1192+
11731193
const std::vector<std::string> &Engine::extensions() const
11741194
{
11751195
return m_extensions;

src/engine/internal/engine.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ class Engine : public IEngine
143143
void setAddMonitorHandler(const std::function<void(Monitor *)> &handler) override;
144144
void setRemoveMonitorHandler(const std::function<void(Monitor *, IMonitorHandler *)> &handler) override;
145145

146+
const std::function<void(const std::string &)> &questionAsked() const override;
147+
void setQuestionAsked(const std::function<void(const std::string &)> &f) override;
148+
149+
const std::function<void(const std::string &)> &questionAnswered() const override;
150+
void setQuestionAnswered(const std::function<void(const std::string &)> &f) override;
151+
146152
const std::vector<std::string> &extensions() const override;
147153
void setExtensions(const std::vector<std::string> &newExtensions) override;
148154

@@ -255,6 +261,8 @@ class Engine : public IEngine
255261

256262
std::function<void(Monitor *)> m_addMonitorHandler = nullptr;
257263
std::function<void(Monitor *, IMonitorHandler *)> m_removeMonitorHandler = nullptr;
264+
std::function<void(const std::string &)> m_questionAsked = nullptr;
265+
std::function<void(const std::string &)> m_questionAnswered = nullptr;
258266
};
259267

260268
} // namespace libscratchcpp

test/engine/engine_test.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ class AddRemoveMonitorMock
5151
MOCK_METHOD(void, monitorRemoved, (Monitor *, IMonitorHandler *));
5252
};
5353

54+
template<typename T, typename... U>
55+
size_t getAddress(std::function<T(U...)> f)
56+
{
57+
typedef T(fnType)(U...);
58+
fnType **fnPointer = f.template target<fnType *>();
59+
return (size_t)*fnPointer;
60+
}
61+
5462
TEST(EngineTest, Clock)
5563
{
5664
Engine engine;
@@ -1542,6 +1550,30 @@ TEST(EngineTest, CreateMissingMonitors)
15421550
}
15431551
}
15441552

1553+
void questionFunction(const std::string &)
1554+
{
1555+
}
1556+
1557+
TEST(EngineTest, QuestionAsked)
1558+
{
1559+
Engine engine;
1560+
ASSERT_EQ(engine.questionAsked(), nullptr);
1561+
1562+
static const std::function<void(const std::string &)> f = &questionFunction;
1563+
engine.setQuestionAsked(&questionFunction);
1564+
ASSERT_EQ(getAddress(engine.questionAsked()), getAddress(f));
1565+
}
1566+
1567+
TEST(EngineTest, QuestionAnswered)
1568+
{
1569+
Engine engine;
1570+
ASSERT_EQ(engine.questionAnswered(), nullptr);
1571+
1572+
static const std::function<void(const std::string &)> f = &questionFunction;
1573+
engine.setQuestionAnswered(f);
1574+
ASSERT_EQ(getAddress(engine.questionAnswered()), getAddress(f));
1575+
}
1576+
15451577
TEST(EngineTest, Clones)
15461578
{
15471579
Project p("clones.sb3");

test/mocks/enginemock.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ class EngineMock : public IEngine
124124
MOCK_METHOD(void, setAddMonitorHandler, (const std::function<void(Monitor *)> &), (override));
125125
MOCK_METHOD(void, setRemoveMonitorHandler, (const std::function<void(Monitor *, IMonitorHandler *)> &), (override));
126126

127+
MOCK_METHOD(const std::function<void(const std::string &)> &, questionAsked, (), (const, override));
128+
MOCK_METHOD(void, setQuestionAsked, (const std::function<void(const std::string &)> &), (override));
129+
130+
MOCK_METHOD(const std::function<void(const std::string &)> &, questionAnswered, (), (const, override));
131+
MOCK_METHOD(void, setQuestionAnswered, (const std::function<void(const std::string &)> &), (override));
132+
127133
MOCK_METHOD(std::vector<std::string> &, extensions, (), (const, override));
128134
MOCK_METHOD(void, setExtensions, (const std::vector<std::string> &), (override));
129135

0 commit comments

Comments
 (0)