xref: /aoo4110/main/slideshow/test/slidetest.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <testshl/simpleheader.hxx>
25 #include <cppuhelper/compbase1.hxx>
26 #include <comphelper/broadcasthelper.hxx>
27 
28 #include <basegfx/matrix/b2dhommatrix.hxx>
29 #include <basegfx/range/b2drectangle.hxx>
30 #include <cppcanvas/spritecanvas.hxx>
31 
32 #include "view.hxx"
33 #include "unoview.hxx"
34 #include "unoviewcontainer.hxx"
35 #include "shape.hxx"
36 #include "tests.hxx"
37 #include "../engine/slide/layermanager.hxx"
38 #include "../engine/slide/layer.hxx"
39 #include "com/sun/star/presentation/XSlideShowView.hpp"
40 
41 namespace target = slideshow::internal;
42 using namespace ::com::sun::star;
43 
44 namespace
45 {
46 
47 class LayerManagerTest : public CppUnit::TestFixture
48 {
49     target::UnoViewContainer      maViews;
50     target::LayerManagerSharedPtr mpLayerManager;
51     TestViewSharedPtr             mpTestView;
52     TestShapeSharedPtr            mpTestShape;
53 
54 public:
setUp()55     void setUp()
56     {
57         mpTestShape = createTestShape(
58             basegfx::B2DRange(0.0,0.0,10.0,10.0),
59             1.0);
60         mpTestView = createTestView();
61         maViews.addView( mpTestView );
62 
63         mpLayerManager.reset(
64             new target::LayerManager(
65                 maViews,
66                 basegfx::B2DRange(0.0,0.0,100.0,100.0),
67                 false ));
68     }
69 
tearDown()70     void tearDown()
71     {
72         mpLayerManager.reset();
73         maViews.dispose();
74     }
75 
testLayer()76     void testLayer()
77     {
78         target::LayerSharedPtr pBgLayer(
79             target::Layer::createBackgroundLayer( basegfx::B2DRange(0,0,100,100) ) );
80         pBgLayer->addView( mpTestView );
81 
82         target::LayerSharedPtr pFgLayer(
83             target::Layer::createLayer( basegfx::B2DRange(0,0,100,100) ) );
84         pFgLayer->addView( mpTestView );
85 
86         CPPUNIT_ASSERT_MESSAGE( "BG layer must confess that!",
87                                 pBgLayer->isBackgroundLayer() );
88         CPPUNIT_ASSERT_MESSAGE( "FG layer lies!",
89                                 !pFgLayer->isBackgroundLayer() );
90 
91         CPPUNIT_ASSERT_MESSAGE( "BG layer must not have pending updates!",
92                                 !pBgLayer->isUpdatePending() );
93         pBgLayer->addUpdateRange( basegfx::B2DRange(0,0,10,10) );
94         CPPUNIT_ASSERT_MESSAGE( "BG layer must have pending updates!",
95                                 pBgLayer->isUpdatePending() );
96 
97         TestShapeSharedPtr pTestShape = createTestShape(
98             basegfx::B2DRange(0.0,0.0,1000.0,1000.0),
99             1.0);
100         pBgLayer->updateBounds( pTestShape );
101         CPPUNIT_ASSERT_MESSAGE( "BG layer must not resize!",
102                                 !pBgLayer->commitBounds() );
103 
104         TestShapeSharedPtr pTestShape2 = createTestShape(
105             basegfx::B2DRange(0.0,0.0,1.0,1.0),
106             1.0);
107         pFgLayer->updateBounds( pTestShape2 );
108         CPPUNIT_ASSERT_MESSAGE( "FG layer must resize!",
109                                 pFgLayer->commitBounds() );
110     }
111 
testBasics()112     void testBasics()
113     {
114         mpLayerManager->activate( false );
115 
116         CPPUNIT_ASSERT_MESSAGE( "Un-added shape must have zero view layers",
117                                 mpTestShape->getViewLayers().empty() );
118         mpLayerManager->addShape(mpTestShape);
119         CPPUNIT_ASSERT_MESSAGE( "Adding a shape requires a LayerManager update",
120                                 mpLayerManager->isUpdatePending() );
121 
122         // update does the delayed viewAdded call to the shape
123         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager",
124                                 mpLayerManager->update() );
125         CPPUNIT_ASSERT_MESSAGE( "Added shape must have one view layer",
126                                 mpTestShape->getViewLayers().size() == 1 );
127         CPPUNIT_ASSERT_MESSAGE( "Shape must been rendered",
128                                 mpTestShape->getNumRenders() );
129         CPPUNIT_ASSERT_MESSAGE( "Shape must not been updated",
130                                 !mpTestShape->getNumUpdates() );
131 
132         // test second view, check whether shape gets additional view
133         TestViewSharedPtr pTestView( createTestView() );
134         CPPUNIT_ASSERT_MESSAGE( "Adding second View failed",
135                                 maViews.addView( pTestView ) );
136         CPPUNIT_ASSERT_MESSAGE( "View container must have two views",
137                                 maViews.end() - maViews.begin() == 2 );
138         mpLayerManager->viewAdded(pTestView);
139         CPPUNIT_ASSERT_MESSAGE( "Added shape must have two view layers",
140                                 mpTestShape->getViewLayers().size() == 2 );
141 
142         CPPUNIT_ASSERT_MESSAGE( "Removing second View failed",
143                                 maViews.removeView( pTestView ) );
144         mpLayerManager->viewRemoved(pTestView);
145         CPPUNIT_ASSERT_MESSAGE( "Added shape must have one view layer",
146                                 mpTestShape->getViewLayers().size() == 1 );
147 
148         mpLayerManager->deactivate();
149     }
150 
testShapeOrdering()151     void testShapeOrdering()
152     {
153         TestShapeSharedPtr pShape2( createTestShape(
154             basegfx::B2DRange(0.0,0.0,10.0,10.0),
155             2.0));
156         TestShapeSharedPtr pShape3( createTestShape(
157             basegfx::B2DRange(0.0,0.0,10.0,10.0),
158             3.0));
159         TestShapeSharedPtr pShape4( createTestShape(
160             basegfx::B2DRange(0.0,0.0,10.0,10.0),
161             4.0));
162 
163         mpLayerManager->addShape(mpTestShape);
164         mpLayerManager->addShape(pShape2);
165         mpLayerManager->addShape(pShape3);
166         mpLayerManager->addShape(pShape4);
167 
168         mpLayerManager->activate( false );
169 
170         // update does the delayed viewAdded call to the shape
171         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager",
172                                 mpLayerManager->update() );
173         CPPUNIT_ASSERT_MESSAGE( "View must have background layer only",
174                                 mpTestView->getViewLayers().empty() );
175 
176         // LayerManager must now generate one extra view layer
177         mpLayerManager->enterAnimationMode(pShape2);
178         CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager",
179                                 mpLayerManager->isUpdatePending() );
180         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager",
181                                 mpLayerManager->update() );
182         CPPUNIT_ASSERT_MESSAGE( "View must have one extra layer only",
183                                 mpTestView->getViewLayers().size() == 1 );
184         CPPUNIT_ASSERT_MESSAGE( "View layer must have 10x10 size",
185                                 mpTestView->getViewLayers().at(0)->getBounds() ==
186                                 basegfx::B2DRange(0.0,0.0,10.0,10.0) );
187 
188         // LayerManager must now remove the extra view layer
189         mpLayerManager->leaveAnimationMode(pShape2);
190         CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager",
191                                 mpLayerManager->isUpdatePending() );
192         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager #2",
193                                 mpLayerManager->update() );
194         CPPUNIT_ASSERT_MESSAGE( "Shape 1 must be on background layer",
195                                 mpTestShape->getViewLayers().at(0).first == mpTestView );
196         CPPUNIT_ASSERT_MESSAGE( "Shape 2 must be on background layer",
197                                 pShape2->getViewLayers().at(0).first == mpTestView );
198         CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have one layer",
199                                 pShape3->getViewLayers().size() == 1 );
200         CPPUNIT_ASSERT_MESSAGE( "Shape 3 must be on background layer",
201                                 pShape3->getViewLayers().at(0).first == mpTestView );
202         CPPUNIT_ASSERT_MESSAGE( "Shape 4 must be on background layer",
203                                 pShape4->getViewLayers().at(0).first == mpTestView );
204 
205         // checking deactivation (all layers except background layer
206         // must vanish)
207         mpLayerManager->enterAnimationMode(pShape3);
208         CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager",
209                                 mpLayerManager->isUpdatePending() );
210         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager",
211                                 mpLayerManager->update() );
212         CPPUNIT_ASSERT_MESSAGE( "Shape 4 must not be on background layer",
213                                 pShape4->getViewLayers().at(0).first != mpTestView );
214         mpLayerManager->leaveAnimationMode(pShape3);
215         CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager",
216                                 mpLayerManager->update() );
217         CPPUNIT_ASSERT_MESSAGE( "Shape 4 must be on background layer",
218                                 pShape4->getViewLayers().at(0).first == mpTestView );
219 
220         mpLayerManager->deactivate();
221         CPPUNIT_ASSERT_MESSAGE( "Update pending on deactivated LayerManager",
222                                 !mpLayerManager->isUpdatePending() );
223     }
224 
testShapeRepaint()225     void testShapeRepaint()
226     {
227         TestShapeSharedPtr pShape2( createTestShape(
228             basegfx::B2DRange(0.0,0.0,10.0,10.0),
229             2.0));
230         TestShapeSharedPtr pShape3( createTestShape(
231             basegfx::B2DRange(0.0,0.0,10.0,10.0),
232             3.0));
233         TestShapeSharedPtr pShape4( createTestShape(
234             basegfx::B2DRange(0.0,0.0,10.0,10.0),
235             4.0));
236         TestShapeSharedPtr pShape5( createTestShape(
237             basegfx::B2DRange(20.0,20.0,30.0,30.0),
238             4.0));
239 
240         mpLayerManager->addShape(mpTestShape);
241         mpLayerManager->addShape(pShape2);
242         mpLayerManager->enterAnimationMode(pShape2);
243         mpLayerManager->addShape(pShape3);
244         mpLayerManager->addShape(pShape4);
245         mpLayerManager->addShape(pShape5);
246 
247         mpLayerManager->activate( false );
248         mpLayerManager->update();
249 
250         CPPUNIT_ASSERT_MESSAGE( "First shape not rendered",
251                                 mpTestShape->getNumRenders() == 1 );
252         CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered",
253                                 pShape2->getNumRenders() == 1 );
254         CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered",
255                                 pShape3->getNumRenders() == 1 );
256         CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered",
257                                 pShape4->getNumRenders() == 1 );
258         CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered",
259                                 pShape5->getNumRenders() == 1 );
260 
261         mpLayerManager->enterAnimationMode(pShape4);
262         mpLayerManager->update();
263 
264         CPPUNIT_ASSERT_MESSAGE( "First shape not rendered",
265                                 mpTestShape->getNumRenders() == 1 );
266         CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered",
267                                 pShape2->getNumRenders() == 1 );
268         CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered",
269                                 pShape3->getNumRenders() == 2 );
270         CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered",
271                                 pShape4->getNumRenders() == 2 );
272         CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered",
273                                 pShape5->getNumRenders() == 2 );
274 
275         mpLayerManager->leaveAnimationMode(pShape2);
276         mpLayerManager->leaveAnimationMode(pShape4);
277         mpLayerManager->update();
278 
279         CPPUNIT_ASSERT_MESSAGE( "First shape not rendered #2",
280                                 mpTestShape->getNumRenders() == 2 );
281         CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered #2",
282                                 pShape2->getNumRenders() == 2 );
283         CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered #2",
284                                 pShape3->getNumRenders() == 3 );
285         CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered #2",
286                                 pShape4->getNumRenders() == 3 );
287         CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered #2",
288                                 pShape5->getNumRenders() == 3 );
289     }
290 
testRefCounting()291     void testRefCounting()
292     {
293         TestShapeSharedPtr pShape2( createTestShape(
294             basegfx::B2DRange(0.0,0.0,10.0,10.0),
295             2.0));
296         TestShapeSharedPtr pShape3( createTestShape(
297             basegfx::B2DRange(0.0,0.0,10.0,10.0),
298             3.0));
299         TestShapeSharedPtr pShape4( createTestShape(
300             basegfx::B2DRange(0.0,0.0,10.0,10.0),
301             4.0));
302 
303         mpLayerManager->addShape(mpTestShape);
304         mpLayerManager->addShape(pShape2);
305         mpLayerManager->addShape(pShape3);
306         mpLayerManager->addShape(pShape4);
307 
308         mpLayerManager->removeShape(mpTestShape);
309         mpLayerManager->removeShape(pShape2);
310         mpLayerManager->removeShape(pShape3);
311         mpLayerManager->removeShape(pShape4);
312 
313         CPPUNIT_ASSERT_MESSAGE( "Shape 1 must have refcount of 1",
314                                 mpTestShape.use_count() == 1 );
315         CPPUNIT_ASSERT_MESSAGE( "Shape 2 must have refcount of ",
316                                 pShape2.use_count() == 1 );
317         CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have refcount of 1",
318                                 pShape3.use_count() == 1 );
319         CPPUNIT_ASSERT_MESSAGE( "Shape 4 must have refcount of",
320                                 pShape4.use_count() == 1 );
321 
322 
323         mpLayerManager->addShape(mpTestShape);
324         mpLayerManager->addShape(pShape2);
325         mpLayerManager->addShape(pShape3);
326         mpLayerManager->addShape(pShape4);
327 
328         mpLayerManager->activate( false );
329         mpLayerManager->update();
330 
331         mpLayerManager->removeShape(mpTestShape);
332         mpLayerManager->removeShape(pShape2);
333         mpLayerManager->removeShape(pShape3);
334         mpLayerManager->removeShape(pShape4);
335 
336         CPPUNIT_ASSERT_MESSAGE( "Shape 1 must have refcount of 1",
337                                 mpTestShape.use_count() == 1 );
338         CPPUNIT_ASSERT_MESSAGE( "Shape 2 must have refcount of ",
339                                 pShape2.use_count() == 1 );
340         CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have refcount of 1",
341                                 pShape3.use_count() == 1 );
342         CPPUNIT_ASSERT_MESSAGE( "Shape 4 must have refcount of 1",
343                                 pShape4.use_count() == 1 );
344 
345         maViews.removeView(mpTestView);
346         mpLayerManager->viewRemoved(mpTestView);
347         CPPUNIT_ASSERT_MESSAGE( "View must have refcount of 1",
348                                 mpTestView.use_count() == 1 );
349     }
350 
351     // hook up the test
352     CPPUNIT_TEST_SUITE(LayerManagerTest);
353     CPPUNIT_TEST(testBasics);
354     CPPUNIT_TEST(testLayer);
355     CPPUNIT_TEST(testShapeOrdering);
356     CPPUNIT_TEST(testShapeRepaint);
357     CPPUNIT_TEST(testRefCounting);
358     CPPUNIT_TEST_SUITE_END();
359 
360 }; // class LayerManagerTest
361 
362 // -----------------------------------------------------------------------------
363 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(LayerManagerTest, "LayerManagerTest");
364 } // namespace
365 
366 
367