summaryrefslogtreecommitdiffstats
path: root/sc/qa/unit/helper/shared_test_impl.hxx
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
commited5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch)
tree7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /sc/qa/unit/helper/shared_test_impl.hxx
parentInitial commit. (diff)
downloadlibreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz
libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sc/qa/unit/helper/shared_test_impl.hxx')
-rw-r--r--sc/qa/unit/helper/shared_test_impl.hxx289
1 files changed, 289 insertions, 0 deletions
diff --git a/sc/qa/unit/helper/shared_test_impl.hxx b/sc/qa/unit/helper/shared_test_impl.hxx
new file mode 100644
index 000000000..60aa4ae41
--- /dev/null
+++ b/sc/qa/unit/helper/shared_test_impl.hxx
@@ -0,0 +1,289 @@
+/* -*- 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/.
+ */
+
+#pragma once
+
+#include <memory>
+#include <colorscale.hxx>
+#include <conditio.hxx>
+#include <document.hxx>
+#include <formulacell.hxx>
+#include "qahelper.hxx"
+#include <formula/errorcodes.hxx>
+
+struct FindCondFormatByEnclosingRange
+{
+ explicit FindCondFormatByEnclosingRange(const ScRange& rRange):
+ mrRange(rRange) {}
+
+ bool operator()(const std::unique_ptr<ScConditionalFormat>& pFormat)
+ {
+ if (pFormat->GetRange().Combine() == mrRange)
+ return true;
+
+ return false;
+ }
+
+private:
+ const ScRange& mrRange;
+};
+
+struct DataBarData
+{
+ ScRange aRange;
+ ScColorScaleEntryType eLowerLimitType;
+ ScColorScaleEntryType eUpperLimitType;
+ databar::ScAxisPosition eAxisPosition;
+};
+
+DataBarData const aData[] = {
+ { ScRange(1,2,0,1,5,0), COLORSCALE_AUTO, COLORSCALE_AUTO, databar::AUTOMATIC },
+ { ScRange(3,2,0,3,5,0), COLORSCALE_MIN, COLORSCALE_MAX, databar::AUTOMATIC },
+ { ScRange(5,2,0,5,5,0), COLORSCALE_PERCENTILE, COLORSCALE_PERCENT, databar::AUTOMATIC },
+ { ScRange(7,2,0,7,5,0), COLORSCALE_VALUE, COLORSCALE_FORMULA, databar::AUTOMATIC },
+ { ScRange(1,9,0,1,12,0), COLORSCALE_AUTO, COLORSCALE_AUTO, databar::MIDDLE }
+};
+
+void testDataBar_Impl(const ScDocument& rDoc)
+{
+ ScConditionalFormatList* pList = rDoc.GetCondFormList(0);
+ CPPUNIT_ASSERT(pList);
+
+ for(size_t i = 0; i < std::size(aData); ++i)
+ {
+ ScConditionalFormatList::const_iterator itr = std::find_if(pList->begin(),
+ pList->end(), FindCondFormatByEnclosingRange(aData[i].aRange));
+ CPPUNIT_ASSERT(itr != pList->end());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), (*itr)->size());
+
+ const ScFormatEntry* pFormatEntry = (*itr)->GetEntry(0);
+ CPPUNIT_ASSERT_EQUAL(ScFormatEntry::Type::Databar, pFormatEntry->GetType());
+ const ScDataBarFormat* pDataBar = static_cast<const ScDataBarFormat*>(pFormatEntry);
+ CPPUNIT_ASSERT(pDataBar);
+ const ScDataBarFormatData* pDataBarData = pDataBar->GetDataBarData();
+ CPPUNIT_ASSERT_EQUAL(aData[i].eLowerLimitType, pDataBarData->mpLowerLimit->GetType());
+ CPPUNIT_ASSERT_EQUAL(aData[i].eUpperLimitType, pDataBarData->mpUpperLimit->GetType());
+
+ CPPUNIT_ASSERT_EQUAL(aData[i].eAxisPosition, pDataBarData->meAxisPosition);
+ }
+}
+
+struct ColorScale2EntryData
+{
+ ScRange aRange;
+ ScColorScaleEntryType eLowerType;
+ ScColorScaleEntryType eUpperType;
+};
+
+ColorScale2EntryData const aData2Entry[] = {
+ { ScRange(1,2,0,1,5,0), COLORSCALE_MIN, COLORSCALE_MAX },
+ { ScRange(3,2,0,3,5,0), COLORSCALE_PERCENTILE, COLORSCALE_PERCENT },
+ { ScRange(5,2,0,5,5,0), COLORSCALE_VALUE, COLORSCALE_FORMULA }
+};
+
+void testColorScale2Entry_Impl(const ScDocument& rDoc)
+{
+ const ScConditionalFormatList* pList = rDoc.GetCondFormList(0);
+ CPPUNIT_ASSERT(pList);
+
+ for(size_t i = 0; i < std::size(aData2Entry); ++i)
+ {
+ ScConditionalFormatList::const_iterator itr = std::find_if(pList->begin(),
+ pList->end(), FindCondFormatByEnclosingRange(aData2Entry[i].aRange));
+ CPPUNIT_ASSERT(itr != pList->end());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), (*itr)->size());
+
+ const ScFormatEntry* pFormatEntry = (*itr)->GetEntry(0);
+ CPPUNIT_ASSERT_EQUAL(ScFormatEntry::Type::Colorscale, pFormatEntry->GetType());
+ const ScColorScaleFormat* pColFormat = static_cast<const ScColorScaleFormat*>(pFormatEntry);
+ CPPUNIT_ASSERT_EQUAL(size_t(2), pColFormat->size());
+
+ ScColorScaleEntries::const_iterator format_itr = pColFormat->begin();
+ CPPUNIT_ASSERT_EQUAL(aData2Entry[i].eLowerType, (*format_itr)->GetType());
+ ++format_itr;
+ CPPUNIT_ASSERT(format_itr != pColFormat->end());
+ CPPUNIT_ASSERT_EQUAL(aData2Entry[i].eUpperType, (*format_itr)->GetType());
+ }
+}
+
+struct ColorScale3EntryData
+{
+ ScRange aRange;
+ ScColorScaleEntryType eLowerType;
+ ScColorScaleEntryType eMiddleType;
+ ScColorScaleEntryType eUpperType;
+};
+
+ColorScale3EntryData const aData3Entry[] = {
+ { ScRange(1,1,1,1,6,1), COLORSCALE_MIN, COLORSCALE_PERCENTILE, COLORSCALE_MAX },
+ { ScRange(3,1,1,3,6,1), COLORSCALE_PERCENTILE, COLORSCALE_VALUE, COLORSCALE_PERCENT },
+ { ScRange(5,1,1,5,6,1), COLORSCALE_VALUE, COLORSCALE_VALUE, COLORSCALE_FORMULA }
+};
+
+void testColorScale3Entry_Impl(const ScDocument& rDoc)
+{
+ ScConditionalFormatList* pList = rDoc.GetCondFormList(1);
+ CPPUNIT_ASSERT(pList);
+
+ for(size_t i = 0; i < std::size(aData3Entry); ++i)
+ {
+ ScConditionalFormatList::const_iterator itr = std::find_if(pList->begin(),
+ pList->end(), FindCondFormatByEnclosingRange(aData3Entry[i].aRange));
+ CPPUNIT_ASSERT(itr != pList->end());
+ CPPUNIT_ASSERT_EQUAL(size_t(1), (*itr)->size());
+
+ const ScFormatEntry* pFormatEntry = (*itr)->GetEntry(0);
+ CPPUNIT_ASSERT_EQUAL(ScFormatEntry::Type::Colorscale, pFormatEntry->GetType());
+ const ScColorScaleFormat* pColFormat = static_cast<const ScColorScaleFormat*>(pFormatEntry);
+ CPPUNIT_ASSERT_EQUAL(size_t(3), pColFormat->size());
+
+ ScColorScaleEntries::const_iterator format_itr = pColFormat->begin();
+ CPPUNIT_ASSERT_EQUAL(aData3Entry[i].eLowerType, (*format_itr)->GetType());
+ ++format_itr;
+ CPPUNIT_ASSERT(format_itr != pColFormat->end());
+ CPPUNIT_ASSERT_EQUAL(aData3Entry[i].eMiddleType, (*format_itr)->GetType());
+ ++format_itr;
+ CPPUNIT_ASSERT(format_itr != pColFormat->end());
+ CPPUNIT_ASSERT_EQUAL(aData3Entry[i].eUpperType, (*format_itr)->GetType());
+ }
+}
+
+void testFunctionsExcel2010_Impl( ScDocument& rDoc )
+{
+ // Original test case document is functions-excel-2010.xlsx
+ // Which test rows to evaluate, 1-based as in UI to ease maintenance.
+ static struct
+ {
+ SCROW nRow;
+ bool bEvaluate;
+ } const aTests[] = {
+ { 2, false }, // name=[ AGGREGATE ], result=0, expected=1
+ { 3, true },
+ { 4, true },
+ { 5, true },
+ { 6, true },
+ { 7, true },
+ { 8, true },
+ { 9, true },
+ { 10, true },
+ { 11, true },
+ { 12, true },
+ { 13, true },
+ { 14, true },
+ { 15, true },
+ { 16, true },
+ { 17, true },
+ { 18, true },
+ { 19, true },
+ { 20, true },
+ { 21, true },
+ { 22, true },
+ { 23, true },
+ { 24, true },
+ { 25, true },
+ { 26, true },
+ { 27, true },
+ { 28, true },
+ { 29, true },
+ { 30, true },
+ { 31, true },
+ { 32, true },
+ { 33, true },
+ { 34, true },
+ { 35, true },
+ { 36, true },
+ { 37, true },
+ { 38, true },
+ { 39, true },
+ { 40, true },
+ { 41, true },
+ { 42, true },
+ { 43, true },
+ { 44, true },
+ { 45, false }, // name=[ NETWORKDAYS.INTL ], result=18, expected=19
+ { 46, true },
+ { 47, true },
+ { 48, true },
+ { 49, true },
+ { 50, true },
+ { 51, true },
+ { 52, true },
+ { 53, true },
+ { 54, true },
+ { 55, true },
+ { 56, true },
+ { 57, true },
+ { 58, true },
+ { 59, true },
+ { 60, true },
+ { 61, true },
+ { 62, true },
+ { 63, true },
+ { 64, true },
+ { 65, true },
+ { 66, true },
+ { 67, true },
+ { 68, true },
+ { 69, true },
+ { 70, true },
+ { 71, true },
+ { 72, true },
+ { 73, true },
+ { 74, true },
+ { 75, true },
+ { 76, true },
+ { 77, true },
+ { 78, true },
+ { 79, false }, // name=[ WORKDAY.INTL ], result=41755 , expected=41754
+ { 80, true }
+ };
+
+ for (size_t i=0; i < std::size(aTests); ++i)
+ {
+ if (aTests[i].bEvaluate)
+ {
+ // Column 0 is description, 1 is formula, 2 is Excel result, 3 is
+ // comparison.
+ SCROW nRow = aTests[i].nRow - 1; // 0-based
+
+ OString aStr = OString::number( aTests[i].nRow) +
+ ", function name=[ " +
+ OUStringToOString( rDoc.GetString( ScAddress( 0, nRow, 0)), RTL_TEXTENCODING_UTF8 ) +
+ " ], result=" +
+ OString::number( rDoc.GetValue( ScAddress( 1, nRow, 0)) ) +
+ ", expected=" +
+ OString::number( rDoc.GetValue( ScAddress( 2, nRow, 0)) );
+
+ ScFormulaCell* pFC = rDoc.GetFormulaCell( ScAddress( 1, nRow, 0) );
+ if ( pFC && pFC->GetErrCode() != FormulaError::NONE )
+ aStr += ", error code =" + OString::number( static_cast<int>(pFC->GetErrCode()) );
+
+ CPPUNIT_ASSERT_MESSAGE( OString( "Expected a formula cell without error at row " +
+ aStr ).getStr(), isFormulaWithoutError( rDoc, ScAddress( 1, nRow, 0)));
+ CPPUNIT_ASSERT_MESSAGE( OString( "Expected a TRUE value at row " +
+ aStr ).getStr(), 0 != rDoc.GetValue( ScAddress( 3, nRow, 0)));
+
+ }
+ }
+}
+
+void testCeilingFloor_Impl( ScDocument& rDoc )
+{
+ // Original test case document is ceiling-floor.xlsx
+ // Sheet1.K1 has =AND(K3:K81) to evaluate all results.
+ static constexpr OUStringLiteral pORef = u"Sheet1.K1";
+ ScAddress aPos;
+ aPos.Parse(pORef, rDoc);
+ ASSERT_FORMULA_EQUAL(rDoc, aPos, "AND(K3:K81)", "Wrong formula.");
+ CPPUNIT_ASSERT_MESSAGE( OUString( pORef + " result is error.").toUtf8().getStr(),
+ isFormulaWithoutError( rDoc, aPos));
+ CPPUNIT_ASSERT_EQUAL(1.0, rDoc.GetValue(aPos));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */