@@ -47,6 +47,12 @@ class RedrawMock
4747 MOCK_METHOD (void , redraw, ());
4848};
4949
50+ class ThreadAboutToStopMock
51+ {
52+ public:
53+ MOCK_METHOD (void , threadRemoved, (VirtualMachine *));
54+ };
55+
5056class AddRemoveMonitorMock
5157{
5258 public:
@@ -109,6 +115,44 @@ TEST(EngineTest, Clear)
109115 ASSERT_TRUE (engine.monitors ().empty ());
110116}
111117
118+ TEST (EngineTest, ClearThreadAboutToStopSignal)
119+ {
120+ Project p (" 3_threads.sb3" );
121+ ASSERT_TRUE (p.load ());
122+ auto engine = p.engine ();
123+
124+ engine->start ();
125+ engine->step ();
126+
127+ ThreadAboutToStopMock threadRemovedMock;
128+ EXPECT_CALL (threadRemovedMock, threadRemoved (_)).Times (3 ).WillRepeatedly (WithArgs<0 >(Invoke ([](VirtualMachine *vm) {
129+ ASSERT_TRUE (vm);
130+ ASSERT_FALSE (vm->atEnd ());
131+ })));
132+
133+ engine->threadAboutToStop ().connect (&ThreadAboutToStopMock::threadRemoved, &threadRemovedMock);
134+ engine->clear ();
135+ }
136+
137+ TEST (EngineTest, StopThreadAboutToStopSignal)
138+ {
139+ Project p (" 3_threads.sb3" );
140+ ASSERT_TRUE (p.load ());
141+ auto engine = p.engine ();
142+
143+ engine->start ();
144+ engine->step ();
145+
146+ ThreadAboutToStopMock threadRemovedMock;
147+ EXPECT_CALL (threadRemovedMock, threadRemoved (_)).Times (3 ).WillRepeatedly (WithArgs<0 >(Invoke ([](VirtualMachine *vm) {
148+ ASSERT_TRUE (vm);
149+ ASSERT_FALSE (vm->atEnd ());
150+ })));
151+
152+ engine->threadAboutToStop ().connect (&ThreadAboutToStopMock::threadRemoved, &threadRemovedMock);
153+ engine->stop ();
154+ }
155+
112156TEST (EngineTest, CompileAndExecuteMonitors)
113157{
114158 Engine engine;
@@ -1840,10 +1884,18 @@ TEST(EngineTest, BroadcastsProject)
18401884{
18411885 Project p (" broadcasts.sb3" );
18421886 ASSERT_TRUE (p.load ());
1843- p.run ();
18441887
18451888 auto engine = p.engine ();
1889+
1890+ ThreadAboutToStopMock threadRemovedMock;
1891+ EXPECT_CALL (threadRemovedMock, threadRemoved (_)).Times (21 ).WillRepeatedly (WithArgs<0 >(Invoke ([](VirtualMachine *vm) {
1892+ ASSERT_TRUE (vm);
1893+ ASSERT_FALSE (vm->atEnd ());
1894+ })));
1895+
1896+ engine->threadAboutToStop ().connect (&ThreadAboutToStopMock::threadRemoved, &threadRemovedMock);
18461897 engine->setFps (1000 );
1898+ p.run ();
18471899
18481900 Stage *stage = engine->stage ();
18491901 ASSERT_TRUE (stage);
@@ -1880,10 +1932,18 @@ TEST(EngineTest, StopAllBypass)
18801932{
18811933 Project p (" stop_all_bypass.sb3" );
18821934 ASSERT_TRUE (p.load ());
1883- p.run ();
18841935
18851936 auto engine = p.engine ();
18861937
1938+ ThreadAboutToStopMock threadRemovedMock;
1939+ EXPECT_CALL (threadRemovedMock, threadRemoved (_)).Times (2 ).WillRepeatedly (WithArgs<0 >(Invoke ([](VirtualMachine *vm) {
1940+ ASSERT_TRUE (vm);
1941+ ASSERT_FALSE (vm->atEnd ());
1942+ })));
1943+
1944+ engine->threadAboutToStop ().connect (&ThreadAboutToStopMock::threadRemoved, &threadRemovedMock);
1945+ p.run ();
1946+
18871947 Stage *stage = engine->stage ();
18881948 ASSERT_TRUE (stage);
18891949
@@ -1900,10 +1960,18 @@ TEST(EngineTest, StopOtherScriptsInSprite)
19001960{
19011961 Project p (" stop_other_scripts_in_sprite.sb3" );
19021962 ASSERT_TRUE (p.load ());
1903- p.run ();
19041963
19051964 auto engine = p.engine ();
19061965
1966+ ThreadAboutToStopMock threadRemovedMock;
1967+ EXPECT_CALL (threadRemovedMock, threadRemoved (_)).Times (4 ).WillRepeatedly (WithArgs<0 >(Invoke ([](VirtualMachine *vm) {
1968+ ASSERT_TRUE (vm);
1969+ ASSERT_FALSE (vm->atEnd ());
1970+ })));
1971+
1972+ engine->threadAboutToStop ().connect (&ThreadAboutToStopMock::threadRemoved, &threadRemovedMock);
1973+ p.run ();
1974+
19071975 Stage *stage = engine->stage ();
19081976 ASSERT_TRUE (stage);
19091977
0 commit comments