1
0
Fork 0
libreoffice/sc/qa/unit/helper/qahelper.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

204 lines
7.4 KiB
C++

/* -*- 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 <docsh.hxx>
#include <address.hxx>
#include <cppunit/SourceLine.h>
#include <test/unoapixml_test.hxx>
#include <test/bootstrapfixture.hxx>
#include <comphelper/documentconstants.hxx>
#include <comphelper/fileformat.h>
#include <formula/grammar.hxx>
#include "scqahelperdllapi.h"
#include <string>
#include <string_view>
#include <sstream>
#include <undoblk.hxx>
#include <sal/types.h>
#include <memory>
#include <tuple>
enum class StringType { PureString, StringValue };
#define CHECK_OPTIMAL 0x1
class SdrOle2Obj;
class ScRangeList;
class ScTokenArray;
// data format for row height tests
struct TestParam
{
struct RowData
{
SCROW nStartRow;
SCROW nEndRow;
SCTAB nTab;
int nExpectedHeight; // -1 for default height
int nCheck; // currently only CHECK_OPTIMAL ( we could add CHECK_MANUAL etc.)
bool bOptimal;
};
const std::u16string_view sTestDoc;
const OUString sExportType; // empty for import test, otherwise this is an export test
int nRowData;
RowData const * pData;
};
struct RangeNameDef
{
const char* mpName;
const char* mpExpr;
sal_uInt16 mnIndex;
};
// Printers for the calc data structures. Needed for the EQUAL assertion
// macros from CPPUNIT.
SCQAHELPER_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const ScAddress& rAddr);
SCQAHELPER_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const ScRange& rRange);
SCQAHELPER_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const ScRangeList& rList);
SCQAHELPER_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const OpCode& rCode);
SCQAHELPER_DLLPUBLIC bool checkOutput(
const ScDocument* pDoc, const ScRange& aOutRange,
const std::vector<std::vector<const char*>>& aCheck, const char* pCaption );
inline std::string print(const ScAddress& rAddr)
{
std::ostringstream str;
str << "Col: " << rAddr.Col();
str << " Row: " << rAddr.Row();
str << " Tab: " << rAddr.Tab();
return str.str();
}
/**
* Temporarily set formula grammar.
*/
class SCQAHELPER_DLLPUBLIC FormulaGrammarSwitch
{
ScDocument* mpDoc;
formula::FormulaGrammar::Grammar meOldGrammar;
public:
FormulaGrammarSwitch(ScDocument* pDoc, formula::FormulaGrammar::Grammar eGrammar);
~FormulaGrammarSwitch();
};
class SCQAHELPER_DLLPUBLIC ScUcalcTestBase : public test::BootstrapFixture
{
public:
virtual void setUp() override;
virtual void tearDown() override;
ScRange insertRangeData(ScDocument* pDoc, const ScAddress& rPos,
const std::vector<std::vector<const char*>>& rData);
void copyToClip(ScDocument* pSrcDoc, const ScRange& rRange, ScDocument* pClipDoc);
void pasteFromClip(ScDocument* pDestDoc, const ScRange& rDestRange,
ScDocument* pClipDoc);
ScUndoPaste* createUndoPaste(ScDocShell& rDocSh, const ScRange& rRange,
ScDocumentUniquePtr pUndoDoc);
void pasteOneCellFromClip(ScDocument* pDestDoc, const ScRange& rDestRange,
ScDocument* pClipDoc,
InsertDeleteFlags eFlags = InsertDeleteFlags::ALL);
void setCalcAsShown(ScDocument* pDoc, bool bCalcAsShown);
ScDocShell* findLoadedDocShellByName(std::u16string_view rName);
ScUndoCut* cutToClip(ScDocShell& rDocSh, const ScRange& rRange, ScDocument* pClipDoc,
bool bCreateUndo);
bool insertRangeNames(ScDocument* pDoc, ScRangeName* pNames, const RangeNameDef* p,
const RangeNameDef* pEnd);
OUString getRangeByName(ScDocument* pDoc, const OUString& aRangeName);
void printFormula(ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab,
const char* pCaption = nullptr);
void printRange(ScDocument* pDoc, const ScRange& rRange, const char* pCaption,
const bool printFormula = false);
void printRange(ScDocument* pDoc, const ScRange& rRange,
const OString& rCaption, const bool printFormula = false);
void clearRange(ScDocument* pDoc, const ScRange& rRange);
void clearSheet(ScDocument* pDoc, SCTAB nTab);
bool checkFormulaPosition(ScDocument& rDoc, const ScAddress& rPos);
bool checkFormulaPositions(
ScDocument& rDoc, SCTAB nTab, SCCOL nCol, const SCROW* pRows, size_t nRowCount);
std::unique_ptr<ScTokenArray> compileFormula(
ScDocument* pDoc, const OUString& rFormula,
formula::FormulaGrammar::Grammar eGram = formula::FormulaGrammar::GRAM_NATIVE );
void clearFormulaCellChangedFlag( ScDocument& rDoc, const ScRange& rRange );
protected:
ScDocShellRef m_xDocShell;
ScDocument* m_pDoc;
};
class SCQAHELPER_DLLPUBLIC ScModelTestBase : public UnoApiXmlTest
{
public:
ScModelTestBase(const OUString& path)
: UnoApiXmlTest(path)
{
}
void createScDoc(const char* pName = nullptr, const char* pPassword = nullptr, bool bCheckErrorCode = true);
ScDocument* getScDoc();
ScDocument* getScDoc2();
ScDocShell* getScDocShell();
ScTabViewShell* getViewShell();
void miscRowHeightsTest( TestParam const * aTestValues, unsigned int numElems);
void enableOpenCL();
void disableOpenCL();
void initTestEnv(std::u16string_view fileName);
void testFile(const OUString& aFileName, ScDocument& rDoc, SCTAB nTab, StringType aStringFormat = StringType::StringValue);
//need own handler because conditional formatting strings must be generated
void testCondFile(const OUString& aFileName, ScDocument* pDoc, SCTAB nTab, bool bCommaAsDelimiter = true);
const SdrOle2Obj* getSingleOleObject(ScDocument& rDoc, sal_uInt16 nPage);
const SdrOle2Obj* getSingleChartObject(ScDocument& rDoc, sal_uInt16 nPage);
ScRangeList getChartRanges(ScDocument& rDoc, const SdrOle2Obj& rChartObj);
void testFormats(ScDocument* pDoc,std::u16string_view sFormat);
void goToCell(const OUString& rCell);
void typeString(std::u16string_view rStr);
void insertStringToCell(const OUString& rCell, std::u16string_view rStr);
void insertArrayToCell(const OUString& rCell, std::u16string_view rStr);
void insertNewSheet(ScDocument& rDoc);
void executeAutoSum();
private:
// Why is this here and not in osl, and using the already existing file
// handling APIs? Do we really want to add arbitrary new file handling
// wrappers here and there (and then having to handle the Android (and
// eventually perhaps iOS) special cases here, too)? Please move this to osl,
// it sure looks generally useful. Or am I missing something?
void loadFile(const OUString& aFileName, std::string& aContent);
};
#define ASSERT_DOUBLES_EQUAL( expected, result ) \
CPPUNIT_ASSERT_DOUBLES_EQUAL( (expected), (result), 1e-14 )
#define ASSERT_DOUBLES_EQUAL_MESSAGE( message, expected, result ) \
CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( (message), (expected), (result), 1e-14 )
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */