[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - sc/qa sc/source

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Wed May 1 08:23:51 UTC 2019


 sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx |binary
 sc/qa/unit/pivottable_filters_test.cxx             |   42 +++++++++++++++++++++
 sc/source/filter/excel/xepivotxml.cxx              |    6 ++-
 3 files changed, 46 insertions(+), 2 deletions(-)

New commits:
commit 4fa1bdfad1ccf3bb61ff0d505278402f3f1a2afe
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Wed May 1 07:22:44 2019 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Wed May 1 10:23:17 2019 +0200

    tdf#125055: properly round fractions of seconds
    
    ... so that 2017-07-10T09:11:02.999999... becomes 2017-07-10T09:11:03,
    not 2017-07-10T09:11:02. The latter created duplicated items in pivot
    table cache previously.
    
    TODO: check what to do if the times are actually different by 100 ns?
    What Excel does then? Should we increase cache item precision?
    
    Change-Id: I622d1c784ee9fddf6b387bec2d8af87bae5668ba
    Reviewed-on: https://gerrit.libreoffice.org/71610
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/71618
    Tested-by: Mike Kaganski <mike.kaganski at collabora.com>

diff --git a/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx b/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx
new file mode 100644
index 000000000000..de8906cf94ca
Binary files /dev/null and b/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx differ
diff --git a/sc/qa/unit/pivottable_filters_test.cxx b/sc/qa/unit/pivottable_filters_test.cxx
index 100a8143facb..065ad71b4e55 100644
--- a/sc/qa/unit/pivottable_filters_test.cxx
+++ b/sc/qa/unit/pivottable_filters_test.cxx
@@ -95,6 +95,7 @@ public:
     void testTdf124810();
     void testTdf124883();
     void testTdf125046();
+    void testTdf125055();
 
     CPPUNIT_TEST_SUITE(ScPivotTableFiltersTest);
 
@@ -144,6 +145,7 @@ public:
     CPPUNIT_TEST(testTdf124810);
     CPPUNIT_TEST(testTdf124883);
     CPPUNIT_TEST(testTdf125046);
+    CPPUNIT_TEST(testTdf125055);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -2654,6 +2656,46 @@ void ScPivotTableFiltersTest::testTdf125046()
                 "longText", "1");
 }
 
+void ScPivotTableFiltersTest::testTdf125055()
+{
+    ScDocShellRef xDocSh = loadDoc("pivottable_1s_difference.", FORMAT_XLSX);
+    CPPUNIT_ASSERT(xDocSh.is());
+
+    std::shared_ptr<utl::TempFile> pXPathFile
+        = ScBootstrapFixture::exportTo(xDocSh.get(), FORMAT_XLSX);
+    xDocSh->DoClose();
+
+    xmlDocPtr pDoc = XPathHelper::parseExport(pXPathFile, m_xSFactory,
+                                              "xl/pivotCache/pivotCacheDefinition1.xml");
+    CPPUNIT_ASSERT(pDoc);
+
+    // 1-second precision should not result in duplicated entries for values different by ~1 s.
+    // Previously truncating nanoseconds in GetExcelFormattedDate converted
+    // "2017-07-10T09:11:02.99999..." into "2017-07-10T09:11:02", creating two identical strings
+    // Only compare times here: see comment to ScPivotTableFiltersTest::testPivotCacheExportXLSX
+    // "TODO Date generator in tests are one day higher, than during standard xlsx export"
+    OUString sISODateTime = getXPath(
+        pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "minDate");
+    CPPUNIT_ASSERT_EQUAL(OUString("T09:11:02"), sISODateTime.copy(10));
+    sISODateTime = getXPath(
+        pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "maxDate");
+    CPPUNIT_ASSERT_EQUAL(OUString("T09:11:03"), sISODateTime.copy(10));
+    assertXPath(pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems",
+                "count", "3");
+    assertXPathChildren(pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems",
+                        3); // 2 different values + empty
+    sISODateTime = getXPath(
+        pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems/x:d[1]", "v");
+    CPPUNIT_ASSERT_EQUAL(OUString("T09:11:02"), sISODateTime.copy(10));
+    sISODateTime = getXPath(
+        pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems/x:d[2]", "v");
+    CPPUNIT_ASSERT_EQUAL(OUString("T09:11:03"), sISODateTime.copy(10));
+    // Trailing empty
+    CPPUNIT_ASSERT_EQUAL(
+        2, getXPathPosition(
+               pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "m"));
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(ScPivotTableFiltersTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/filter/excel/xepivotxml.cxx b/sc/source/filter/excel/xepivotxml.cxx
index fb174ef849f9..e0a6bc84870c 100644
--- a/sc/source/filter/excel/xepivotxml.cxx
+++ b/sc/source/filter/excel/xepivotxml.cxx
@@ -194,8 +194,10 @@ namespace {
  */
 OUString GetExcelFormattedDate( double fSerialDateTime, SvNumberFormatter& rFormatter )
 {
-    //::sax::Converter::convertDateTime(sBuf, (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime(), 0, true);
-    css::util::DateTime aUDateTime = (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime();
+    // tdf#125055: properly round the value to seconds when truncating nanoseconds below
+    constexpr double fHalfSecond = 1 / 86400.0 * 0.5;
+    css::util::DateTime aUDateTime
+        = (DateTime(rFormatter.GetNullDate()) + fSerialDateTime + fHalfSecond).GetUNODateTime();
     // We need to reset nanoseconds, to avoid string like: "1982-02-18T16:04:47.999999849"
     aUDateTime.NanoSeconds = 0;
     OUStringBuffer sBuf;


More information about the Libreoffice-commits mailing list