diff options
-rw-r--r-- | include/test/screenshot_test.hxx | 18 | ||||
-rw-r--r-- | sc/qa/unit/screenshots/screenshots.cxx | 90 | ||||
-rw-r--r-- | sd/qa/unit/dialogs-test.cxx | 122 | ||||
-rw-r--r-- | test/source/screenshot_test.cxx | 154 |
4 files changed, 283 insertions, 101 deletions
diff --git a/include/test/screenshot_test.hxx b/include/test/screenshot_test.hxx index f07c29a9e65b..a3b0b0e6eee7 100644 --- a/include/test/screenshot_test.hxx +++ b/include/test/screenshot_test.hxx @@ -15,6 +15,7 @@ #include <unotest/macros_test.hxx> #include <com/sun/star/lang/XComponent.hpp> #include <osl/file.hxx> +#include <vcl/dialog.hxx> class VclAbstractDialog; @@ -27,10 +28,23 @@ public: virtual void setUp() override; virtual void tearDown() override; - void dumpDialogToPath( VclAbstractDialog& rDialog ); + /// version for AbstractDialogs, the ones created in AbstractDialogFactories + void dumpDialogToPath(VclAbstractDialog& rDialog); + + /// version for pure vcl-based dialogs + void dumpDialogToPath(Dialog& rDialog); + + /// fallback version for dialogs for which only the UXMLDescription is known. + /// This should be used with care - no active layouting will be done, only the + /// VclBuilder will be activated for layouting. Result can thus vary drastically + /// compared to the active dialog (can be compared with dialog previewer) + void dumpDialogToPath(const OString& rUIXMLDescription); private: - void saveScreenshot( VclAbstractDialog& rDialog ); + void implSaveScreenshot(const Bitmap& rScreenshot, const OString& rScreenshotId); + void saveScreenshot(VclAbstractDialog& rDialog); + void saveScreenshot(Dialog& rDialog); + OUString m_aScreenshotDirectory; }; diff --git a/sc/qa/unit/screenshots/screenshots.cxx b/sc/qa/unit/screenshots/screenshots.cxx index 10213e52eb63..556db725314e 100644 --- a/sc/qa/unit/screenshots/screenshots.cxx +++ b/sc/qa/unit/screenshots/screenshots.cxx @@ -40,8 +40,10 @@ #include <sc.hrc> #include <scresid.hxx> #include <scitems.hxx> +#include <map> using namespace css; +typedef std::map< OString, sal_uInt32 > mapType; static const char* DATA_DIRECTORY = "/sc/qa/unit/screenshots/data/"; @@ -72,9 +74,19 @@ private: std::unique_ptr<ScImportStringStream> pStream; std::unique_ptr<SfxItemSet> pItemSet; + + /// the set of known dialogs and their ID for usage in createDialogByID + mapType maKnownDialogs; }; ScScreenshotTest::ScScreenshotTest() +: mxComponent(), + pFoundShell(nullptr), + xDocSh(), + pViewShell(nullptr), + pFact(nullptr), + pStream(), + maKnownDialogs() { } @@ -97,7 +109,29 @@ void ScScreenshotTest::initializeWithDoc(const char* pName) CPPUNIT_ASSERT_MESSAGE("Failed to create dialog factory", pFact); const OUString aCsv("some, strings, here, separated, by, commas"); - pStream.reset( new ScImportStringStream( aCsv) ); + pStream.reset(new ScImportStringStream(aCsv)); + + if (maKnownDialogs.empty()) + { + // fill map of unknown dilogs. Use a set here to allow later + // to 'find' a ID for construction based on the UIXMLDescription + // string (currently not yet used) + maKnownDialogs["modules/scalc/ui/insertsheet.ui"] = 0; + maKnownDialogs["modules/scalc/ui/deletecells.ui"] = 1; + maKnownDialogs["modules/scalc/ui/pastespecial.ui"] = 2; + maKnownDialogs["modules/scalc/ui/changesourcedialog.ui"] = 3; + maKnownDialogs["modules/scalc/ui/selectdatasource.ui"] = 4; + maKnownDialogs["modules/scalc/ui/selectsource.ui"] = 5; + maKnownDialogs["modules/scalc/ui/deletecontents.ui"] = 6; + maKnownDialogs["modules/scalc/ui/createnamesdialog.ui"] = 7; + maKnownDialogs["modules/scalc/ui/inputstringdialog.ui"] = 8; + maKnownDialogs["modules/scalc/ui/tabcolordialog.ui"] = 9; + maKnownDialogs["modules/scalc/ui/textimportoptions.ui"] = 10; + maKnownDialogs["modules/scalc/ui/dataform.ui"] = 11; + maKnownDialogs["modules/scalc/ui/movecopysheet.ui"] = 12; + maKnownDialogs["modules/scalc/ui/textimportcsv.ui"] = 13; + maKnownDialogs["modules/scalc/ui/formatcellsdialog.ui"] = 14; + } } VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) @@ -108,7 +142,7 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) switch ( nID ) { - case 0: + case 0: // "modules/scalc/ui/insertsheet.ui" { ScViewData& rViewData = pViewShell->GetViewData(); SCTAB nTabSelCount = rViewData.GetMarkData().GetSelectCount(); @@ -119,43 +153,42 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) break; } - case 1: + case 1: // "modules/scalc/ui/deletecells.ui" { pReturnDialog = pFact->CreateScDeleteCellDlg( pViewShell->GetDialogParent(), false ); break; } - case 2: + case 2: // "modules/scalc/ui/pastespecial.ui" { pReturnDialog = pFact->CreateScInsertContentsDlg( pViewShell->GetDialogParent() ); break; } - case 3: + case 3: // "modules/scalc/ui/changesourcedialog.ui" { pReturnDialog = pFact->CreateScColRowLabelDlg( pViewShell->GetDialogParent(), true, false ); break; } - case 4: + case 4: // "modules/scalc/ui/selectdatasource.ui" { pReturnDialog = pFact->CreateScDataPilotDatabaseDlg( pViewShell->GetDialogParent() ); break; } - case 5: + case 5: // "modules/scalc/ui/selectsource.ui" { - pReturnDialog = pFact->CreateScDataPilotSourceTypeDlg(pViewShell->GetDialogParent(), true ); break; } - case 6: + case 6: // "modules/scalc/ui/deletecontents.ui" { pReturnDialog = pFact->CreateScDeleteContentsDlg( pViewShell->GetDialogParent() ); break; } - case 7: + case 7: // "modules/scalc/ui/createnamesdialog.ui" { //// just fake some flags sal_uInt16 nFlags = NAME_LEFT | NAME_TOP; @@ -163,7 +196,7 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) break; } - case 8: + case 8: // "modules/scalc/ui/inputstringdialog.ui" { const OString aEmpty(""); pReturnDialog = pFact->CreateScStringInputDlg( pViewShell->GetDialogParent(), @@ -172,7 +205,7 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) break; } - case 9: + case 9: // "modules/scalc/ui/tabcolordialog.ui" { pReturnDialog = pFact->CreateScTabBgColorDlg( pViewShell->GetDialogParent(), OUString(ScResId(SCSTR_SET_TAB_BG_COLOR)), @@ -180,13 +213,13 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) break; } - case 10: + case 10: // "modules/scalc/ui/textimportoptions.ui" { pReturnDialog = pFact->CreateScTextImportOptionsDlg(); break; } - case 11: + case 11: // "modules/scalc/ui/dataform.ui" { ////FIXME: looks butt-ugly w/ empty file, move it elsewhere, where ////we actually have some data @@ -194,18 +227,18 @@ VclAbstractDialog* ScScreenshotTest::createDialogByID( sal_uInt32 nID ) break; } - case 12: + case 12: // "modules/scalc/ui/movecopysheet.ui" { pReturnDialog = pFact->CreateScMoveTableDlg( pViewShell->GetDialogParent(), aDefaultSheetName ); break; } - case 13: + case 13: // "modules/scalc/ui/textimportcsv.ui" { pReturnDialog = pFact->CreateScImportAsciiDlg( OUString(), pStream.get(), SC_PASTETEXT ); break; } - case 14: + case 14: // "modules/scalc/ui/formatcellsdialog.ui" { ScViewData& rViewData = pViewShell->GetViewData(); ScDocument *pDoc = rViewData.GetDocument(); @@ -239,13 +272,26 @@ void ScScreenshotTest::testOpeningModalDialogs() { initializeWithDoc("empty.ods"); - const sal_uInt32 nDialogs = 15; + static bool bDumpAllKnownDialogs = true; - for ( sal_uInt32 i = 0; i < nDialogs; i++ ) + if (bDumpAllKnownDialogs) { - std::unique_ptr<VclAbstractDialog> pDialog( createDialogByID( i ) ); - - dumpDialogToPath( *pDialog ); + for (mapType::const_iterator i = maKnownDialogs.begin(); i != maKnownDialogs.end(); i++) + { + std::unique_ptr<VclAbstractDialog> pDlg(createDialogByID((*i).second)); + + if (pDlg) + { + // known dialog, dump screenshot to path + dumpDialogToPath(*pDlg); + } + else + { + // unknown dialog, should not happen in this basic loop. + // You have probably forgotten to add a case and + // implementastion to createDialogByID, please do this + } + } } } diff --git a/sd/qa/unit/dialogs-test.cxx b/sd/qa/unit/dialogs-test.cxx index 02dfa202feb2..893fd438badf 100644 --- a/sd/qa/unit/dialogs-test.cxx +++ b/sd/qa/unit/dialogs-test.cxx @@ -54,8 +54,10 @@ #include <com/sun/star/frame/XDesktop2.hpp> #include <comphelper/processfactory.hxx> #include <unotest/macros_test.hxx> +#include <map> using namespace ::com::sun::star; +typedef std::map< OString, sal_uInt32 > mapType; /// Test opening a dialog in sd class SdDialogsTest : public ScreenshotTest @@ -77,6 +79,9 @@ private: std::unique_ptr<SfxItemSet> mpEmptySfxItemSet; std::unique_ptr<SfxItemSet> mpEmptyFillStyleSfxItemSet; + /// the set of known dialogs and their ID for usage in createDialogByID + mapType maKnownDialogs; + /// helpers SdAbstractDialogFactory* getSdAbstractDialogFactory(); SdXImpressDocument* getSdXImpressDocument(); @@ -113,7 +118,8 @@ SdDialogsTest::SdDialogsTest() mpDrawView(nullptr), mpSfxItemSetFromSdrObject(nullptr), mpEmptySfxItemSet(nullptr), - mpEmptyFillStyleSfxItemSet(nullptr) + mpEmptyFillStyleSfxItemSet(nullptr), + maKnownDialogs() { } @@ -131,6 +137,36 @@ void SdDialogsTest::setUp() mpImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get()); CPPUNIT_ASSERT(mpImpressDocument); + + if (maKnownDialogs.empty()) + { + // fill map of unknown dilogs. Use a set here to allow later + // to 'find' a ID for construction based on the UIXMLDescription + // string (currently not yet used) + maKnownDialogs["modules/simpress/ui/publishingdialog.ui"] = 0; + maKnownDialogs["modules/sdraw/ui/breakdialog.ui"] = 1; + maKnownDialogs["modules/sdraw/ui/copydlg.ui"] = 2; + maKnownDialogs["modules/simpress/ui/customslideshows.ui"] = 3; + maKnownDialogs["modules/sdraw/ui/drawchardialog.ui"] = 4; + maKnownDialogs["modules/sdraw/ui/drawpagedialog.ui"] = 5; + maKnownDialogs["modules/simpress/ui/dlgfield.ui"] = 6; + maKnownDialogs["modules/sdraw/ui/dlgsnap.ui"] = 7; + maKnownDialogs["modules/sdraw/ui/insertlayer.ui"] = 8; + maKnownDialogs["modules/sdraw/ui/insertslidesdialog.ui"] = 9; + maKnownDialogs["modules/sdraw/ui/crossfadedialog.ui"] = 10; + maKnownDialogs["modules/sdraw/ui/bulletsandnumbering.ui"] = 11; + maKnownDialogs["modules/sdraw/ui/drawparadialog.ui"] = 12; + maKnownDialogs["modules/simpress/ui/presentationdialog.ui"] = 13; + maKnownDialogs["modules/simpress/ui/remotedialog.ui"] = 14; + maKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 15; + maKnownDialogs["modules/simpress/ui/slidedesigndialog.ui"] = 16; + maKnownDialogs["modules/sdraw/ui/drawprtldialog.ui"] = 17; + maKnownDialogs["modules/simpress/ui/interactiondialog.ui"] = 18; + maKnownDialogs["modules/sdraw/ui/vectorize.ui"] = 19; + maKnownDialogs["modules/simpress/ui/photoalbum.ui"] = 20; + maKnownDialogs["modules/simpress/ui/masterlayoutdlg.ui"] = 21; + maKnownDialogs["modules/simpress/ui/headerfooterdialog.ui"] = 22; + } } SdAbstractDialogFactory* SdDialogsTest::getSdAbstractDialogFactory() @@ -307,11 +343,6 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) } case 6: { - // CreateAssistentDlg(bool bAutoPilot) has been dropped - break; - } - case 7: - { // CreateSdModifyFieldDlg(vcl::Window* pWindow, const SvxFieldData* pInField, const SfxItemSet& rSet) override; pRetval = getSdAbstractDialogFactory()->CreateSdModifyFieldDlg( Application::GetDefDialogParent(), @@ -319,7 +350,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getEmptySfxItemSet()); break; } - case 8: + case 7: { // CreateSdSnapLineDlg(const SfxItemSet& rInAttrs, ::sd::View* pView) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -333,7 +364,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getDrawView()); break; } - case 9: + case 8: { // CreateSdInsertLayerDlg(const SfxItemSet& rInAttrs, bool bDeletable, const OUString& aStr) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -354,7 +385,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) SD_RESSTR(STR_INSERTLAYER) /* alternative: STR_MODIFYLAYER */); break; } - case 10: + case 9: { // CreateSdInsertPagesObjsDlg(const SdDrawDocument* pDoc, SfxMedium* pSfxMedium, const OUString& rFileName) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -367,7 +398,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) aFileName); break; } - case 11: + case 10: { // CreateMorphDlg(vcl::Window* pParent, const SdrObject* pObj1, const SdrObject* pObj2) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -383,7 +414,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) pSdrObj); break; } - case 12: + case 11: { // CreateSdOutlineBulletTabDlg(const SfxItemSet* pAttr, ::sd::View* pView = nullptr) override; pRetval = getSdAbstractDialogFactory()->CreateSdOutlineBulletTabDlg( @@ -392,7 +423,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getDrawView()); break; } - case 13: + case 12: { // CreateSdParagraphTabDlg(const SfxItemSet* pAttr) override; pRetval = getSdAbstractDialogFactory()->CreateSdParagraphTabDlg( @@ -400,7 +431,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) &getEmptySfxItemSet()); break; } - case 14: + case 13: { // CreateSdStartPresentationDlg(vcl::Window* pWindow, const SfxItemSet& rInAttrs, const std::vector<OUString> &rPageNames, SdCustomShowList* pCSList) override; const std::vector<OUString> aPageNames; @@ -430,14 +461,14 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) nullptr); break; } - case 15: + case 14: { // CreateRemoteDialog(vcl::Window* pWindow) override; // ad for RemoteDialog pRetval = getSdAbstractDialogFactory()->CreateRemoteDialog( Application::GetDefDialogParent()); break; } - case 16: + case 15: { // CreateSdPresLayoutTemplateDlg(SfxObjectShell* pDocSh, vcl::Window* pParent, const SdResId& DlgId, SfxStyleSheetBase& rStyleBase, PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) override; // use STR_PSEUDOSHEET_TITLE configuration, see futempl.cxx for more possible configurations @@ -455,7 +486,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) pStyleSheetPool); break; } - case 17: + case 16: { // CreateSdPresLayoutDlg(::sd::DrawDocShell* pDocShell, vcl::Window* pWindow, const SfxItemSet& rInAttrs) override; pRetval = getSdAbstractDialogFactory()->CreateSdPresLayoutDlg( @@ -464,7 +495,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getEmptySfxItemSet()); break; } - case 18: + case 17: { // CreateSdTabTemplateDlg(const SfxObjectShell* pDocShell, SfxStyleSheetBase& rStyleBase, SdrModel* pModel, SdrView* pView) override; // pretty similar to CreateSdPresLayoutTemplateDlg, see above @@ -483,7 +514,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getDrawView()); break; } - case 19: + case 18: { // CreatSdActionDialog(const SfxItemSet* pAttr, ::sd::View* pView) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -511,7 +542,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getDrawView()); break; } - case 20: + case 19: { // CreateSdVectorizeDlg(vcl::Window* pParent, const Bitmap& rBmp, ::sd::DrawDocShell* pDocShell) override; // works well with empty Bitmap, but my be nicer with setting one @@ -522,7 +553,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) getDocShell()); break; } - case 21: + case 20: { // CreateSdPhotoAlbumDialog(vcl::Window* pWindow, SdDrawDocument* pDoc) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -532,7 +563,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) pDrawDoc); break; } - case 22: + case 21: { // CreateMasterLayoutDialog(vcl::Window* pParent, SdDrawDocument* pDoc, SdPage*) override; SdDrawDocument* pDrawDoc = getSdXImpressDocument()->GetDoc(); @@ -545,7 +576,7 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) pSdPage); break; } - case 23: + case 22: { // CreateHeaderFooterDialog(sd::ViewShell* pViewShell, vcl::Window* pParent, SdDrawDocument* pDoc, SdPage* pCurrentPage) override; // This is a hard case, for two reasons: @@ -575,24 +606,47 @@ VclAbstractDialog* SdDialogsTest::createDialogByID(sal_uInt32 nID) void SdDialogsTest::openAnyDialog() { - // example for SfxTabDialog: 5 - // example for TabDialog: 23 - // example for self-adapted wizard: 0 - static sal_uInt32 nStartValue(0); - static sal_uInt32 nEndValue(24); - - // loop and dump all Dialogs from SD for now - for (sal_uInt32 a(nStartValue); a < nEndValue; a++) - { - std::unique_ptr<VclAbstractDialog> pDlg( createDialogByID(a) ); + static bool bDumpAllKnownDialogs = true; - if (pDlg) + if (bDumpAllKnownDialogs) + { + // example for SfxTabDialog: 5 -> "modules/sdraw/ui/drawpagedialog.ui" + // example for TabDialog: 22 -> "modules/simpress/ui/headerfooterdialog.ui" + // example for self-adapted wizard: 0 -> "modules/simpress/ui/publishingdialog.ui" + for (mapType::const_iterator i = maKnownDialogs.begin(); i != maKnownDialogs.end(); i++) { - dumpDialogToPath(*pDlg); + std::unique_ptr<VclAbstractDialog> pDlg(createDialogByID((*i).second)); + + if (pDlg) + { + // known dialog, dump screenshot to path + dumpDialogToPath(*pDlg); + } + else + { + // unknown dialog, should not happen in this basic loop. + // You have probably forgotten to add a case and + // implementastion to createDialogByID, please do this + } } } + static bool bCheckFallbackDialog = false; + if (bCheckFallbackDialog) + { + // unknown dialog, try fallback to generic created + // VclBuilder-generated instance. Keep in mind that Dialogs + // using this mechanism will probably not be layouted well + // since the setup/initialization part is missing. Thus, + // only use for fallback when only the UI file is available. + // + // Take any example here, it's only for demonstration - using + // even a known one to demonstrate the fallback possibility + const OString aUIXMLDescription("modules/sdraw/ui/breakdialog.ui"); + + dumpDialogToPath(aUIXMLDescription); + } } CPPUNIT_TEST_SUITE_REGISTRATION(SdDialogsTest); diff --git a/test/source/screenshot_test.cxx b/test/source/screenshot_test.cxx index d02e73841827..e33cf21b6545 100644 --- a/test/source/screenshot_test.cxx +++ b/test/source/screenshot_test.cxx @@ -14,9 +14,10 @@ #include <comphelper/processfactory.hxx> #include <vcl/abstdlg.hxx> #include <vcl/pngwrite.hxx> +#include <vcl/svapp.hxx> namespace { - void splitHelpId( OString& rHelpId, OUString& rDirname, OUString &rBasename ) + void splitHelpId( const OString& rHelpId, OUString& rDirname, OUString &rBasename ) { sal_Int32 nIndex = rHelpId.lastIndexOf( '/' ); @@ -52,51 +53,118 @@ void ScreenshotTest::tearDown() test::BootstrapFixture::tearDown(); } -void ScreenshotTest::saveScreenshot( VclAbstractDialog& rDialog ) +void ScreenshotTest::implSaveScreenshot(const Bitmap& rScreenshot, const OString& rScreenshotId) { - const Bitmap aScreenshot(rDialog.createScreenshot()); - - if (!aScreenshot.IsEmpty()) - { - OString aScreenshotId = rDialog.GetScreenshotId(); - OUString aDirname, aBasename; - splitHelpId( aScreenshotId, aDirname, aBasename ); - aDirname = m_aScreenshotDirectory + aDirname; - - osl::FileBase::RC err = osl::Directory::createPath( m_directories.getURLFromSrc( aDirname )); - CPPUNIT_ASSERT_MESSAGE( OUStringToOString( "Failed to create " + aDirname, RTL_TEXTENCODING_UTF8).getStr(), - (err == osl::FileBase::E_None || err == osl::FileBase::E_EXIST) ); - - OUString aFullPath = m_directories.getSrcRootPath() + aDirname + "/" + aBasename + ".png"; - SvFileStream aNew(aFullPath, StreamMode::WRITE | StreamMode::TRUNC); - CPPUNIT_ASSERT_MESSAGE( OUStringToOString( "Failed to open " + OUString::number(aNew.GetErrorCode()), RTL_TEXTENCODING_UTF8).getStr(), aNew.IsOpen() ); - - vcl::PNGWriter aPNGWriter(aScreenshot); - aPNGWriter.Write(aNew); - } + OUString aDirname, aBasename; + splitHelpId(rScreenshotId, aDirname, aBasename); + aDirname = m_aScreenshotDirectory + aDirname; + + osl::FileBase::RC err = osl::Directory::createPath(m_directories.getURLFromSrc(aDirname)); + CPPUNIT_ASSERT_MESSAGE(OUStringToOString("Failed to create " + aDirname, RTL_TEXTENCODING_UTF8).getStr(), + (err == osl::FileBase::E_None || err == osl::FileBase::E_EXIST)); + + OUString aFullPath = m_directories.getSrcRootPath() + aDirname + "/" + aBasename + ".png"; + SvFileStream aNew(aFullPath, StreamMode::WRITE | StreamMode::TRUNC); + CPPUNIT_ASSERT_MESSAGE(OUStringToOString("Failed to open " + OUString::number(aNew.GetErrorCode()), RTL_TEXTENCODING_UTF8).getStr(), aNew.IsOpen()); + + vcl::PNGWriter aPNGWriter(rScreenshot); + aPNGWriter.Write(aNew); +} + +void ScreenshotTest::saveScreenshot(VclAbstractDialog& rDialog) +{ + const Bitmap aScreenshot(rDialog.createScreenshot()); + + if (!aScreenshot.IsEmpty()) + { + const OString aScreenshotId = rDialog.GetScreenshotId(); + + if (!aScreenshotId.isEmpty()) + { + implSaveScreenshot(aScreenshot, aScreenshotId); + } + } +} + +void ScreenshotTest::saveScreenshot(Dialog& rDialog) +{ + const Bitmap aScreenshot(rDialog.createScreenshot()); + + if (!aScreenshot.IsEmpty()) + { + const OString aScreenshotId = rDialog.GetScreenshotId(); + + if (!aScreenshotId.isEmpty()) + { + implSaveScreenshot(aScreenshot, aScreenshotId); + } + } +} + +void ScreenshotTest::dumpDialogToPath(VclAbstractDialog& rDialog) +{ + const std::vector<OString> aPageDescriptions(rDialog.getAllPageUIXMLDescriptions()); + + if (aPageDescriptions.size()) + { + for (sal_uInt32 a(0); a < aPageDescriptions.size(); a++) + { + if (rDialog.selectPageByUIXMLDescription(aPageDescriptions[a])) + { + saveScreenshot(rDialog); + } + else + { + CPPUNIT_ASSERT(false); + } + } + } + else + { + saveScreenshot(rDialog); + } } -void ScreenshotTest::dumpDialogToPath( VclAbstractDialog& rDialog ) +void ScreenshotTest::dumpDialogToPath(Dialog& rDialog) { - const std::vector<OString> aPageDescriptions(rDialog.getAllPageUIXMLDescriptions()); - - if (aPageDescriptions.size()) - { - for (sal_uInt32 a(0); a < aPageDescriptions.size(); a++) - { - if (rDialog.selectPageByUIXMLDescription(aPageDescriptions[a])) - { - saveScreenshot( rDialog ); - } - else - { - CPPUNIT_ASSERT(false); - } - } - } - else - { - saveScreenshot( rDialog ); - } + const std::vector<OString> aPageDescriptions(rDialog.getAllPageUIXMLDescriptions()); + + if (aPageDescriptions.size()) + { + for (sal_uInt32 a(0); a < aPageDescriptions.size(); a++) + { + if (rDialog.selectPageByUIXMLDescription(aPageDescriptions[a])) + { + saveScreenshot(rDialog); + } + else + { + CPPUNIT_ASSERT(false); + } + } + } + else + { + saveScreenshot(rDialog); + } } + +void ScreenshotTest::dumpDialogToPath(const OString& rUIXMLDescription) +{ + if (!rUIXMLDescription.isEmpty()) + { + VclPtrInstance<Dialog> pDialog(Application::GetDefDialogParent(), WB_STDDIALOG | WB_SIZEABLE, Dialog::InitFlag::NoParent); + VclBuilder aBuilder(pDialog, VclBuilderContainer::getUIRootDir(), OStringToOUString(rUIXMLDescription, RTL_TEXTENCODING_UTF8)); + vcl::Window *pRoot = aBuilder.get_widget_root(); + Dialog *pRealDialog = dynamic_cast<Dialog*>(pRoot); + + if (!pRealDialog) + pRealDialog = pDialog; + + pRealDialog->SetText("LibreOffice DialogScreenshot"); + pRealDialog->SetStyle(pDialog->GetStyle() | WB_CLOSEABLE); + dumpDialogToPath(*pRealDialog); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |