| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <testshl/simpleheader.hxx> |
| #include <cppuhelper/compbase1.hxx> |
| #include <comphelper/broadcasthelper.hxx> |
| |
| #include <basegfx/matrix/b2dhommatrix.hxx> |
| #include <basegfx/range/b2drectangle.hxx> |
| #include <cppcanvas/spritecanvas.hxx> |
| |
| #include "view.hxx" |
| #include "unoview.hxx" |
| #include "unoviewcontainer.hxx" |
| #include "shape.hxx" |
| #include "tests.hxx" |
| #include "../engine/slide/layermanager.hxx" |
| #include "../engine/slide/layer.hxx" |
| #include "com/sun/star/presentation/XSlideShowView.hpp" |
| |
| namespace target = slideshow::internal; |
| using namespace ::com::sun::star; |
| |
| namespace |
| { |
| |
| class LayerManagerTest : public CppUnit::TestFixture |
| { |
| target::UnoViewContainer maViews; |
| target::LayerManagerSharedPtr mpLayerManager; |
| TestViewSharedPtr mpTestView; |
| TestShapeSharedPtr mpTestShape; |
| |
| public: |
| void setUp() |
| { |
| mpTestShape = createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 1.0); |
| mpTestView = createTestView(); |
| maViews.addView( mpTestView ); |
| |
| mpLayerManager.reset( |
| new target::LayerManager( |
| maViews, |
| basegfx::B2DRange(0.0,0.0,100.0,100.0), |
| false )); |
| } |
| |
| void tearDown() |
| { |
| mpLayerManager.reset(); |
| maViews.dispose(); |
| } |
| |
| void testLayer() |
| { |
| target::LayerSharedPtr pBgLayer( |
| target::Layer::createBackgroundLayer( basegfx::B2DRange(0,0,100,100) ) ); |
| pBgLayer->addView( mpTestView ); |
| |
| target::LayerSharedPtr pFgLayer( |
| target::Layer::createLayer( basegfx::B2DRange(0,0,100,100) ) ); |
| pFgLayer->addView( mpTestView ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "BG layer must confess that!", |
| pBgLayer->isBackgroundLayer() ); |
| CPPUNIT_ASSERT_MESSAGE( "FG layer lies!", |
| !pFgLayer->isBackgroundLayer() ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "BG layer must not have pending updates!", |
| !pBgLayer->isUpdatePending() ); |
| pBgLayer->addUpdateRange( basegfx::B2DRange(0,0,10,10) ); |
| CPPUNIT_ASSERT_MESSAGE( "BG layer must have pending updates!", |
| pBgLayer->isUpdatePending() ); |
| |
| TestShapeSharedPtr pTestShape = createTestShape( |
| basegfx::B2DRange(0.0,0.0,1000.0,1000.0), |
| 1.0); |
| pBgLayer->updateBounds( pTestShape ); |
| CPPUNIT_ASSERT_MESSAGE( "BG layer must not resize!", |
| !pBgLayer->commitBounds() ); |
| |
| TestShapeSharedPtr pTestShape2 = createTestShape( |
| basegfx::B2DRange(0.0,0.0,1.0,1.0), |
| 1.0); |
| pFgLayer->updateBounds( pTestShape2 ); |
| CPPUNIT_ASSERT_MESSAGE( "FG layer must resize!", |
| pFgLayer->commitBounds() ); |
| } |
| |
| void testBasics() |
| { |
| mpLayerManager->activate( false ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Un-added shape must have zero view layers", |
| mpTestShape->getViewLayers().empty() ); |
| mpLayerManager->addShape(mpTestShape); |
| CPPUNIT_ASSERT_MESSAGE( "Adding a shape requires a LayerManager update", |
| mpLayerManager->isUpdatePending() ); |
| |
| // update does the delayed viewAdded call to the shape |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "Added shape must have one view layer", |
| mpTestShape->getViewLayers().size() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape must been rendered", |
| mpTestShape->getNumRenders() ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape must not been updated", |
| !mpTestShape->getNumUpdates() ); |
| |
| // test second view, check whether shape gets additional view |
| TestViewSharedPtr pTestView( createTestView() ); |
| CPPUNIT_ASSERT_MESSAGE( "Adding second View failed", |
| maViews.addView( pTestView ) ); |
| CPPUNIT_ASSERT_MESSAGE( "View container must have two views", |
| maViews.end() - maViews.begin() == 2 ); |
| mpLayerManager->viewAdded(pTestView); |
| CPPUNIT_ASSERT_MESSAGE( "Added shape must have two view layers", |
| mpTestShape->getViewLayers().size() == 2 ); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Removing second View failed", |
| maViews.removeView( pTestView ) ); |
| mpLayerManager->viewRemoved(pTestView); |
| CPPUNIT_ASSERT_MESSAGE( "Added shape must have one view layer", |
| mpTestShape->getViewLayers().size() == 1 ); |
| |
| mpLayerManager->deactivate(); |
| } |
| |
| void testShapeOrdering() |
| { |
| TestShapeSharedPtr pShape2( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 2.0)); |
| TestShapeSharedPtr pShape3( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 3.0)); |
| TestShapeSharedPtr pShape4( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 4.0)); |
| |
| mpLayerManager->addShape(mpTestShape); |
| mpLayerManager->addShape(pShape2); |
| mpLayerManager->addShape(pShape3); |
| mpLayerManager->addShape(pShape4); |
| |
| mpLayerManager->activate( false ); |
| |
| // update does the delayed viewAdded call to the shape |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "View must have background layer only", |
| mpTestView->getViewLayers().empty() ); |
| |
| // LayerManager must now generate one extra view layer |
| mpLayerManager->enterAnimationMode(pShape2); |
| CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager", |
| mpLayerManager->isUpdatePending() ); |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "View must have one extra layer only", |
| mpTestView->getViewLayers().size() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "View layer must have 10x10 size", |
| mpTestView->getViewLayers().at(0)->getBounds() == |
| basegfx::B2DRange(0.0,0.0,10.0,10.0) ); |
| |
| // LayerManager must now remove the extra view layer |
| mpLayerManager->leaveAnimationMode(pShape2); |
| CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager", |
| mpLayerManager->isUpdatePending() ); |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager #2", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 1 must be on background layer", |
| mpTestShape->getViewLayers().at(0).first == mpTestView ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 2 must be on background layer", |
| pShape2->getViewLayers().at(0).first == mpTestView ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have one layer", |
| pShape3->getViewLayers().size() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 3 must be on background layer", |
| pShape3->getViewLayers().at(0).first == mpTestView ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 4 must be on background layer", |
| pShape4->getViewLayers().at(0).first == mpTestView ); |
| |
| // checking deactivation (all layers except background layer |
| // must vanish) |
| mpLayerManager->enterAnimationMode(pShape3); |
| CPPUNIT_ASSERT_MESSAGE( "No update pending on LayerManager", |
| mpLayerManager->isUpdatePending() ); |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 4 must not be on background layer", |
| pShape4->getViewLayers().at(0).first != mpTestView ); |
| mpLayerManager->leaveAnimationMode(pShape3); |
| CPPUNIT_ASSERT_MESSAGE( "Update failed on LayerManager", |
| mpLayerManager->update() ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 4 must be on background layer", |
| pShape4->getViewLayers().at(0).first == mpTestView ); |
| |
| mpLayerManager->deactivate(); |
| CPPUNIT_ASSERT_MESSAGE( "Update pending on deactivated LayerManager", |
| !mpLayerManager->isUpdatePending() ); |
| } |
| |
| void testShapeRepaint() |
| { |
| TestShapeSharedPtr pShape2( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 2.0)); |
| TestShapeSharedPtr pShape3( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 3.0)); |
| TestShapeSharedPtr pShape4( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 4.0)); |
| TestShapeSharedPtr pShape5( createTestShape( |
| basegfx::B2DRange(20.0,20.0,30.0,30.0), |
| 4.0)); |
| |
| mpLayerManager->addShape(mpTestShape); |
| mpLayerManager->addShape(pShape2); |
| mpLayerManager->enterAnimationMode(pShape2); |
| mpLayerManager->addShape(pShape3); |
| mpLayerManager->addShape(pShape4); |
| mpLayerManager->addShape(pShape5); |
| |
| mpLayerManager->activate( false ); |
| mpLayerManager->update(); |
| |
| CPPUNIT_ASSERT_MESSAGE( "First shape not rendered", |
| mpTestShape->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered", |
| pShape2->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered", |
| pShape3->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered", |
| pShape4->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered", |
| pShape5->getNumRenders() == 1 ); |
| |
| mpLayerManager->enterAnimationMode(pShape4); |
| mpLayerManager->update(); |
| |
| CPPUNIT_ASSERT_MESSAGE( "First shape not rendered", |
| mpTestShape->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered", |
| pShape2->getNumRenders() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered", |
| pShape3->getNumRenders() == 2 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered", |
| pShape4->getNumRenders() == 2 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered", |
| pShape5->getNumRenders() == 2 ); |
| |
| mpLayerManager->leaveAnimationMode(pShape2); |
| mpLayerManager->leaveAnimationMode(pShape4); |
| mpLayerManager->update(); |
| |
| CPPUNIT_ASSERT_MESSAGE( "First shape not rendered #2", |
| mpTestShape->getNumRenders() == 2 ); |
| CPPUNIT_ASSERT_MESSAGE( "Second shape not rendered #2", |
| pShape2->getNumRenders() == 2 ); |
| CPPUNIT_ASSERT_MESSAGE( "Third shape not rendered #2", |
| pShape3->getNumRenders() == 3 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fourth shape not rendered #2", |
| pShape4->getNumRenders() == 3 ); |
| CPPUNIT_ASSERT_MESSAGE( "Fifth shape not rendered #2", |
| pShape5->getNumRenders() == 3 ); |
| } |
| |
| void testRefCounting() |
| { |
| TestShapeSharedPtr pShape2( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 2.0)); |
| TestShapeSharedPtr pShape3( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 3.0)); |
| TestShapeSharedPtr pShape4( createTestShape( |
| basegfx::B2DRange(0.0,0.0,10.0,10.0), |
| 4.0)); |
| |
| mpLayerManager->addShape(mpTestShape); |
| mpLayerManager->addShape(pShape2); |
| mpLayerManager->addShape(pShape3); |
| mpLayerManager->addShape(pShape4); |
| |
| mpLayerManager->removeShape(mpTestShape); |
| mpLayerManager->removeShape(pShape2); |
| mpLayerManager->removeShape(pShape3); |
| mpLayerManager->removeShape(pShape4); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Shape 1 must have refcount of 1", |
| mpTestShape.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 2 must have refcount of ", |
| pShape2.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have refcount of 1", |
| pShape3.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 4 must have refcount of", |
| pShape4.use_count() == 1 ); |
| |
| |
| mpLayerManager->addShape(mpTestShape); |
| mpLayerManager->addShape(pShape2); |
| mpLayerManager->addShape(pShape3); |
| mpLayerManager->addShape(pShape4); |
| |
| mpLayerManager->activate( false ); |
| mpLayerManager->update(); |
| |
| mpLayerManager->removeShape(mpTestShape); |
| mpLayerManager->removeShape(pShape2); |
| mpLayerManager->removeShape(pShape3); |
| mpLayerManager->removeShape(pShape4); |
| |
| CPPUNIT_ASSERT_MESSAGE( "Shape 1 must have refcount of 1", |
| mpTestShape.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 2 must have refcount of ", |
| pShape2.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 3 must have refcount of 1", |
| pShape3.use_count() == 1 ); |
| CPPUNIT_ASSERT_MESSAGE( "Shape 4 must have refcount of 1", |
| pShape4.use_count() == 1 ); |
| |
| maViews.removeView(mpTestView); |
| mpLayerManager->viewRemoved(mpTestView); |
| CPPUNIT_ASSERT_MESSAGE( "View must have refcount of 1", |
| mpTestView.use_count() == 1 ); |
| } |
| |
| // hook up the test |
| CPPUNIT_TEST_SUITE(LayerManagerTest); |
| CPPUNIT_TEST(testBasics); |
| CPPUNIT_TEST(testLayer); |
| CPPUNIT_TEST(testShapeOrdering); |
| CPPUNIT_TEST(testShapeRepaint); |
| CPPUNIT_TEST(testRefCounting); |
| CPPUNIT_TEST_SUITE_END(); |
| |
| }; // class LayerManagerTest |
| |
| // ----------------------------------------------------------------------------- |
| CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(LayerManagerTest, "LayerManagerTest"); |
| } // namespace |
| |
| |