From eefee24efa59b01d225a18c7eb2caebec4676cbd Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Sun, 22 Oct 2023 00:48:26 +0500 Subject: [PATCH] Test pptx to odp animation audio, refactor tests project --- OdfFile/Test/ExampleFiles/audio.pptx | Bin 0 -> 58286 bytes OdfFile/Test/audio.cpp | 42 +++++++++ OdfFile/Test/audio.h | 28 ++++++ OdfFile/Test/common.cpp | 132 +++++++++++++++++++++++++++ OdfFile/Test/common.h | 59 ++++++++++++ OdfFile/Test/entrance.cpp | 40 ++------ OdfFile/Test/entrance.h | 119 +----------------------- OdfFile/Test/test.cpp | 3 +- OdfFile/Test/test_odf.pro | 4 +- 9 files changed, 278 insertions(+), 149 deletions(-) create mode 100644 OdfFile/Test/ExampleFiles/audio.pptx diff --git a/OdfFile/Test/ExampleFiles/audio.pptx b/OdfFile/Test/ExampleFiles/audio.pptx new file mode 100644 index 0000000000000000000000000000000000000000..9f087eaa8b8e1cfcfb2bb79d69006e5a59f07d6d GIT binary patch literal 58286 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 ODP2OOX_AnimationAudioEnvironment::sInputOdf; boost::shared_ptr ODP2OOX_AnimationAudioEnvironment::sConverionContext; @@ -124,3 +133,36 @@ TEST_F(ODP2OOX_AnimationAudioTest, name) EXPECT_EQ(audio->Name.value(), nameExp); } + +////////////////////////////////////////////////////////////////////////// + +boost::shared_ptr OOX2ODP_AudioAnimationEnvironment::mConverter; +cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_AudioAnimationEnvironment::mContext; + +OOX2ODP_AudioAnimationEnvironment::OOX2ODP_AudioAnimationEnvironment() + : OOX2ODP_AnimationEnvironment(L"audio.pptx", &mConverter, &mContext) +{ +} + +cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_AudioAnimationEnvironment::GetContext() +{ + return mContext; +} + +void OOX2ODP_AudioAnimationTest::SetUp() +{ + mContext = OOX2ODP_AudioAnimationEnvironment::GetContext(); +} + +TEST_F(OOX2ODP_AudioAnimationTest, a_test) +{ + using namespace cpdoccore::odf_writer; + using namespace cpdoccore::odf_types; + + const anim_audio* audio = GetAnimationBehaviourByIndex(GetInnermostPar(GetMainSequenceParByIndex(0)), 1); + ASSERT_NE(audio, nullptr); + + const std::wstring xpathExp = L"Media/media1.wav"; + + EXPECT_EQ(audio->audio_attlist_.xlink_href_.value(), xpathExp); +} \ No newline at end of file diff --git a/OdfFile/Test/audio.h b/OdfFile/Test/audio.h index 20272b8e1d..bc2d42b57f 100644 --- a/OdfFile/Test/audio.h +++ b/OdfFile/Test/audio.h @@ -35,6 +35,14 @@ #include "gtest/gtest.h" +#include "Writer/Converter/Oox2OdfConverter.h" +#include "Writer/Format/odp_conversion_context.h" +#include "Writer/Format/anim_elements.h" +#include "Writer/Format/draw_page.h" + +#include "Reader/Format/odf_document.h" +#include "Reader/Converter/pptx_conversion_context.h" + class ODP2OOX_AnimationAudioEnvironment : public ODP2OOX_AnimationEnvironment { public: @@ -65,3 +73,23 @@ public: public: const cpdoccore::oox::pptx_animation_context* mAnimationContext; }; + +class OOX2ODP_AudioAnimationEnvironment : public OOX2ODP_AnimationEnvironment +{ +public: + OOX2ODP_AudioAnimationEnvironment(); + +public: + static cpdoccore::odf_writer::odp_conversion_context* GetContext(); + +private: + static boost::shared_ptr mConverter; + static cpdoccore::odf_writer::odp_conversion_context* mContext; +}; + +class OOX2ODP_AudioAnimationTest : public OOX2ODP_AnimationTest +{ +public: + void SetUp() override; + void TearDown() override {} +}; \ No newline at end of file diff --git a/OdfFile/Test/common.cpp b/OdfFile/Test/common.cpp index 80277b47ae..42da3e35e8 100644 --- a/OdfFile/Test/common.cpp +++ b/OdfFile/Test/common.cpp @@ -35,6 +35,10 @@ #include "../../OfficeUtils/src/OfficeUtils.h" #include "Reader/Converter/pptx_package.h" +#include "Writer/Converter/Converter.h" +#include "Writer/Converter/PptxConverter.h" +#include "Writer/Format/office_elements.h" + boost::shared_ptr ReadOdfDocument(const std::wstring& from, const std::wstring& temp, const std::wstring& tempUnpackedOdf) { COfficeUtils oCOfficeUtils(NULL); @@ -90,3 +94,131 @@ void ODP2OOX_AnimationEnvironment::TearDown() NSDirectory::DeleteDirectory(sTemp); } +////////////////////////////////////////////////////////////////////////// + +OOX2ODP_AnimationEnvironment::OOX2ODP_AnimationEnvironment(const std::wstring& exampleFilename, boost::shared_ptr* converter, cpdoccore::odf_writer::odp_conversion_context** context) +{ + mExampleFilename = exampleFilename; + mConverter = converter; + mContext = context; +} + +void OOX2ODP_AnimationEnvironment::SetUp() +{ + std::wstring rootDir = NSFile::GetProcessDirectory() + CH_DIR(".."); + std::wstring exampleFilesDirectory = rootDir + CH_DIR("ExampleFiles"); + + mFrom = exampleFilesDirectory + FILE_SEPARATOR_STR + mExampleFilename; + mTemp = mFrom + _T(".tmp"); + mTempUnpackedOox = mTemp + CH_DIR("pptx_unpacked"); + + NSDirectory::CreateDirectory(mTemp); + NSDirectory::CreateDirectory(mTempUnpackedOox); + + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(mFrom, mTempUnpackedOox, NULL, 0)) + { + *mConverter = boost::make_shared(mTempUnpackedOox, _T("presentation"), L"", false, mTemp); + + try + { + (*mConverter)->convert(); + *mContext = dynamic_cast((*mConverter)->get_ooxConverter()->odf_context()); + } + catch (...) + { + _CP_LOG << L"[ error ]: Failed to setup OOX2ODP_EntranceAnimationTestEnvironment"; + } + } +} + +void OOX2ODP_AnimationEnvironment::TearDown() +{ + NSDirectory::DeleteDirectory(mTemp); +} + +const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetTimingRoot() +{ + using namespace cpdoccore::odf_writer; + draw_page* page = dynamic_cast(mContext->current_slide().page_elm_.get()); + if (!page) + return nullptr; + + anim_par* timing_root = dynamic_cast(page->animation_.get()); + if (!timing_root) + return nullptr; + + return timing_root; + +} + +const cpdoccore::odf_writer::anim_seq* OOX2ODP_AnimationTest::GetMainSequence() +{ + using namespace cpdoccore::odf_writer; + const anim_par* timing_root = GetTimingRoot(); + if (!timing_root) + return nullptr; + + if (timing_root->anim_seq_array_.size() < 1) + return nullptr; + + const anim_seq* main_sequence = dynamic_cast(timing_root->anim_seq_array_.at(0).get()); + if (!main_sequence) + return nullptr; + + return main_sequence; +} + +const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetMainSequenceParByIndex(size_t index) +{ + using namespace cpdoccore::odf_writer; + const anim_seq* main_sequence = GetMainSequence(); + + if (index >= main_sequence->anim_par_array_.size()) + return nullptr; + + const anim_par* par = dynamic_cast(main_sequence->anim_par_array_[index].get()); + if (!par) + return nullptr; + + return par; +} + +const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnerPar(const cpdoccore::odf_writer::anim_par* par) +{ + using namespace cpdoccore::odf_writer; + + if (!par) + return nullptr; + + const anim_par* inner_par = dynamic_cast(par->anim_par_.get()); + + if (!inner_par) + return nullptr; + + return inner_par; +} + +const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnermostPar(const cpdoccore::odf_writer::anim_par* par) +{ + using namespace cpdoccore::odf_writer; + + if (!par) + return nullptr; + + const anim_par* innermost = GetInnerPar(par); + + while (innermost->anim_par_) + { + innermost = dynamic_cast(innermost->anim_par_.get()); + if (!innermost) + return nullptr; + } + + return innermost; +} + +const cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_AnimationTest::GetContext() const +{ + return mContext; +} diff --git a/OdfFile/Test/common.h b/OdfFile/Test/common.h index 6244cd0f9a..3a9e967dcd 100644 --- a/OdfFile/Test/common.h +++ b/OdfFile/Test/common.h @@ -36,6 +36,11 @@ #include "Reader/Converter/pptx_conversion_context.h" #include "Reader/Format/odf_document.h" +#include "Writer/Converter/Oox2OdfConverter.h" +#include "Writer/Format/odp_conversion_context.h" +#include "Writer/Format/anim_elements.h" +#include "Writer/Format/draw_page.h" + #include #include @@ -61,4 +66,58 @@ private: boost::shared_ptr* mDocument; boost::shared_ptr* mContext; +}; + +class OOX2ODP_AnimationEnvironment : public testing::Environment +{ +public: + OOX2ODP_AnimationEnvironment(const std::wstring& exampleFilename, + boost::shared_ptr* converter, + cpdoccore::odf_writer::odp_conversion_context** context); + + void SetUp() override; + void TearDown() override; + +private: + std::wstring mExampleFilename; + std::wstring mFrom; + std::wstring mTemp; + std::wstring mTempUnpackedOox; + + boost::shared_ptr* mConverter; + cpdoccore::odf_writer::odp_conversion_context** mContext; +}; + +class OOX2ODP_AnimationTest : public testing::Test +{ +public: + const cpdoccore::odf_writer::anim_par* GetTimingRoot(); + const cpdoccore::odf_writer::anim_seq* GetMainSequence(); + const cpdoccore::odf_writer::anim_par* GetMainSequenceParByIndex(size_t index); + const cpdoccore::odf_writer::anim_par* GetInnerPar(const cpdoccore::odf_writer::anim_par* par); + const cpdoccore::odf_writer::anim_par* GetInnermostPar(const cpdoccore::odf_writer::anim_par* par); + + const cpdoccore::odf_writer::odp_conversion_context* GetContext() const; + + template + const T* GetAnimationBehaviourByIndex(const cpdoccore::odf_writer::anim_par* par, size_t index) + { + using namespace cpdoccore::odf_writer; + + if (!par) + return nullptr; + + if (par->content_.size() <= index) + return nullptr; + + T* behaviour = dynamic_cast(par->content_[index].get()); + if (!behaviour) + return nullptr; + + return behaviour; + } + +protected: + const Oox2Odf::Converter* mConverter; + cpdoccore::odf_writer::odp_conversion_context* mContext; }; \ No newline at end of file diff --git a/OdfFile/Test/entrance.cpp b/OdfFile/Test/entrance.cpp index b4dd9f3e15..2cd06fbed1 100644 --- a/OdfFile/Test/entrance.cpp +++ b/OdfFile/Test/entrance.cpp @@ -642,48 +642,22 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_transition_filter_checker_iris_wi ////////////////////////////////////////////////////////////////////////// // OOX2ODP -boost::shared_ptr OOX2ODP_EntranceAnimationTestEnvironment::mConverter; -cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_EntranceAnimationTestEnvironment::mContext; +boost::shared_ptr OOX2ODP_EntranceAnimationEnvironment::mConverter; +cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_EntranceAnimationEnvironment::mContext; -void OOX2ODP_EntranceAnimationTestEnvironment::SetUp() +OOX2ODP_EntranceAnimationEnvironment::OOX2ODP_EntranceAnimationEnvironment() + : OOX2ODP_AnimationEnvironment(L"entrance.pptx", &mConverter, &mContext) { - sExampleFilename = L"entrance.pptx"; - - std::wstring rootDir = NSFile::GetProcessDirectory() + CH_DIR(".."); - std::wstring sExampleFilesDirectory = rootDir + CH_DIR("ExampleFiles"); - - sFrom = sExampleFilesDirectory + FILE_SEPARATOR_STR + sExampleFilename; - sTemp = rootDir + CH_DIR("OOX2ODP_EntranceAnimationTestEnvironment_tmp"); - sTempUnpackedOox = sTemp + CH_DIR("pptx_unpacked"); - - NSDirectory::CreateDirectory(sTemp); - NSDirectory::CreateDirectory(sTempUnpackedOox); - - COfficeUtils oCOfficeUtils(NULL); - if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedOox, NULL, 0)) - { - mConverter = boost::make_shared(sTempUnpackedOox, _T("presentation"), L"", false, sTemp); - - try - { - mConverter->convert(); - mContext = dynamic_cast(mConverter->get_ooxConverter()->odf_context()); - } - catch (...) - { - _CP_LOG << L"[ error ]: Failed to setup OOX2ODP_EntranceAnimationTestEnvironment"; - } - } } -void OOX2ODP_EntranceAnimationTestEnvironment::TearDown() +cpdoccore::odf_writer::odp_conversion_context* OOX2ODP_EntranceAnimationEnvironment::GetContext() { - NSDirectory::DeleteDirectory(sTemp); + return mContext; } void OOX2ODP_EntranceAnimationTest::SetUp() { - mContext = OOX2ODP_EntranceAnimationTestEnvironment::GetContext(); + mContext = OOX2ODP_EntranceAnimationEnvironment::GetContext(); } TEST_F(OOX2ODP_EntranceAnimationTest, timing_root_node_type) diff --git a/OdfFile/Test/entrance.h b/OdfFile/Test/entrance.h index 452d4f95d2..335b704f2d 100644 --- a/OdfFile/Test/entrance.h +++ b/OdfFile/Test/entrance.h @@ -76,131 +76,22 @@ public: ////////////////////////////////////////////////////////////////////////// // OOX2ODP -class OOX2ODP_EntranceAnimationTestEnvironment : public ::testing::Environment +class OOX2ODP_EntranceAnimationEnvironment : public OOX2ODP_AnimationEnvironment { - ~OOX2ODP_EntranceAnimationTestEnvironment() override {} - - void SetUp() override; - void TearDown() override; +public: + OOX2ODP_EntranceAnimationEnvironment(); public: - static cpdoccore::odf_writer::odp_conversion_context* GetContext() - { - return mContext; - } + static cpdoccore::odf_writer::odp_conversion_context* GetContext(); private: - std::wstring sExampleFilename; - std::wstring sFrom; - std::wstring sTemp; - std::wstring sTempUnpackedOox; - static boost::shared_ptr mConverter; static cpdoccore::odf_writer::odp_conversion_context* mContext; }; -class OOX2ODP_EntranceAnimationTest : public testing::Test +class OOX2ODP_EntranceAnimationTest : public OOX2ODP_AnimationTest { public: void SetUp() override; void TearDown() override {} - - const cpdoccore::odf_writer::anim_par* GetTimingRoot() - { - using namespace cpdoccore::odf_writer; - draw_page* page = dynamic_cast(mContext->current_slide().page_elm_.get()); - if (!page) - return nullptr; - - anim_par* timing_root = dynamic_cast(page->animation_.get()); - if (!timing_root) - return nullptr; - - return timing_root; - } - - const cpdoccore::odf_writer::anim_seq* GetMainSequence() - { - using namespace cpdoccore::odf_writer; - const anim_par* timing_root = GetTimingRoot(); - if (!timing_root) - return nullptr; - - if (timing_root->anim_seq_array_.size() < 1) - return nullptr; - - const anim_seq* main_sequence = dynamic_cast(timing_root->anim_seq_array_.at(0).get()); - if (!main_sequence) - return nullptr; - - return main_sequence; - } - - const cpdoccore::odf_writer::anim_par* GetMainSequenceParByIndex(size_t index) - { - using namespace cpdoccore::odf_writer; - const anim_seq* main_sequence = GetMainSequence(); - - if (index >= main_sequence->anim_par_array_.size()) - return nullptr; - - const anim_par* par = dynamic_cast(main_sequence->anim_par_array_[index].get()); - if (!par) - return nullptr; - - return par; - } - - const cpdoccore::odf_writer::anim_par* GetInnerPar(const cpdoccore::odf_writer::anim_par* par) - { - using namespace cpdoccore::odf_writer; - - if (!par) - return nullptr; - - const anim_par* inner_par = dynamic_cast(par->anim_par_.get()); - - if (!inner_par) - return nullptr; - - return inner_par; - } - - const cpdoccore::odf_writer::anim_par* GetInnermostPar(const cpdoccore::odf_writer::anim_par* par) - { - using namespace cpdoccore::odf_writer; - - if (!par) - return nullptr; - - const anim_par* innermost = GetInnerPar(par); - - while (innermost->anim_par_) - { - innermost = dynamic_cast(innermost->anim_par_.get()); - if (!innermost) - return nullptr; - } - - return innermost; - } - - template - const T* GetAnimationBehaviourByIndex(const cpdoccore::odf_writer::anim_par* par, size_t index) - { - using namespace cpdoccore::odf_writer; - - if (!par) - return nullptr; - - T* behaviour = dynamic_cast(par->content_[index].get()); - if (!behaviour) - return nullptr; - - return behaviour; - } - -public: - const Oox2Odf::Converter* mConverter; - cpdoccore::odf_writer::odp_conversion_context* mContext; }; \ No newline at end of file diff --git a/OdfFile/Test/test.cpp b/OdfFile/Test/test.cpp index 3a6442fdd3..2714ca3717 100644 --- a/OdfFile/Test/test.cpp +++ b/OdfFile/Test/test.cpp @@ -44,7 +44,8 @@ int main(int argc, char* argv[]) ::testing::AddGlobalTestEnvironment(new ODP2OOX_AnimationMotionEnvironment); ::testing::AddGlobalTestEnvironment(new ODP2OOX_AnimationAudioEnvironment); - ::testing::AddGlobalTestEnvironment(new OOX2ODP_EntranceAnimationTestEnvironment); + ::testing::AddGlobalTestEnvironment(new OOX2ODP_EntranceAnimationEnvironment); + ::testing::AddGlobalTestEnvironment(new OOX2ODP_AudioAnimationEnvironment); return RUN_ALL_TESTS(); } \ No newline at end of file diff --git a/OdfFile/Test/test_odf.pro b/OdfFile/Test/test_odf.pro index a81cf0570f..1c8cad1591 100644 --- a/OdfFile/Test/test_odf.pro +++ b/OdfFile/Test/test_odf.pro @@ -53,13 +53,15 @@ core_linux { HEADERS += \ common.h\ entrance.h\ - motion.h + motion.h\ + audio.h SOURCES += \ test.cpp\ common.cpp\ entrance.cpp\ motion.cpp\ + audio.cpp\ $$CORE_ROOT_DIR/Common/OfficeFileFormatChecker2.cpp SOURCES -= $$CORE_GTEST_PATH/src/gtest_main.cc