@@ -167,6 +167,35 @@ class ComponentMock : public Component
167167 void transformChanged () override { transformChangedCalled = true ; }
168168};
169169
170+ class RecordingComponentListener : public ComponentListener
171+ {
172+ public:
173+ void componentMoved (Component& component) override
174+ {
175+ ++movedCount;
176+ lastMovedComponent = &component;
177+ }
178+
179+ void componentResized (Component& component) override
180+ {
181+ ++resizedCount;
182+ lastResizedComponent = &component;
183+ }
184+
185+ void componentBeingDeleted (Component& component) override
186+ {
187+ ++deletedCount;
188+ lastDeletedComponent = &component;
189+ }
190+
191+ int movedCount = 0 ;
192+ int resizedCount = 0 ;
193+ int deletedCount = 0 ;
194+ Component* lastMovedComponent = nullptr ;
195+ Component* lastResizedComponent = nullptr ;
196+ Component* lastDeletedComponent = nullptr ;
197+ };
198+
170199} // namespace
171200
172201// =============================================================================
@@ -1164,6 +1193,103 @@ TEST_F (ComponentMockTest, MouseListenerMethods)
11641193 mockComponent->removeMouseListener (listener.get ());
11651194}
11661195
1196+ TEST_F (ComponentMockTest, ComponentListenerReceivesMovedCallback)
1197+ {
1198+ RecordingComponentListener listener;
1199+ mockComponent->addComponentListener (&listener);
1200+
1201+ mockComponent->setPosition ({ 10 .0f , 20 .0f });
1202+
1203+ EXPECT_EQ (1 , listener.movedCount );
1204+ EXPECT_EQ (static_cast <Component*> (mockComponent.get ()), listener.lastMovedComponent );
1205+ EXPECT_EQ (0 , listener.resizedCount );
1206+ }
1207+
1208+ TEST_F (ComponentMockTest, ComponentListenerReceivesResizedCallback)
1209+ {
1210+ RecordingComponentListener listener;
1211+ mockComponent->addComponentListener (&listener);
1212+
1213+ mockComponent->setSize ({ 100 .0f , 80 .0f });
1214+
1215+ EXPECT_EQ (1 , listener.resizedCount );
1216+ EXPECT_EQ (static_cast <Component*> (mockComponent.get ()), listener.lastResizedComponent );
1217+ EXPECT_EQ (0 , listener.movedCount );
1218+ }
1219+
1220+ TEST_F (ComponentMockTest, ComponentListenerReceivesMovedAndResizedFromSetBounds)
1221+ {
1222+ RecordingComponentListener listener;
1223+ mockComponent->addComponentListener (&listener);
1224+
1225+ mockComponent->setBounds (5 .0f , 10 .0f , 150 .0f , 120 .0f );
1226+
1227+ EXPECT_EQ (1 , listener.movedCount );
1228+ EXPECT_EQ (1 , listener.resizedCount );
1229+ EXPECT_EQ (static_cast <Component*> (mockComponent.get ()), listener.lastMovedComponent );
1230+ EXPECT_EQ (static_cast <Component*> (mockComponent.get ()), listener.lastResizedComponent );
1231+ }
1232+
1233+ TEST_F (ComponentMockTest, RemovingComponentListenerStopsCallbacks)
1234+ {
1235+ RecordingComponentListener listener;
1236+ mockComponent->addComponentListener (&listener);
1237+ mockComponent->removeComponentListener (&listener);
1238+
1239+ mockComponent->setPosition ({ 10 .0f , 20 .0f });
1240+ mockComponent->setSize ({ 100 .0f , 80 .0f });
1241+
1242+ EXPECT_EQ (0 , listener.movedCount );
1243+ EXPECT_EQ (0 , listener.resizedCount );
1244+ }
1245+
1246+ TEST_F (ComponentMockTest, ComponentListenerIsOnlyAddedOnce)
1247+ {
1248+ RecordingComponentListener listener;
1249+ mockComponent->addComponentListener (&listener);
1250+ mockComponent->addComponentListener (&listener);
1251+
1252+ mockComponent->setPosition ({ 10 .0f , 20 .0f });
1253+
1254+ EXPECT_EQ (1 , listener.movedCount );
1255+ }
1256+
1257+ TEST_F (ComponentMockTest, DestroyedComponentListenerIsSkipped)
1258+ {
1259+ auto listener = std::make_unique<RecordingComponentListener>();
1260+ mockComponent->addComponentListener (listener.get ());
1261+
1262+ listener.reset ();
1263+
1264+ const Point<float > newPosition (10 .0f , 20 .0f );
1265+ EXPECT_NO_FATAL_FAILURE (mockComponent->setPosition (newPosition));
1266+ }
1267+
1268+ TEST_F (ComponentMockTest, ComponentListenerReceivesBeingDeletedCallback)
1269+ {
1270+ RecordingComponentListener listener;
1271+ auto component = std::make_unique<ComponentMock> (" delete-notified" );
1272+ component->addComponentListener (&listener);
1273+
1274+ auto * componentAddress = static_cast <Component*> (component.get ());
1275+ component.reset ();
1276+
1277+ EXPECT_EQ (1 , listener.deletedCount );
1278+ EXPECT_EQ (componentAddress, listener.lastDeletedComponent );
1279+ }
1280+
1281+ TEST_F (ComponentMockTest, RemovedComponentListenerDoesNotReceiveBeingDeletedCallback)
1282+ {
1283+ RecordingComponentListener listener;
1284+ auto component = std::make_unique<ComponentMock> (" delete-notified" );
1285+ component->addComponentListener (&listener);
1286+ component->removeComponentListener (&listener);
1287+
1288+ component.reset ();
1289+
1290+ EXPECT_EQ (0 , listener.deletedCount );
1291+ }
1292+
11671293TEST_F (ComponentMockTest, StyleMethods)
11681294{
11691295 // Test default style
0 commit comments