summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2019-05-01 07:22:44 +0300
committerAndras Timar <andras.timar@collabora.com>2019-05-03 15:04:36 +0200
commitb79d1bfc8b9db3b53930de231efc766ebdf87cc0 (patch)
treed872e5284d48b3da38837855db26a7ba0d6d5b38
parent3d23b7017526cb133aa045697fba65277078f731 (diff)
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@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/71618 Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r--sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsxbin0 -> 12193 bytes
-rw-r--r--sc/qa/unit/pivottable_filters_test.cxx42
-rw-r--r--sc/source/filter/excel/xepivotxml.cxx6
3 files changed, 46 insertions, 2 deletions
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
--- /dev/null
+++ b/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx
Binary files 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;