Skip to content

Add project running API #143

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/ProjectPlayer.qml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ ProjectScene {
readonly property string fileName: loader.fileName
property int stageWidth: 480
property int stageHeight: 360
readonly property bool running: loader.running
property alias fps: loader.fps
property alias turboMode: loader.turboMode
property alias cloneLimit: loader.cloneLimit
Expand Down
13 changes: 12 additions & 1 deletion src/projectloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ bool ProjectLoader::loadStatus() const
return m_loadStatus;
}

bool ProjectLoader::running() const
{
return m_running;
}

IEngine *ProjectLoader::engine() const
{
if (m_loadThread.isRunning())
Expand Down Expand Up @@ -216,9 +221,15 @@ void ProjectLoader::timerEvent(QTimerEvent *event)
if (m_loadThread.isRunning())
return;

if (m_engine)
if (m_engine) {
m_engine->step();

if (m_running != m_engine->isRunning()) {
m_running = !m_running;
emit runningChanged();
}
}

event->accept();
}

Expand Down
5 changes: 5 additions & 0 deletions src/projectloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class ProjectLoader : public QObject
QML_ELEMENT
Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)
Q_PROPERTY(bool loadStatus READ loadStatus NOTIFY loadStatusChanged)
Q_PROPERTY(bool running READ running NOTIFY runningChanged)
Q_PROPERTY(libscratchcpp::IEngine *engine READ engine NOTIFY engineChanged)
Q_PROPERTY(StageModel *stage READ stage NOTIFY stageChanged)
Q_PROPERTY(QQmlListProperty<SpriteModel> sprites READ sprites NOTIFY spritesChanged)
Expand All @@ -48,6 +49,8 @@ class ProjectLoader : public QObject

bool loadStatus() const;

bool running() const;

libscratchcpp::IEngine *engine() const;
void setEngine(libscratchcpp::IEngine *engine);

Expand Down Expand Up @@ -96,6 +99,7 @@ class ProjectLoader : public QObject
void fileNameChanged();
void loadStatusChanged();
void loadingFinished();
void runningChanged();
void engineChanged();
void stageChanged();
void spritesChanged();
Expand Down Expand Up @@ -135,6 +139,7 @@ class ProjectLoader : public QObject
QString m_fileName;
QFuture<void> m_loadThread;
libscratchcpp::Project m_project;
bool m_running = false;
libscratchcpp::IEngine *m_engine = nullptr;
QMutex m_engineMutex;
bool m_loadStatus = false;
Expand Down
9 changes: 3 additions & 6 deletions test/mocks/enginemock.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ class EngineMock : public IEngine
MOCK_METHOD(void, start, (), (override));
MOCK_METHOD(void, stop, (), (override));
MOCK_METHOD(VirtualMachine *, startScript, (std::shared_ptr<Block>, Target *), (override));
MOCK_METHOD(void, broadcast, (int), (override));
MOCK_METHOD(void, broadcastByPtr, (Broadcast *), (override));
MOCK_METHOD(void, startBackdropScripts, (Broadcast *), (override));
MOCK_METHOD(void, broadcast, (int, VirtualMachine *), (override));
MOCK_METHOD(void, broadcastByPtr, (Broadcast *, VirtualMachine *), (override));
MOCK_METHOD(void, startBackdropScripts, (Broadcast *, VirtualMachine *), (override));
MOCK_METHOD(void, stopScript, (VirtualMachine *), (override));
MOCK_METHOD(void, stopTarget, (Target *, VirtualMachine *), (override));
MOCK_METHOD(void, initClone, (std::shared_ptr<Sprite>), (override));
Expand Down Expand Up @@ -82,9 +82,6 @@ class EngineMock : public IEngine
MOCK_METHOD(bool, spriteFencingEnabled, (), (const, override));
MOCK_METHOD(void, setSpriteFencingEnabled, (bool), (override));

MOCK_METHOD(bool, broadcastRunning, (unsigned int), (override));
MOCK_METHOD(bool, broadcastByPtrRunning, (Broadcast *), (override));

MOCK_METHOD(void, requestRedraw, (), (override));

MOCK_METHOD(ITimer *, timer, (), (const, override));
Expand Down
23 changes: 23 additions & 0 deletions test/projectloader/projectloader_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,35 @@ TEST_F(ProjectLoaderTest, StartStop)
TEST_F(ProjectLoaderTest, TimerEvent)
{
ProjectLoader loader;
ASSERT_FALSE(loader.running());
EngineMock engine;
loader.setEngine(&engine);
QTimerEvent event(0);

QSignalSpy runningSpy(&loader, &ProjectLoader::runningChanged);
EXPECT_CALL(engine, step());
EXPECT_CALL(engine, isRunning()).WillOnce(Return(false));
QCoreApplication::sendEvent(&loader, &event);
ASSERT_FALSE(loader.running());
ASSERT_TRUE(runningSpy.empty());

EXPECT_CALL(engine, step());
EXPECT_CALL(engine, isRunning()).WillOnce(Return(true));
QCoreApplication::sendEvent(&loader, &event);
ASSERT_TRUE(loader.running());
ASSERT_EQ(runningSpy.size(), 1);

EXPECT_CALL(engine, step());
EXPECT_CALL(engine, isRunning()).WillOnce(Return(true));
QCoreApplication::sendEvent(&loader, &event);
ASSERT_TRUE(loader.running());
ASSERT_EQ(runningSpy.size(), 1);

EXPECT_CALL(engine, step());
EXPECT_CALL(engine, isRunning()).WillOnce(Return(false));
QCoreApplication::sendEvent(&loader, &event);
ASSERT_FALSE(loader.running());
ASSERT_EQ(runningSpy.size(), 2);
}

TEST_F(ProjectLoaderTest, QuestionAsked)
Expand Down
Loading