sc/inc/compiler.hxx | 4 ++-- sc/qa/unit/ucalc.hxx | 2 ++ sc/qa/unit/ucalc_formula.cxx | 36 ++++++++++++++++++++++++++++++++++++ sc/source/core/tool/compiler.cxx | 10 +++++----- 4 files changed, 45 insertions(+), 7 deletions(-)
New commits: commit 5ebd1e7c8746f5060dbc7896bd2074fb1f9d8c71 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Mon Jul 15 19:46:16 2013 -0400 Add test for formula tokenization and back. Change-Id: I770ba842bc7dd0095d1be75cbd9132affb46ed5f diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 4f4a58c..0ab4c68 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -432,8 +432,8 @@ public: const String& GetCorrectedFormula() { return aCorrectedFormula; } // Use convention from this->aPos by default - ScTokenArray* CompileString( const String& rFormula ); - ScTokenArray* CompileString( const String& rFormula, const String& rFormulaNmsp ); + ScTokenArray* CompileString( const OUString& rFormula ); + ScTokenArray* CompileString( const OUString& rFormula, const OUString& rFormulaNmsp ); const ScDocument* GetDoc() const { return pDoc; } const ScAddress& GetPos() const { return aPos; } diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx index 43b10a9..0f0198c 100644 --- a/sc/qa/unit/ucalc.hxx +++ b/sc/qa/unit/ucalc.hxx @@ -83,6 +83,7 @@ public: void testRangeList(); void testInput(); void testFormulaHashAndTag(); + void testFormulaCompiler(); void testFuncSUM(); void testFuncPRODUCT(); void testFuncN(); @@ -267,6 +268,7 @@ public: CPPUNIT_TEST(testRangeList); CPPUNIT_TEST(testInput); CPPUNIT_TEST(testFormulaHashAndTag); + CPPUNIT_TEST(testFormulaCompiler); CPPUNIT_TEST(testFuncSUM); CPPUNIT_TEST(testFuncPRODUCT); CPPUNIT_TEST(testFuncN); diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index 249a5a7..5d1d082 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -11,6 +11,12 @@ #include "markdata.hxx" #include "calcconfig.hxx" #include "interpre.hxx" +#include "compiler.hxx" +#include "tokenarray.hxx" + +#include <boost/scoped_ptr.hpp> + +using namespace formula; void Test::testFormulaHashAndTag() { @@ -103,6 +109,36 @@ void Test::testFormulaHashAndTag() m_pDoc->DeleteTab(0); } +void Test::testFormulaCompiler() +{ + struct { + const char* pInput; FormulaGrammar::Grammar eInputGram; + const char* pOutput; FormulaGrammar::Grammar eOutputGram; + } aTests[] = { + { "=B1-$C2+D$3-$E$4", FormulaGrammar::GRAM_NATIVE, "[.B1]-[.$C2]+[.D$3]-[.$E$4]", FormulaGrammar::GRAM_ODFF }, + }; + + for (size_t i = 0, n = SAL_N_ELEMENTS(aTests); i < n; ++i) + { + boost::scoped_ptr<ScTokenArray> pArray; + { + ScCompiler aComp(m_pDoc, ScAddress()); + aComp.SetGrammar(aTests[i].eInputGram); + pArray.reset(aComp.CompileString(OUString::createFromAscii(aTests[i].pInput))); + CPPUNIT_ASSERT_MESSAGE("Token array shouldn't be NULL!", pArray.get()); + } + + { + ScCompiler aComp(m_pDoc, ScAddress(), *pArray); + aComp.SetGrammar(aTests[i].eOutputGram); + OUStringBuffer aBuf; + aComp.CreateStringFromTokenArray(aBuf); + OUString aFormula = aBuf.makeStringAndClear(); + CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(aTests[i].pOutput), aFormula); + } + } +} + void Test::testFuncSUM() { OUString aTabName("foo"); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 3c64b81..1fd1cf6 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3714,7 +3714,7 @@ public: } -ScTokenArray* ScCompiler::CompileString( const String& rFormula ) +ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) { OSL_ENSURE( meGrammar != FormulaGrammar::GRAM_EXTERNAL, "ScCompiler::CompileString - unexpected grammar GRAM_EXTERNAL" ); if( meGrammar == FormulaGrammar::GRAM_EXTERNAL ) @@ -3755,8 +3755,8 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula ) bool bPODF = FormulaGrammar::isPODF( meGrammar); const size_t nAlloc = 512; FunctionStack aFuncs[ nAlloc ]; - FunctionStack* pFunctionStack = (bPODF && rFormula.Len() > nAlloc ? - new FunctionStack[ rFormula.Len() ] : &aFuncs[0]); + FunctionStack* pFunctionStack = + (bPODF && static_cast<size_t>(rFormula.getLength()) > nAlloc ? new FunctionStack[rFormula.getLength()] : &aFuncs[0]); pFunctionStack[0].eOp = ocNone; pFunctionStack[0].nPar = 0; size_t nFunction = 0; @@ -3935,9 +3935,9 @@ ScTokenArray* ScCompiler::CompileString( const String& rFormula ) } -ScTokenArray* ScCompiler::CompileString( const String& rFormula, const String& rFormulaNmsp ) +ScTokenArray* ScCompiler::CompileString( const OUString& rFormula, const OUString& rFormulaNmsp ) { - OSL_ENSURE( (GetGrammar() == FormulaGrammar::GRAM_EXTERNAL) || (rFormulaNmsp.Len() == 0), + OSL_ENSURE( (GetGrammar() == FormulaGrammar::GRAM_EXTERNAL) || rFormulaNmsp.isEmpty(), "ScCompiler::CompileString - unexpected formula namespace for internal grammar" ); if( GetGrammar() == FormulaGrammar::GRAM_EXTERNAL ) try { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits