Skip to content

Commit 39d12ef

Browse files
committed
Add question API to ProjectLoader
1 parent 4cbea03 commit 39d12ef

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

src/projectloader.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ void ProjectLoader::stop()
166166
}
167167
}
168168

169+
void ProjectLoader::answerQuestion(const QString &answer)
170+
{
171+
if (m_engine) {
172+
auto f = m_engine->questionAnswered();
173+
174+
if (f)
175+
f(answer.toStdString());
176+
}
177+
}
178+
169179
void ProjectLoader::timerEvent(QTimerEvent *event)
170180
{
171181
if (m_loadThread.isRunning())
@@ -220,6 +230,8 @@ void ProjectLoader::load()
220230
auto removeMonitorHandler = std::bind(&ProjectLoader::removeMonitor, this, std::placeholders::_1, std::placeholders::_2);
221231
m_engine->setRemoveMonitorHandler(std::function<void(Monitor *, IMonitorHandler *)>(removeMonitorHandler));
222232

233+
m_engine->setQuestionAsked([this](const std::string &question) { emit questionAsked(QString::fromStdString(question)); });
234+
223235
// Load targets
224236
const auto &targets = m_engine->targets();
225237

src/projectloader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class ProjectLoader : public QObject
6464
Q_INVOKABLE void start();
6565
Q_INVOKABLE void stop();
6666

67+
Q_INVOKABLE void answerQuestion(const QString &answer);
68+
6769
double fps() const;
6870
void setFps(double newFps);
6971

@@ -107,6 +109,7 @@ class ProjectLoader : public QObject
107109
void cloneDeleted(SpriteModel *model);
108110
void monitorAdded(MonitorModel *model);
109111
void monitorRemoved(MonitorModel *model);
112+
void questionAsked(QString question);
110113

111114
protected:
112115
void timerEvent(QTimerEvent *event) override;

test/projectloader/projectloader_test.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ using namespace scratchcpprender;
1414
using namespace libscratchcpp;
1515

1616
using ::testing::Return;
17+
using ::testing::ReturnRef;
1718

1819
class ProjectLoaderTest : public testing::Test
1920
{
@@ -59,6 +60,11 @@ class ProjectLoaderTest : public testing::Test
5960
}
6061
};
6162

63+
struct AnswerQuestionMock
64+
{
65+
MOCK_METHOD(void, answer, (const std::string &), ());
66+
};
67+
6268
TEST_F(ProjectLoaderTest, Constructors)
6369
{
6470
ProjectLoader loader1;
@@ -162,6 +168,38 @@ TEST_F(ProjectLoaderTest, TimerEvent)
162168
QCoreApplication::sendEvent(&loader, &event);
163169
}
164170

171+
TEST_F(ProjectLoaderTest, QuestionAsked)
172+
{
173+
ProjectLoader loader;
174+
QSignalSpy spy(&loader, &ProjectLoader::questionAsked);
175+
176+
load(&loader, "load_test.sb3");
177+
178+
auto engine = loader.engine();
179+
auto f = engine->questionAsked();
180+
ASSERT_TRUE(f);
181+
ASSERT_TRUE(spy.isEmpty());
182+
f("test");
183+
ASSERT_EQ(spy.count(), 1);
184+
185+
auto args = spy.takeFirst();
186+
ASSERT_EQ(args.size(), 1);
187+
ASSERT_EQ(args.first().toString(), "test");
188+
}
189+
190+
TEST_F(ProjectLoaderTest, AnswerQuestion)
191+
{
192+
ProjectLoader loader;
193+
EngineMock engine;
194+
loader.setEngine(&engine);
195+
196+
AnswerQuestionMock mock;
197+
std::function<void(const std::string &)> f = std::bind(&AnswerQuestionMock::answer, &mock, std::placeholders::_1);
198+
EXPECT_CALL(engine, questionAnswered()).WillOnce(ReturnRef(f));
199+
EXPECT_CALL(mock, answer("hello"));
200+
loader.answerQuestion("hello");
201+
}
202+
165203
TEST_F(ProjectLoaderTest, Fps)
166204
{
167205
ProjectLoader loader;

0 commit comments

Comments
 (0)