Kaydet (Commit) b79d1bfc authored tarafından Mike Kaganski's avatar Mike Kaganski Kaydeden (comit) Andras Timar

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: 's avatarMike Kaganski <mike.kaganski@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/71618Tested-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst 3d23b701
...@@ -95,6 +95,7 @@ public: ...@@ -95,6 +95,7 @@ public:
void testTdf124810(); void testTdf124810();
void testTdf124883(); void testTdf124883();
void testTdf125046(); void testTdf125046();
void testTdf125055();
CPPUNIT_TEST_SUITE(ScPivotTableFiltersTest); CPPUNIT_TEST_SUITE(ScPivotTableFiltersTest);
...@@ -144,6 +145,7 @@ public: ...@@ -144,6 +145,7 @@ public:
CPPUNIT_TEST(testTdf124810); CPPUNIT_TEST(testTdf124810);
CPPUNIT_TEST(testTdf124883); CPPUNIT_TEST(testTdf124883);
CPPUNIT_TEST(testTdf125046); CPPUNIT_TEST(testTdf125046);
CPPUNIT_TEST(testTdf125055);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
...@@ -2654,6 +2656,46 @@ void ScPivotTableFiltersTest::testTdf125046() ...@@ -2654,6 +2656,46 @@ void ScPivotTableFiltersTest::testTdf125046()
"longText", "1"); "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_TEST_SUITE_REGISTRATION(ScPivotTableFiltersTest);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
...@@ -194,8 +194,10 @@ namespace { ...@@ -194,8 +194,10 @@ namespace {
*/ */
OUString GetExcelFormattedDate( double fSerialDateTime, SvNumberFormatter& rFormatter ) OUString GetExcelFormattedDate( double fSerialDateTime, SvNumberFormatter& rFormatter )
{ {
//::sax::Converter::convertDateTime(sBuf, (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime(), 0, true); // tdf#125055: properly round the value to seconds when truncating nanoseconds below
css::util::DateTime aUDateTime = (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime(); 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" // We need to reset nanoseconds, to avoid string like: "1982-02-18T16:04:47.999999849"
aUDateTime.NanoSeconds = 0; aUDateTime.NanoSeconds = 0;
OUStringBuffer sBuf; OUStringBuffer sBuf;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment