summaryrefslogtreecommitdiffstats
path: root/sc/qa/unit/subsequent_export_test2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/qa/unit/subsequent_export_test2.cxx')
-rw-r--r--sc/qa/unit/subsequent_export_test2.cxx1287
1 files changed, 1287 insertions, 0 deletions
diff --git a/sc/qa/unit/subsequent_export_test2.cxx b/sc/qa/unit/subsequent_export_test2.cxx
new file mode 100644
index 0000000000..9f281928c7
--- /dev/null
+++ b/sc/qa/unit/subsequent_export_test2.cxx
@@ -0,0 +1,1287 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "helper/qahelper.hxx"
+
+#include <docsh.hxx>
+#include <global.hxx>
+#include <dpcache.hxx>
+#include <dpobject.hxx>
+#include <clipparam.hxx>
+
+#include <editeng/editobj.hxx>
+#include <editeng/flditem.hxx>
+#include <comphelper/scopeguard.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <unotools/syslocaleoptions.hxx>
+#include <formula/grammar.hxx>
+#include <svl/numformat.hxx>
+#include <svl/zformat.hxx>
+
+#include <com/sun/star/sheet/XHeaderFooterContent.hpp>
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+class ScExportTest2 : public ScModelTestBase
+{
+public:
+ ScExportTest2();
+};
+
+ScExportTest2::ScExportTest2()
+ : ScModelTestBase("sc/qa/unit/data")
+{
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testGroupShape)
+{
+ createScDoc("xlsx/groupShape.xlsx");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/xdr:wsDr/xdr:twoCellAnchor/xdr:grpSp/xdr:grpSpPr"_ostr);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testMatrixMultiplicationXLSX)
+{
+ createScDoc("xlsx/matrix-multiplication.xlsx");
+
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ OUString CellFormulaRange
+ = getXPath(pDoc, "/x:worksheet/x:sheetData/x:row[4]/x:c/x:f"_ostr, "ref"_ostr);
+
+ // make sure that the CellFormulaRange is G5:G6.
+ CPPUNIT_ASSERT_EQUAL(OUString("G5:G6"), CellFormulaRange);
+
+ OUString CellFormulaType
+ = getXPath(pDoc, "/x:worksheet/x:sheetData/x:row[4]/x:c/x:f"_ostr, "t"_ostr);
+
+ // make sure that the CellFormulaType is array.
+ CPPUNIT_ASSERT_EQUAL(OUString("array"), CellFormulaType);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testRefStringXLSX)
+{
+ createScDoc("xlsx/ref_string.xlsx");
+
+ //make sure ref syntax gets saved for MSO-produced docs
+ saveAndReload("Calc Office Open XML");
+
+ ScDocument* pDoc = getScDoc();
+ ScCalcConfig aCalcConfig = pDoc->GetCalcConfig();
+ CPPUNIT_ASSERT_EQUAL(formula::FormulaGrammar::CONV_XL_A1, aCalcConfig.meStringRefAddressSyntax);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testRefStringConfigXLSX)
+{
+ // this doc is configured with CalcA1 ref syntax
+ createScDoc("xlsx/empty.xlsx");
+
+ saveAndReload("Calc Office Open XML");
+
+ ScDocument* pDoc = getScDoc();
+ ScCalcConfig aConfig = pDoc->GetCalcConfig();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match",
+ formula::FormulaGrammar::CONV_OOO,
+ aConfig.meStringRefAddressSyntax);
+
+ // this doc has no entry for ref syntax
+ createScDoc("xlsx/empty-noconf.xlsx");
+
+ pDoc = getScDoc();
+ aConfig = pDoc->GetCalcConfig();
+ // therefore after import, ref syntax should be set to CalcA1 | ExcelA1
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match",
+ formula::FormulaGrammar::CONV_A1_XL_A1,
+ aConfig.meStringRefAddressSyntax);
+
+ //set ref syntax to something else than ExcelA1 (native to xlsx format) ...
+ aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_R1C1;
+ pDoc->SetCalcConfig(aConfig);
+
+ saveAndReload("Calc Office Open XML");
+
+ // ... and make sure it got saved
+ pDoc = getScDoc();
+ aConfig = pDoc->GetCalcConfig();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match",
+ formula::FormulaGrammar::CONV_XL_R1C1,
+ aConfig.meStringRefAddressSyntax);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testRefStringUnspecified)
+{
+ createScDoc();
+
+ ScDocument* pDoc = getScDoc();
+ ScCalcConfig aConfig = pDoc->GetCalcConfig();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Default string ref syntax value doesn't match",
+ formula::FormulaGrammar::CONV_UNSPECIFIED,
+ aConfig.meStringRefAddressSyntax);
+
+ // change formula syntax (i.e. not string ref syntax) to ExcelA1
+ pDoc->SetGrammar(formula::FormulaGrammar::GRAM_NATIVE_XL_A1);
+
+ saveAndReload("calc8");
+
+ // with string ref syntax at its default value, we should've saved ExcelA1
+ pDoc = getScDoc();
+ aConfig = pDoc->GetCalcConfig();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match",
+ formula::FormulaGrammar::CONV_XL_A1,
+ aConfig.meStringRefAddressSyntax);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testHeaderImageODS)
+{
+ // Graphic as header background was lost on export.
+ createScDoc("ods/header-image.ods");
+ saveAndReload("calc8");
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent,
+ uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies
+ = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xPageStyles(xStyleFamilies->getByName("PageStyles"),
+ uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xStyle(xPageStyles->getByName("Default"), uno::UNO_QUERY);
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xStyle->getPropertyValue("HeaderBackGraphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testHeaderFooterContentODS)
+{
+ createScDoc("ods/header-footer-content.ods");
+ saveAndReload("calc8");
+ uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(mxComponent,
+ uno::UNO_QUERY);
+ uno::Reference<container::XNameAccess> xStyleFamilies
+ = xStyleFamiliesSupplier->getStyleFamilies();
+ uno::Reference<container::XNameAccess> xPageStyles(xStyleFamilies->getByName("PageStyles"),
+ uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xStyle(xPageStyles->getByName("Default"), uno::UNO_QUERY);
+
+ uno::Reference<css::sheet::XHeaderFooterContent> xContent;
+ xStyle->getPropertyValue("RightPageHeaderContent") >>= xContent;
+ CPPUNIT_ASSERT(xContent.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("header"), xContent->getCenterText()->getString());
+
+ xStyle->getPropertyValue("FirstPageHeaderContent") >>= xContent;
+ CPPUNIT_ASSERT(xContent.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("first page header"), xContent->getCenterText()->getString());
+
+ xStyle->getPropertyValue("RightPageFooterContent") >>= xContent;
+ CPPUNIT_ASSERT(xContent.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("footer"), xContent->getCenterText()->getString());
+
+ xStyle->getPropertyValue("FirstPageFooterContent") >>= xContent;
+ // First page footer content used to be lost upon export.
+ CPPUNIT_ASSERT(xContent.is());
+ CPPUNIT_ASSERT_EQUAL(OUString("first page footer"), xContent->getCenterText()->getString());
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTextDirectionXLSX)
+{
+ createScDoc("xlsx/writingMode.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[2]/x:alignment"_ostr, "readingOrder"_ostr,
+ "1"); //LTR
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[3]/x:alignment"_ostr, "readingOrder"_ostr,
+ "2"); //RTL
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf121260)
+{
+ createScDoc("ods/tdf121260.ods");
+
+ ScDocument* pDoc = getScDoc();
+ // change formula syntax (i.e. not string ref syntax) to ExcelA1
+ FormulaGrammarSwitch aFGSwitch(pDoc, formula::FormulaGrammar::GRAM_NATIVE_XL_A1);
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pChart1 = parseExport("xl/charts/chart1.xml");
+ CPPUNIT_ASSERT(pChart1);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: Sheet1!$A$1:$A$2
+ // - Actual : sheet1 $A$1:$A$2
+ assertXPathContent(
+ pChart1, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:val/c:numRef/c:f"_ostr,
+ "Sheet1!$A$1:$A$2");
+ assertXPathContent(
+ pChart1, "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:val/c:numRef/c:f"_ostr,
+ "Sheet1!$B$1:$B$2");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf120168)
+{
+ createScDoc("xlsx/tdf120168.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ // Without the fix in place, this test would have failed with
+ // - Expected: left
+ // - Actual : general
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[2]/x:alignment"_ostr, "horizontal"_ostr,
+ "left");
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[3]/x:alignment"_ostr, "horizontal"_ostr,
+ "right");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf117266)
+{
+ createScDoc("xlsm/tdf117266_macroButton.xlsm");
+
+ save("Calc MS Excel 2007 VBA XML");
+ xmlDocUniquePtr pVmlDrawing = parseExport("xl/drawings/vmlDrawing1.vml");
+
+ OUString sName = getXPath(pVmlDrawing, "/xml/v:shape"_ostr, "id"_ostr);
+ CPPUNIT_ASSERT_EQUAL(OUString("Button 1001"), sName);
+
+ OUString sSpid = getXPath(pVmlDrawing, "/xml/v:shape"_ostr, "spid"_ostr);
+ CPPUNIT_ASSERT(sSpid.startsWith("_x0000_s"));
+
+ assertXPathContent(pVmlDrawing, "/xml/v:shape/v:textbox/div/font"_ostr, "Button 1 \"y\" z");
+ // Why the xx:, I have no idea..., but it certainly doesn't work with just x:.
+ assertXPathContent(pVmlDrawing, "/xml/v:shape//xx:FmlaMacro"_ostr, "Module1.Button1_Click");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf66668)
+{
+ // Would hang on exporting without the fix in place
+ createScDoc("xlsx/tdf66668.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf130108)
+{
+ createScDoc("ods/tdf130108.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:dxfs/x:dxf/x:font/x:b"_ostr, "val"_ostr, "1");
+ assertXPath(pDoc, "/x:styleSheet/x:dxfs/x:dxf/x:font/x:i"_ostr, "val"_ostr, "0");
+ assertXPath(pDoc, "/x:styleSheet/x:dxfs/x:dxf/x:font/x:color"_ostr, "rgb"_ostr, "FFFFFFFF");
+ assertXPath(pDoc, "/x:styleSheet/x:dxfs/x:dxf/x:font/x:sz"_ostr, "val"_ostr, "10");
+ assertXPath(pDoc, "/x:styleSheet/x:dxfs/x:dxf/x:fill/x:patternFill/x:bgColor"_ostr, "rgb"_ostr,
+ "FFCC0000");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf76949)
+{
+ createScDoc("ods/tdf76949.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ assertXPathContent(pSheet, "/x:worksheet/x:sheetData/x:row/x:c/x:f"_ostr,
+ "_xlfn.CHISQ.DIST(1,1,1)");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf107586)
+{
+ createScDoc("xlsx/tdf107586.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ // Without the fix in place, this test would have failed with
+ // XPath '/x:worksheet/x:sheetPr/x:tabColor' number of nodes is incorrect
+ assertXPath(pSheet, "/x:worksheet/x:sheetPr/x:tabColor"_ostr, "rgb"_ostr, "FF9BBB59");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf55417)
+{
+ createScDoc("xlsx/tdf55417.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[1]/x:alignment"_ostr, 1);
+ assertXPath(pDoc, "/x:styleSheet/x:cellXfs/x:xf[2]/x:alignment"_ostr, 1);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf129985)
+{
+ createScDoc("xlsx/tdf129985.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[2]"_ostr, "formatCode"_ostr, "m/d/yyyy");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf73063)
+{
+ createScDoc("xlsx/tdf73063.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[2]"_ostr, "formatCode"_ostr,
+ "[$-1C1A]dddd\", \"d\". \"mmmm\\ yyyy;@");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf95640_ods_to_xlsx)
+{
+ // Roundtripping sort options with user defined list to XLSX
+ createScDoc("ods/tdf95640.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter"_ostr, "ref"_ostr, "A1:B4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr, "ref"_ostr,
+ "A2:A4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr,
+ "customList"_ostr, "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf95640_ods_to_xlsx_with_standard_list)
+{
+ // Roundtripping sort options with user defined list to XLSX
+ createScDoc("ods/tdf95640_standard_list.ods");
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter"_ostr, "ref"_ostr, "A1:B4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr, "ref"_ostr,
+ "A2:A4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr,
+ "customList"_ostr, "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf95640_xlsx_to_xlsx)
+{
+ // XLSX Roundtripping sort options with custom sort list - note
+ // that compared to ODS source documents above, here we _actually_
+ // can use custom lists (beyond the global user defines), like
+ // low, medium, high
+ createScDoc("xlsx/tdf95640.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter"_ostr, "ref"_ostr, "A1:B4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr, "ref"_ostr,
+ "A2:A4");
+
+ assertXPath(pDoc, "//x:worksheet/x:autoFilter/x:sortState/x:sortCondition"_ostr,
+ "customList"_ostr, "Low,Medium,High");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testDateAutofilterXLSX)
+{
+ // XLSX Roundtripping autofilter with date list
+ createScDoc("xlsx/dateAutofilter.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//x:autoFilter"_ostr, "ref"_ostr, "A1:B4");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[1]"_ostr, "day"_ostr,
+ "02");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[1]"_ostr,
+ "month"_ostr, "03");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[1]"_ostr,
+ "year"_ostr, "2017");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[1]"_ostr,
+ "dateTimeGrouping"_ostr, "day");
+
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[2]"_ostr, "day"_ostr,
+ "01");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[2]"_ostr,
+ "month"_ostr, "10");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[2]"_ostr,
+ "year"_ostr, "2014");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:filters/x:dateGroupItem[2]"_ostr,
+ "dateTimeGrouping"_ostr, "day");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testDateAutofilterODS)
+{
+ createScDoc("ods/tdf142231.ods");
+
+ save("calc8");
+ xmlDocUniquePtr pDoc = parseExport("content.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[1]"_ostr,
+ "value"_ostr, "Calc");
+ assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[2]"_ostr,
+ "value"_ostr, "2021-05-04");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testAutofilterColorsODF)
+{
+ createScDoc("ods/autofilter-colors.ods");
+
+ save("calc8");
+ xmlDocUniquePtr pDoc = parseExport("content.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[1]/table:filter/table:filter-and/"
+ "table:filter-condition[1]"_ostr,
+ "value"_ostr, "#e8f2a1");
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[1]/table:filter/table:filter-and/"
+ "table:filter-condition[1][@loext:data-type='background-color']"_ostr);
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[1]/table:filter/table:filter-and/"
+ "table:filter-condition[2]"_ostr,
+ "value"_ostr, "#3465a4");
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[1]/table:filter/"
+ "table:filter-and/table:filter-condition[2][@loext:data-type='text-color']"_ostr);
+
+ // tdf#142965 Check "none" value when automatic text color / no fill was selected
+ assertXPath(pDoc, "//table:database-ranges/table:database-range[2]/table:filter/"
+ "table:filter-and/"
+ "table:filter-condition[1][@loext:data-type='background-color']"_ostr);
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[2]/table:filter/table:filter-and/"
+ "table:filter-condition[1]"_ostr,
+ "value"_ostr, "transparent");
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[3]/table:filter/"
+ "table:filter-and/table:filter-condition[1][@loext:data-type='text-color']"_ostr);
+ assertXPath(pDoc,
+ "//table:database-ranges/table:database-range[3]/table:filter/table:filter-and/"
+ "table:filter-condition[1]"_ostr,
+ "value"_ostr, "window-font-color");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testAutofilterColorsOOXML)
+{
+ {
+ createScDoc("xlsx/autofilter-colors.xlsx");
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pTable1 = parseExport("xl/tables/table1.xml");
+ CPPUNIT_ASSERT(pTable1);
+ sal_Int32 nDxfId
+ = getXPath(pTable1, "/x:table/x:autoFilter/x:filterColumn/x:colorFilter"_ostr,
+ "dxfId"_ostr)
+ .toInt32()
+ + 1;
+
+ xmlDocUniquePtr pStyles = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pStyles);
+ OString sDxfXPath("/x:styleSheet/x:dxfs/x:dxf[" + OString::number(nDxfId)
+ + "]/x:fill/x:patternFill/x:fgColor");
+ assertXPath(pStyles, sDxfXPath, "rgb"_ostr, "FFFFD7D7");
+ }
+
+ {
+ createScDoc("xlsx/autofilter-colors-fg.xlsx");
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pTable1 = parseExport("xl/tables/table1.xml");
+ CPPUNIT_ASSERT(pTable1);
+ sal_Int32 nDxfId
+ = getXPath(pTable1, "/x:table/x:autoFilter/x:filterColumn/x:colorFilter"_ostr,
+ "dxfId"_ostr)
+ .toInt32()
+ + 1;
+
+ xmlDocUniquePtr pStyles = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pStyles);
+ OString sDxfXPath("/x:styleSheet/x:dxfs/x:dxf[" + OString::number(nDxfId)
+ + "]/x:fill/x:patternFill/x:fgColor");
+ assertXPath(pStyles, sDxfXPath, "rgb"_ostr, "FF3465A4");
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testAutofilterTop10XLSX)
+{
+ createScDoc("xlsx/tdf143068_top10filter.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn"_ostr, "colId"_ostr, "0");
+ assertXPath(pDoc, "//x:autoFilter/x:filterColumn/x:top10"_ostr, "val"_ostr, "4");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf88657ODS)
+{
+ createScDoc("ods/tdf88657.ods");
+
+ save("calc8");
+ xmlDocUniquePtr pDoc = parseExport("styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//number:fraction"_ostr, "min-denominator-digits"_ostr, "3");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf41722)
+{
+ createScDoc("xlsx/tdf41722.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//x:conditionalFormatting/x:cfRule[1]"_ostr, "operator"_ostr,
+ "containsText");
+ assertXPath(pDoc, "//x:conditionalFormatting/x:cfRule[2]"_ostr, "operator"_ostr,
+ "containsText");
+ assertXPath(pDoc, "//x:conditionalFormatting/x:cfRule[3]"_ostr, "operator"_ostr,
+ "containsText");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf113621)
+{
+ createScDoc("xlsx/tdf113621.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//x:conditionalFormatting"_ostr, "sqref"_ostr, "A1:A1048576");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testEscapeCharInNumberFormatXLSX)
+{
+ createScDoc("xlsx/tdf81939.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[2]"_ostr, "formatCode"_ostr,
+ "00\\ 00\\ 00\\ 00\\ 00");
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[3]"_ostr, "formatCode"_ostr,
+ "00\\.00\\.00\\.000\\.0"); // tdf#81939
+ // "_-* #,##0\ _€_-;\-* #,##0\ _€_-;_-* "- "_€_-;_-@_-" // tdf#81222
+ OUString rFormatStrExpected(u"_-* #,##0\\ _€_-;\\-* #,##0\\ _€_-;_-* \"- \"_€_-;_-@_-"_ustr);
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[4]"_ostr, "formatCode"_ostr,
+ rFormatStrExpected);
+ // "_-* #,##0" €"_-;\-* #,##0" €"_-;_-* "- €"_-;_-@_-");
+ rFormatStrExpected = u"_-* #,##0\" €\"_-;\\-* #,##0\" €\"_-;_-* \"- €\"_-;_-@_-"_ustr;
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[5]"_ostr, "formatCode"_ostr,
+ rFormatStrExpected);
+ // remove escape char in fraction
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[6]"_ostr, "formatCode"_ostr,
+ "# ?/?;[RED]\\-# #/#####");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testNatNumInNumberFormatXLSX)
+{
+ createScDoc("ods/tdf79398_NatNum5.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "/x:styleSheet/x:numFmts/x:numFmt[3]"_ostr, "formatCode"_ostr,
+ "[DBNum2][$-804]General;[RED][DBNum2][$-804]General");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testExponentWithoutSignFormatXLSX)
+{
+ createScDoc("ods/tdf102370_ExponentWithoutSign.ods");
+ saveAndReload("Calc Office Open XML");
+
+ saveAndReload("calc8");
+
+ ScDocument* pDoc = getScDoc();
+ sal_uInt32 nNumberFormat = pDoc->GetNumberFormat(0, 0, 0);
+ const SvNumberformat* pNumberFormat = pDoc->GetFormatTable()->GetEntry(nNumberFormat);
+ const OUString& rFormatStr = pNumberFormat->GetFormatstring();
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number format lost exponent without sign during Excel export",
+ OUString("0.00E0"), rFormatStr);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testExtendedLCIDXLSX)
+{
+ createScDoc("ods/tdf36038_ExtendedLCID.ods");
+
+ saveAndReload("Calc Office Open XML");
+ xmlDocUniquePtr pDocXml = parseExport("xl/styles.xml");
+ CPPUNIT_ASSERT(pDocXml);
+ // Check export
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[2]"_ostr, "formatCode"_ostr,
+ "[$-107041E]dd\\-mm\\-yyyy");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[3]"_ostr, "formatCode"_ostr,
+ "[$-D07041E]dd\\-mm\\-yyyy");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[4]"_ostr, "formatCode"_ostr,
+ "[$-1030411]dd\\-mm\\-ee");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[5]"_ostr, "formatCode"_ostr,
+ "[$-1B030411]dd\\-mm\\-ee");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[6]"_ostr, "formatCode"_ostr,
+ "[$-108040D]dd\\-mm\\-yyyy");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[7]"_ostr, "formatCode"_ostr,
+ "[$-108040D]dd\\-mm\\-yyyy");
+ assertXPath(pDocXml, "/x:styleSheet/x:numFmts/x:numFmt[8]"_ostr, "formatCode"_ostr,
+ "[$-1060401]dd\\-mm\\-yyyy");
+
+ // Check import
+ ScDocument* pDoc = getScDoc();
+ SvNumberFormatter* pNumFormatter = pDoc->GetFormatTable();
+ const OUString aLang[5] = { "[$-41E]", "[$-411]", "[$-40D]", "[$-401]", "[$-500]" };
+ const OUString aCalendar[5] = { "[~buddhist]DD-MM-YYYY", "DD-MM-EE", "[~jewish]DD-MM-YYYY",
+ "[~hijri]DD-MM-YYYY", "[~dangi]YYYY/MM/DD" };
+ // Note: ja-JP Gengou calendar is an implicit secondary (non-gregorian)
+ // calendar, the explicit [~gengou] calendar modifier does not need to be
+ // present, the E and EE keywords are used instead of YY and YYYY.
+ for (sal_Int16 nCol = 1; nCol <= 2; nCol++)
+ {
+ for (sal_Int16 nRow = 1; nRow <= 4; nRow++)
+ {
+ sal_uInt32 nNumberFormat = pDoc->GetNumberFormat(nCol, nRow, 0);
+ const SvNumberformat* pNumberFormat = pNumFormatter->GetEntry(nNumberFormat);
+ const OUString& rFormatStr = pNumberFormat->GetFormatstring();
+ const OUString aExpectedFormatStr
+ = aLang[nRow - 1] + ((nCol == 2 && nRow != 3) ? OUString("[NatNum1]") : OUString())
+ + aCalendar[nRow - 1];
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Number format lost extended LCID during Excel export",
+ aExpectedFormatStr, rFormatStr);
+ }
+ }
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testHiddenRepeatedRowsODS)
+{
+ createScDoc();
+
+ {
+ ScDocument* pDoc = getScDoc();
+ pDoc->SetRowHidden(0, 20, 0, true);
+ }
+
+ saveAndReload("calc8");
+ ScDocument* pDoc = getScDoc();
+ SCROW nFirstRow = 0;
+ SCROW nLastRow = 0;
+ bool bHidden = pDoc->RowHidden(0, 0, &nFirstRow, &nLastRow);
+ CPPUNIT_ASSERT(bHidden);
+ CPPUNIT_ASSERT_EQUAL(SCROW(0), nFirstRow);
+ CPPUNIT_ASSERT_EQUAL(SCROW(20), nLastRow);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testHyperlinkTargetFrameODS)
+{
+ createScDoc("ods/hyperlink_frame.ods");
+
+ ScDocument* pDoc = getScDoc();
+ const EditTextObject* pEditText = pDoc->GetEditText(ScAddress(2, 5, 0));
+ CPPUNIT_ASSERT(pEditText);
+
+ const SvxFieldData* pData = pEditText->GetFieldData(0, 0, text::textfield::Type::URL);
+ CPPUNIT_ASSERT_MESSAGE("Failed to get the URL data.", pData);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to get the URL data.", text::textfield::Type::URL,
+ pData->GetClassId());
+
+ const SvxURLField* pURLData = static_cast<const SvxURLField*>(pData);
+ OUString aTargetFrame = pURLData->GetTargetFrame();
+ CPPUNIT_ASSERT_EQUAL(OUString("_blank"), aTargetFrame);
+
+ save("calc8");
+ xmlDocUniquePtr pDocXml = parseExport("content.xml");
+ CPPUNIT_ASSERT(pDocXml);
+ OUString aTargetFrameExport
+ = getXPath(pDocXml,
+ "/office:document-content/office:body/office:spreadsheet/table:table/"
+ "table:table-row[2]/table:table-cell[2]/text:p/text:a"_ostr,
+ "target-frame-name"_ostr);
+ CPPUNIT_ASSERT_EQUAL(OUString("_blank"), aTargetFrameExport);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testOpenDocumentAsReadOnly)
+{
+ uno::Sequence<beans::PropertyValue> aParams = { comphelper::makePropertyValue("Silent", true) };
+
+ loadWithParams(createFileURL(u"xlsx/open-as-read-only.xlsx"), aParams);
+ ScDocShell* pDocSh = getScDocShell();
+ CPPUNIT_ASSERT(pDocSh->IsSecurityOptOpenReadOnly());
+
+ saveWithParams(uno::Sequence<beans::PropertyValue>());
+ loadWithParams(maTempFile.GetURL(), aParams);
+
+ pDocSh = getScDocShell();
+ CPPUNIT_ASSERT(pDocSh->IsSecurityOptOpenReadOnly());
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testKeepSettingsOfBlankRows)
+{
+ createScDoc("xlsx/tdf41425.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ // saved blank row with not default setting in A2
+ assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row"_ostr, 2);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf133595)
+{
+ createScDoc("xlsx/tdf133595.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ // without the fix in place, mc:AlternateContent would have been added to sheet1
+ assertXPath(pSheet, "/x:worksheet/mc:AlternateContent"_ostr, 0);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf134769)
+{
+ createScDoc("xlsx/tdf134769.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ // without the fix in place, the legacyDrawing would have been exported after the checkbox
+ // and Excel would have claimed the document is corrupted
+ // Use their ids to check the order
+ assertXPath(pSheet, "/x:worksheet/x:drawing"_ostr, "id"_ostr, "rId2");
+ assertXPath(pSheet, "/x:worksheet/x:legacyDrawing"_ostr, "id"_ostr, "rId3");
+ assertXPath(pSheet,
+ "/x:worksheet/mc:AlternateContent/mc:Choice/x:controls/mc:AlternateContent/"
+ "mc:Choice/x:control"_ostr,
+ "id"_ostr, "rId4");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf106181)
+{
+ createScDoc("ods/tdf106181.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ assertXPath(pSheet,
+ "/x:worksheet/mc:AlternateContent/mc:Choice/x:controls/mc:AlternateContent/"
+ "mc:Choice/x:control"_ostr,
+ "name"_ostr, "Check Box");
+ assertXPath(pSheet,
+ "/x:worksheet/mc:AlternateContent/mc:Choice/x:controls/mc:AlternateContent/"
+ "mc:Choice/x:control/x:controlPr"_ostr,
+ "altText"_ostr, "Check Box 1");
+
+ xmlDocUniquePtr pDrawing = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDrawing);
+
+ assertXPath(
+ pDrawing,
+ "/xdr:wsDr/mc:AlternateContent/mc:Choice/xdr:twoCellAnchor/xdr:sp/xdr:nvSpPr/xdr:cNvPr"_ostr,
+ "name"_ostr, "Check Box 1");
+ assertXPath(
+ pDrawing,
+ "/xdr:wsDr/mc:AlternateContent/mc:Choice/xdr:twoCellAnchor/xdr:sp/xdr:nvSpPr/xdr:cNvPr"_ostr,
+ "descr"_ostr, "Check Box");
+ assertXPath(
+ pDrawing,
+ "/xdr:wsDr/mc:AlternateContent/mc:Choice/xdr:twoCellAnchor/xdr:sp/xdr:nvSpPr/xdr:cNvPr"_ostr,
+ "hidden"_ostr, "0");
+
+ xmlDocUniquePtr pVmlDrawing = parseExport("xl/drawings/vmlDrawing1.vml");
+ CPPUNIT_ASSERT(pVmlDrawing);
+ assertXPathContent(pVmlDrawing, "//xx:ClientData/xx:FmlaLink"_ostr, "$D$9");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf145057)
+{
+ createScDoc("xlsx/tdf145057.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/tables/table1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//x:colorFilter"_ostr, "dxfId"_ostr, "1");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf105272)
+{
+ createScDoc("xlsx/tdf105272.xlsx");
+ saveAndReload("Calc Office Open XML");
+ ScDocument* pDoc = getScDoc();
+ //without the fix in place,it would fail
+ //Expected: Table1[[#This Row],[Total]]/Table1[[#This Row],['# Athletes]]
+ //Actual : table1[[#this row],[total]]/table1[[#this row],['# athletes]]
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ "Wrong formula", OUString("=Table1[[#This Row],[Total]]/Table1[[#This Row],['# Athletes]]"),
+ pDoc->GetFormula(7, 3, 0));
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf118990)
+{
+ createScDoc("xlsx/tdf118990.xlsx");
+ saveAndReload("Calc Office Open XML");
+ ScDocument* pDoc = getScDoc();
+
+ // TODO: also test A1, which contains a UNC reference to \\localhost\share\lookupsource.xlsx,
+ // but currently looses "localhost" part when normalized in INetURLObject, becoming
+ // file:///share/lookupsource.xlsx - which is incorrect, since it points to local filesystem
+ // and not to Windows network share.
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ "Wrong Windows share (using host IP) URL in A2",
+ OUString("=VLOOKUP(B1,'file://192.168.1.1/share/lookupsource.xlsx'#$Sheet1.A1:B5,2)"),
+ pDoc->GetFormula(0, 1, 0));
+
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ "Wrong Windows share (using hostname) URL in A3",
+ OUString("=VLOOKUP(B1,'file://NETWORKHOST/share/lookupsource.xlsx'#$Sheet1.A1:B5,2)"),
+ pDoc->GetFormula(0, 2, 0));
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf121612)
+{
+ createScDoc("ods/tdf121612.ods");
+ saveAndReload("Calc Office Open XML");
+
+ ScDocument* pDoc = getScDoc();
+
+ // There should be a pivot table
+ CPPUNIT_ASSERT(pDoc->HasPivotTable());
+
+ // DP collection is not lost after export and has one entry
+ ScDPCollection* pDPColl = pDoc->GetDPCollection();
+ CPPUNIT_ASSERT(pDPColl);
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pDPColl->GetCount());
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf112936)
+{
+ createScDoc("xlsx/tdf112936.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/pivotCache/pivotCacheDefinition1.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ assertXPath(pDoc, "//x:pivotCacheDefinition"_ostr, "recordCount"_ostr, "4");
+ assertXPath(pDoc, "//x:pivotCacheDefinition"_ostr, "createdVersion"_ostr, "3");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testXltxExport)
+{
+ // Create new document
+ createScDoc();
+
+ // Export as template and check content type
+ save("Calc MS Excel 2007 XML Template");
+ xmlDocUniquePtr pDoc = parseExport("[Content_Types].xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/ContentType:Types/ContentType:Override[@PartName='/xl/workbook.xml']"_ostr,
+ "ContentType"_ostr,
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testPivotCacheAfterExportXLSX)
+{
+ createScDoc("ods/numgroup_example.ods");
+
+ // export only
+ save("Calc Office Open XML");
+
+ ScDocument* pDoc = getScDoc();
+ CPPUNIT_ASSERT(pDoc->HasPivotTable());
+
+ // Two pivot tables
+ ScDPCollection* pDPColl = pDoc->GetDPCollection();
+ CPPUNIT_ASSERT(pDPColl);
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pDPColl->GetCount());
+
+ // One cache
+ ScDPCollection::SheetCaches& rSheetCaches = pDPColl->GetSheetCaches();
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rSheetCaches.size());
+ const ScDPCache* pCache = rSheetCaches.getExistingCache(ScRange(0, 0, 0, 3, 30, 0));
+ CPPUNIT_ASSERT_MESSAGE("Pivot cache is expected for A1:D31 on the first sheet.", pCache);
+
+ // See if XLSX export didn't damage group info of the 1st pivot table
+ const ScDPNumGroupInfo* pInfo = pCache->GetNumGroupInfo(1);
+ CPPUNIT_ASSERT_MESSAGE("No number group info :(", pInfo);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf114969XLSX)
+{
+ createScDoc("ods/sheet_name_with_dots.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/x:worksheet/x:hyperlinks/x:hyperlink[1]"_ostr, "location"_ostr,
+ "'1.1.1.1'!C1");
+ assertXPath(pDoc, "/x:worksheet/x:hyperlinks/x:hyperlink[2]"_ostr, "location"_ostr,
+ "'1.1.1.1'!C2");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf115192XLSX)
+{
+ createScDoc("xlsx/test_115192.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/drawings/_rels/drawing1.xml.rels");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "TargetMode"_ostr,
+ "External");
+ assertXPathNoAttribute(pDoc, "/rels:Relationships/rels:Relationship[@Id='rId2']"_ostr,
+ "TargetMode"_ostr);
+ assertXPath(pDoc, "/rels:Relationships/rels:Relationship[@Id='rId3']"_ostr, "TargetMode"_ostr,
+ "External");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf142764)
+{
+ createScDoc("ods/tdf142764.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pSheet = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+
+ assertXPath(pSheet, "/x:worksheet/x:headerFooter"_ostr, "differentOddEven"_ostr, "true");
+ assertXPath(pSheet, "/x:worksheet/x:headerFooter"_ostr, "differentFirst"_ostr, "true");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf91634XLSX)
+{
+ createScDoc("xlsx/image_hyperlink.xlsx");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/xdr:wsDr/xdr:twoCellAnchor/xdr:pic/xdr:nvPicPr/xdr:cNvPr/a:hlinkClick"_ostr,
+ 1);
+
+ xmlDocUniquePtr pXmlRels = parseExport("xl/drawings/_rels/drawing1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr,
+ "https://www.google.com/");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr,
+ "TargetMode"_ostr, "External");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testValidationCopyPaste)
+{
+ createScDoc("ods/validation-copypaste.ods");
+ ScDocument* pDoc = getScDoc();
+
+ // Copy B1 from src doc to clip
+ ScDocument aClipDoc(SCDOCMODE_CLIP);
+ ScRange aSrcRange(1, 0, 1);
+ ScClipParam aClipParam(aSrcRange, false);
+ ScMarkData aMark(pDoc->GetSheetLimits());
+ aMark.SetMarkArea(aSrcRange);
+ pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
+
+ // Create second document, paste B1 from clip
+ createScDoc();
+ pDoc = getScDoc();
+ ScRange aDstRange(1, 0, 0);
+ ScMarkData aMark2(pDoc->GetSheetLimits());
+ aMark2.SetMarkArea(aDstRange);
+ pDoc->CopyFromClip(aDstRange, aMark2, InsertDeleteFlags::ALL, nullptr, &aClipDoc);
+
+ // save as XLSX
+ save("Calc Office Open XML");
+
+ // check validation
+ xmlDocUniquePtr pDocXml = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDocXml);
+ assertXPathContent(pDocXml, "/x:worksheet/x:dataValidations/x:dataValidation/x:formula1"_ostr,
+ "#REF!");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf115159)
+{
+ createScDoc("xlsx/tdf115159.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/workbook.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ //assert the existing OOXML built-in name is not duplicated
+ assertXPath(pDoc, "/x:workbook/x:definedNames/x:definedName"_ostr, 1);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf112567)
+{
+ // Set the system locale to Hungarian (a language with different range separator)
+ SvtSysLocaleOptions aOptions;
+ OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47();
+ aOptions.SetLocaleConfigString("hu-HU");
+ aOptions.Commit();
+ comphelper::ScopeGuard g([&aOptions, &sLocaleConfigString] {
+ aOptions.SetLocaleConfigString(sLocaleConfigString);
+ aOptions.Commit();
+ });
+
+ createScDoc("xlsx/tdf112567.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/workbook.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ //assert the existing OOXML built-in name is not duplicated
+ assertXPath(pDoc, "/x:workbook/x:definedNames/x:definedName"_ostr, 1);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf75702)
+{
+ // The problem was that line breaks were not imported.
+ constexpr OUString sA1(u"line1\nline2"_ustr);
+
+ createScDoc("ods/tdf75702_textLineBreak.ods");
+ ScDocument* pDoc = getScDoc();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("load a1", sA1, pDoc->GetString(0, 0, 0));
+
+ saveAndReload("calc8");
+ pDoc = getScDoc();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("reload a1", sA1, pDoc->GetString(0, 0, 0));
+
+ save("calc8");
+ xmlDocUniquePtr pContent = parseExport("content.xml");
+ assertXPath(pContent, "//table:table-row[1]/table:table-cell/text:p"_ostr, 2);
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf103829)
+{
+ // The problem was that tabspaces were not imported or exported at all.
+ // These strings match the current implementations of CELLTYPE_EDIT and CELLTYPE_STRING.
+ constexpr OUString sA1(u"\x001Leading tab\nTHREE tabs inside: [\x001\x001\x001]"_ustr);
+ constexpr OUString sA2(u"\tLeading tab. THREE tabs inside: [\t\t\t]"_ustr);
+
+ createScDoc("ods/tdf103829_textTab.ods");
+ ScDocument* pDoc = getScDoc();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("load a1", sA1, pDoc->GetString(0, 0, 0));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("load a2", sA2, pDoc->GetString(0, 1, 0));
+
+ saveAndReload("calc8");
+ pDoc = getScDoc();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("reload a1", sA1, pDoc->GetString(0, 0, 0));
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("reload a2", sA2, pDoc->GetString(0, 1, 0));
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf122191)
+{
+ // Set the system locale to Hungarian
+ SvtSysLocaleOptions aOptions;
+ OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47();
+ aOptions.SetLocaleConfigString("hu-HU");
+ aOptions.Commit();
+ comphelper::ScopeGuard g([&aOptions, &sLocaleConfigString] {
+ aOptions.SetLocaleConfigString(sLocaleConfigString);
+ aOptions.Commit();
+ });
+
+ createScDoc("xlsx/tdf122191.xlsx");
+
+ ScDocument* pDoc = getScDoc();
+ CPPUNIT_ASSERT_EQUAL(OUString("IGAZ"), pDoc->GetString(0, 0, 0));
+
+ saveAndReload("Calc Office Open XML");
+
+ pDoc = getScDoc();
+ // Without the fix in place, this test would have failed with
+ // - Expected: IGAZ
+ // - Actual : BOOL00AN
+ CPPUNIT_ASSERT_EQUAL(OUString("IGAZ"), pDoc->GetString(0, 0, 0));
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf142881)
+{
+ createScDoc("xlsx/tdf142881.xlsx");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDrawing1 = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDrawing1);
+
+ // Verify that the shapes are rotated and positioned in the expected way
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:from/xdr:col"_ostr, "11");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:from/xdr:row"_ostr, "0");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:to/xdr:col"_ostr, "12");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:to/xdr:row"_ostr, "19");
+
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:from/xdr:col"_ostr, "2");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:from/xdr:row"_ostr, "8");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:to/xdr:col"_ostr, "7");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:to/xdr:row"_ostr, "10");
+
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:from/xdr:col"_ostr, "10");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:from/xdr:row"_ostr, "9");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:to/xdr:col"_ostr, "11");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:to/xdr:row"_ostr, "26");
+
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:from/xdr:col"_ostr, "2");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:from/xdr:row"_ostr, "17");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:to/xdr:col"_ostr, "8");
+ assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:to/xdr:row"_ostr, "19");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf112567b)
+{
+ // Set the system locale to Hungarian (a language with different range separator)
+ SvtSysLocaleOptions aOptions;
+ OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47();
+ aOptions.SetLocaleConfigString("hu-HU");
+ aOptions.Commit();
+ comphelper::ScopeGuard g([&aOptions, &sLocaleConfigString] {
+ aOptions.SetLocaleConfigString(sLocaleConfigString);
+ aOptions.Commit();
+ });
+
+ createScDoc("ods/tdf112567.ods");
+
+ save("Calc Office Open XML");
+ xmlDocUniquePtr pDoc = parseExport("xl/workbook.xml");
+ CPPUNIT_ASSERT(pDoc);
+
+ //assert the existing OOXML built-in name is not duplicated
+ assertXPath(pDoc, "/x:workbook/x:definedNames/x:definedName"_ostr, 1);
+
+ //and it contains "," instead of ";"
+ assertXPathContent(pDoc, "/x:workbook/x:definedNames/x:definedName[1]"_ostr,
+ "Sheet1!$A:$A,Sheet1!$1:$1");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf123645XLSX)
+{
+ createScDoc("xlsx/chart_hyperlink.xlsx");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc,
+ "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr/"
+ "a:hlinkClick"_ostr,
+ 1);
+ assertXPath(pDoc,
+ "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr/"
+ "a:hlinkClick"_ostr,
+ 1);
+ assertXPath(pDoc,
+ "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:graphicFrame/xdr:nvGraphicFramePr/xdr:cNvPr/"
+ "a:hlinkClick"_ostr,
+ 1);
+
+ xmlDocUniquePtr pXmlRels = parseExport("xl/drawings/_rels/drawing1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr,
+ "TargetMode"_ostr, "External");
+ assertXPathNoAttribute(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId3']"_ostr,
+ "TargetMode"_ostr);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId5']"_ostr,
+ "TargetMode"_ostr, "External");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr,
+ "file:///C:/TEMP/test.xlsx");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId3']"_ostr, "Target"_ostr,
+ "#Sheet2!A1");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId5']"_ostr, "Target"_ostr,
+ "https://bugs.documentfoundation.org/show_bug.cgi?id=123645");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf125173XLSX)
+{
+ createScDoc("ods/text_box_hyperlink.ods");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/drawings/drawing1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/xdr:wsDr/xdr:twoCellAnchor/xdr:sp/xdr:nvSpPr/xdr:cNvPr/a:hlinkClick"_ostr,
+ 1);
+
+ xmlDocUniquePtr pXmlRels = parseExport("xl/drawings/_rels/drawing1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr,
+ "http://www.google.com/");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr,
+ "TargetMode"_ostr, "External");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf79972XLSX)
+{
+ createScDoc("xlsx/tdf79972.xlsx");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/x:worksheet/x:hyperlinks/x:hyperlink"_ostr, "ref"_ostr, "A1");
+
+ xmlDocUniquePtr pXmlRels = parseExport("xl/worksheets/_rels/sheet1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship"_ostr, "Target"_ostr,
+ "https://bugs.documentfoundation.org/show_bug.cgi?id=79972");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship"_ostr, "TargetMode"_ostr,
+ "External");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf126024XLSX)
+{
+ createScDoc("xlsx/hyperlink_formula.xlsx");
+ save("Calc Office Open XML");
+
+ xmlDocUniquePtr pDoc = parseExport("xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pDoc);
+ assertXPath(pDoc, "/x:worksheet/x:hyperlinks/x:hyperlink"_ostr, "ref"_ostr, "A2");
+
+ xmlDocUniquePtr pXmlRels = parseExport("xl/worksheets/_rels/sheet1.xml.rels");
+ CPPUNIT_ASSERT(pXmlRels);
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship"_ostr, "Target"_ostr,
+ "https://bugs.documentfoundation.org/");
+ assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship"_ostr, "TargetMode"_ostr,
+ "External");
+}
+
+CPPUNIT_TEST_FIXTURE(ScExportTest2, testTdf91332)
+{
+ createScDoc("xlsx/tdf91332.xlsx");
+ saveAndReload("Calc Office Open XML");
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDoc(mxComponent, uno::UNO_QUERY_THROW);
+ uno::Reference<drawing::XDrawPage> xPage(xDoc->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY_THROW);
+ uno::Reference<beans::XPropertySet> xShapeProps(xPage->getByIndex(0), uno::UNO_QUERY_THROW);
+
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: rgba[90cf47ff]
+ // - Actual : rgba[ffffffff]
+ // i.e. fill color inherited from theme lost after export.
+ Color nColor;
+ xShapeProps->getPropertyValue("FillColor") >>= nColor;
+ CPPUNIT_ASSERT_EQUAL(Color(0x90cf47), nColor);
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */