diff --git a/src/Mod/Spreadsheet/CMakeLists.txt b/src/Mod/Spreadsheet/CMakeLists.txt index 42dea69cc3..212b7d316d 100644 --- a/src/Mod/Spreadsheet/CMakeLists.txt +++ b/src/Mod/Spreadsheet/CMakeLists.txt @@ -8,6 +8,7 @@ set(Spreadsheet_Scripts Init.py TestSpreadsheet.py importXLSX.py + test_importXLSX.py ) if(BUILD_GUI) diff --git a/src/Mod/Spreadsheet/importXLSX.py b/src/Mod/Spreadsheet/importXLSX.py index c59014446b..d7c15cdf9e 100644 --- a/src/Mod/Spreadsheet/importXLSX.py +++ b/src/Mod/Spreadsheet/importXLSX.py @@ -225,7 +225,7 @@ class FormulaTranslator(object): else: # print('There is a branch. look up: ', theExpr[1]) if (lenExpr > 1) and (theExpr[1] in treeDict[branch]): - branch = treeDict[branch][theExpr[0]] + branch = treeDict[branch][theExpr[1]] if branch is None: keyToken = True else: diff --git a/src/Mod/Spreadsheet/test_importXLSX.py b/src/Mod/Spreadsheet/test_importXLSX.py new file mode 100644 index 0000000000..2b4d2ac7af --- /dev/null +++ b/src/Mod/Spreadsheet/test_importXLSX.py @@ -0,0 +1,98 @@ +import unittest +from unittest.mock import patch, MagicMock + +from importXLSX import FormulaTranslator, getText, handleStrings, open + + +class TestFormulaTranslator(unittest.TestCase): + def test_translate_expressions(self): + # With + formulas_and_expressions = [ + ("1=2", "1==2"), + ("ab", "a>b"), + ("1<>2", "1!=2"), + ("a>=b", "a>=b"), + ("a<=b", "a<=b"), + ("a!b", "a.b"), + ("a+b", "a+b"), + ("a-b", "a-b"), + ("a*b", "a*b"), + ("a/b", "a/b"), + ("a^b", "a^b"), + ("c*(a+b)", "c*(a+b)"), + ("IF(a=b, c, d)", "(a==b? c: d)"), + ("ABS(a)", "abs(a)"), + ("ACOS(a)", "pi/180deg*acos(a)"), + ("ASIN(a)", "pi/180deg*asin(a)"), + ("ATAN(a)", "pi/180deg*atan(a)"), + ("ATAN2(a)", "pi/180deg*atan2(a)"), + ("COS(a)", "cos(1rad*(a))"), + ("COSH(a)", "cosh(1rad*(a))"), + ("EXP(a)", "exp(a)"), + ("LOG(n)", "log(n)"), + ("LOG10(n)", "log10(n)"), + ("MOD(n,d)", "mod(n,d)"), + ("POWER(n,p)", "pow(n,p)"), + ("SIN(a)", "sin(1rad*(a))"), + ("SINH(a)", "sinh(1rad*(a))"), + ("SQRT(a)", "sqrt(a)"), + ("TAN(a)", "tan(1rad*(a))"), + ("TANH(a)", "tanh(1rad*(a))"), + ("AVERAGE(a,b,c)", "average(a,b,c)"), + ("COUNT(a,b,c)", "count(a,b,c)"), + ("MAX(a,b,c)", "max(a,b,c)"), + ("MIN(a,b,c)", "min(a,b,c)"), + ("STDEVA(a,b,c)", "stddev(a,b,c)"), + ("SUM(a,b,c)", "sum(a,b,c)"), + ("PI", "pi"), + ("_xlfn.CEILING.MATH(a)", "ceil(a)"), + ("_xlfn.FLOOR.MATH(a)", "floor(a)"), + ] + + # When + result = [] + for formula, _ in formulas_and_expressions: + translator = FormulaTranslator() + result.append(translator.translateForm(formula)) + + # Then + expected = [f"={expression}" for _, expression in formulas_and_expressions] + self.assertListEqual(expected, result) + + def test_translate_multi_character_branching_operators(self): + # With + formulas_and_expressions = [ + ("1<>2", "1!=2"), + ("a>=b", "a>=b"), + ("a<=b", "a<=b"), + ] + + # When + result = [] + for formula, _ in formulas_and_expressions: + translator = FormulaTranslator() + result.append(translator.translateForm(formula)) + + # Then + expected = [f"={expression}" for _, expression in formulas_and_expressions] + self.assertListEqual(expected, result) + + def test_translate_nested_expression(self): + # With + formulas_and_expressions = [ + ( + "IF(a