sw/qa/extras/README | 19 ++++++++++ sw/qa/extras/ooxmlexport/data/fdo79817.docx |binary sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 35 +++++++++++++------- sw/source/filter/ww8/docxattributeoutput.cxx | 2 + writerfilter/source/dmapper/DomainMapper.cxx | 12 +++++- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 15 ++------ writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 + 8 files changed, 61 insertions(+), 25 deletions(-)
New commits: commit 033f59dad003333d449fec8b8eccf8674ee59d8e Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Jul 16 11:27:33 2014 +0200 sw/qa/extras/README: document how to run a single test This was already documented in the code, but first it got copy&pasted several times, then now it's "hidden" in a header, so not so easy to find. Change-Id: I6c6814a14bb6208d9f31ee66f0c0f9b843ee7157 diff --git a/sw/qa/extras/README b/sw/qa/extras/README index fbc6aac..1959f68 100644 --- a/sw/qa/extras/README +++ b/sw/qa/extras/README @@ -128,6 +128,25 @@ uno::Reference<beans::XPropertySet> xStyle(getStyles("PageStyles")->getByName(DE CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xStyle, "IsLandscape")); ---- +== CppUnit tips + +=== sal_Bool + +In case an UNO method returns sal_Bool, and the assert fails, CppUnit won't be +able to print a usable error message, as it will think that the value is a +printable character. Best to use `bool` for the expected value and cast the +actual value to `bool` as well before comparing. + +=== Running only a single test + +If you want to run only a single test to allow quick development iteration, +then you need to do two things: + +- change the `#if 1` in `inc/swmodeltestbase.hxx` to `#if 0` to define the test + macro with the `_ONLY` suffix +- change the used macro for the test you want to run, i.e. + `DECLARE_OOXMLEXPORT_TEST` -> `DECLARE_OOXMLEXPORT_TEST_ONLY` + == UNO, in more details, various tips: === writing code based xray inspection: commit b2bc4ea8ddae6b01f344469d988e21fed3143c42 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Jul 16 10:46:38 2014 +0200 DOCX import: handle SDT around citation field There were two problems here: 1) Citation field was around a run, but was exported as around the paragraph. 2) The SDT properties were discarded, as they were inserted into a character context that was thrown away. To fix this, add a (character properties) context to the field state, so when it's inserted, it can have the requested properties. Change-Id: Ic36deff616060f049147874633c6c7264ae8ecf2 diff --git a/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx b/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx new file mode 100644 index 0000000..cd97f93 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 646bf57..0e69a54 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2903,7 +2903,7 @@ DECLARE_OOXMLEXPORT_TEST(test_FieldType, "99_Fields.docx") // Checking for three field types (BIBLIOGRAPHY, BIDIOUTLINE, CITATION) in sequence assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:p[2]/w:r[2]/w:instrText[1]",1); assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:p[5]/w:r[2]/w:instrText[1]",1); - assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:sdt/w:sdtContent/w:p/w:r[2]/w:instrText[1]",1); + assertXPath(pXmlDoc, "/w:document[1]/w:body[1]/w:p/w:sdt/w:sdtContent/w:r[2]/w:instrText[1]",1); } DECLARE_OOXMLEXPORT_TEST(testComboBoxControl, "combobox-control.docx") @@ -3002,8 +3002,8 @@ DECLARE_OOXMLEXPORT_TEST(testCitation,"FDO74775.docx") xmlDocPtr pXmlDoc = parseExport(); if (!pXmlDoc) return; - assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[1]/w:r[3]/w:instrText", " CITATION Kra06 \\l 1033 "); - assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[1]/w:r[5]/w:t", "(Kramer & Chen, 2006)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:sdt/w:sdtContent/w:r[2]/w:instrText", " CITATION Kra06 \\l 1033 "); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:sdt/w:sdtContent/w:r[4]/w:t", "(Kramer & Chen, 2006)"); } DECLARE_OOXMLEXPORT_TEST(testFdo76016, "fdo76016.docx") @@ -3101,11 +3101,11 @@ DECLARE_OOXMLEXPORT_TEST(testSimpleSdts, "simple-sdts.docx") if (!pXmlDoc) return; - assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:text", 1); - assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:id", 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:sdt/w:sdtPr/w:text", 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:sdt/w:sdtPr/w:id", 1); assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:picture", 1); assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:group", 1); - assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:citation", 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:citation", 1); } @@ -3799,6 +3799,17 @@ DECLARE_OOXMLEXPORT_TEST(testfdo81031, "fdo81031.docx") CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(148), xBitmap->getSize().Height ); } +DECLARE_OOXMLEXPORT_TEST(testSdtCitationRun, "sdt-citation-run.docx") +{ + // The problem was that the SDT was around the whole paragraph, not only around the citation field. + if (xmlDocPtr pXmlDoc = parseExport()) + { + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[1]/w:t", "Before sdt."); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:instrText", " CITATION BBC11 \\l 1033 "); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:t", "After sdt."); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 30179bb..92e4a96 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -7828,6 +7828,8 @@ void DocxAttributeOutput::CharGrabBag( const SfxGrabBagItem& rItem ) else if (aPropertyValue.Name == "ooxml:CT_SdtPr_id" && m_nRunSdtPrToken == 0) // only write id token as a marker if no other exist m_nRunSdtPrToken = FSNS( XML_w, XML_id ); + else if (aPropertyValue.Name == "ooxml:CT_SdtPr_citation") + m_nRunSdtPrToken = FSNS( XML_w, XML_citation ); } } else diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 4804131..df682c7 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2799,10 +2799,18 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) if(m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_checkbox") || m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_text") || m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_dataBinding") || + m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_citation") || (m_pImpl->m_pSdtHelper->containedInInteropGrabBag("ooxml:CT_SdtPr_id") && m_pImpl->m_pSdtHelper->getInteropGrabBagSize() == 1)) - m_pImpl->GetTopContextOfType(CONTEXT_CHARACTER)->Insert(PROP_SDTPR, - uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, CHAR_GRAB_BAG); + { + PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_CHARACTER); + + if (m_pImpl->IsOpenField()) + // We have a field, insert the SDT properties to the field's grab-bag, so they won't be lost. + pContext = m_pImpl->GetTopFieldContext()->getProperties(); + + pContext->Insert(PROP_SDTPR, uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, CHAR_GRAB_BAG); + } else m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH)->Insert(PROP_SDTPR, uno::makeAny(m_pImpl->m_pSdtHelper->getInteropGrabBagAndClear()), true, PARA_GRAB_BAG); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 9983b99..d3c5d75 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -2486,6 +2486,7 @@ FieldContext::FieldContext(uno::Reference< text::XTextRange > xStart) : m_bFieldCommandCompleted( false ) ,m_xStartRange( xStart ) { + m_pProperties.reset(new PropertyMap()); } @@ -3838,17 +3839,9 @@ void DomainMapper_Impl::CloseFieldCommand() uno::makeAny(aValues)); } uno::Reference< text::XTextContent > xToInsert( xTC, uno::UNO_QUERY ); - uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend; - if (xTextAppend.is()) - { - uno::Reference< text::XTextCursor > xCrsr = xTextAppend->getText()->createTextCursor(); - uno::Reference< text::XText > xText = xTextAppend->getText(); - if(xCrsr.is() && xText.is()) - { - xCrsr->gotoEnd(false); - xText->insertTextContent(uno::Reference< text::XTextRange >( xCrsr, uno::UNO_QUERY_THROW ), xToInsert, sal_False); - } - } + + uno::Sequence<beans::PropertyValue> aValues = m_aFieldStack.top()->getProperties()->GetPropertyValues(); + appendTextContent(xToInsert, aValues); m_bSetCitation = true; } break; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 60c8c65..f374ede 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -132,6 +132,8 @@ class FieldContext OUString m_sHyperlinkURL; FFDataHandler::Pointer_t m_pFFDataHandler; FormControlHelper::Pointer_t m_pFormControlHelper; + /// (Character) properties of the field itself. + PropertyMapPtr m_pProperties; public: FieldContext(::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xStart); @@ -169,6 +171,7 @@ public: void setFormControlHelper(FormControlHelper::Pointer_t pFormControlHelper) { m_pFormControlHelper = pFormControlHelper; } FormControlHelper::Pointer_t getFormControlHelper() const { return m_pFormControlHelper; } + PropertyMapPtr getProperties() { return m_pProperties; } ::std::vector<OUString> GetCommandParts() const; }; commit 1fcbc55b284463a3613849caa43c2e9c82aced1c Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Wed Jul 16 10:30:43 2014 +0200 CppunitTest_sw_ooxmlexport: clean up testfdo79817 Instead of checking the third paragraph, remove everything else from the bugdoc, so checking the only paragraph is enough. Change-Id: I74e8db16cb1f27370ac88d9dff136aaeceb63cdb diff --git a/sw/qa/extras/ooxmlexport/data/fdo79817.docx b/sw/qa/extras/ooxmlexport/data/fdo79817.docx index 4194c43..7e948c5 100644 Binary files a/sw/qa/extras/ooxmlexport/data/fdo79817.docx and b/sw/qa/extras/ooxmlexport/data/fdo79817.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 7dd37a2..646bf57 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -3561,13 +3561,13 @@ DECLARE_OOXMLEXPORT_TEST(testFDO79915, "fdo79915.docx") assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[8]/w:t", "How much buoyancy does the water provide?"); } -DECLARE_OOXMLEXPORT_TEST(testfdo79817,"fdo79817.docx") +DECLARE_OOXMLEXPORT_TEST(testfdo79817, "fdo79817.docx") { - xmlDocPtr pXmlDoc = parseExport("word/document.xml"); - if (!pXmlDoc) - return; - assertXPath ( pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:dataBinding", "storeItemID","{9222E47B-A68B-4AEB-9855-21C912B9D3D2}"); - assertXPath ( pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:dataBinding", "xpath","/ns0:properties[1]/documentManagement[1]/ns2:Responsible_x0020_Officer_x0020_Title[1]"); + if (xmlDocPtr pXmlDoc = parseExport("word/document.xml")) + { + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:dataBinding", "storeItemID", "{9222E47B-A68B-4AEB-9855-21C912B9D3D2}"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:dataBinding", "xpath", "/ns0:properties[1]/documentManagement[1]/ns2:Responsible_x0020_Officer_x0020_Title[1]"); + } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits