tdf#147089 - Round Integral Division (IDIV) literals to Integer values

Change-Id: Ia243c6117a437d0c6efb33a4e76c5e9ee539fbdc
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130302
Tested-by: Jenkins
Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
(cherry picked from commit 3ba8b56b32c203326b776b940d20b16eb2340835)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130315
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/basic/qa/basic_coverage/test_tdf147089_idiv.bas b/basic/qa/basic_coverage/test_tdf147089_idiv.bas
new file mode 100644
index 0000000..3d5e227
--- /dev/null
+++ b/basic/qa/basic_coverage/test_tdf147089_idiv.bas
@@ -0,0 +1,30 @@
'

' 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/.

'



Option Explicit


Function doUnitTest() As String

    TestUtil.TestInit

    verify_testIDiv

    doUnitTest = TestUtil.GetResult()

End Function


Sub verify_testIDiv
    On Error GoTo errorHandler



    ' tdf#147089 - IDIV operands are rounded to Integer values before the operation is performed

    TestUtil.AssertEqual(8.4 \ 2, 4, "8.4 \ 2")

    TestUtil.AssertEqual(9.9 \ 2, 5, "9.9 \ 2")

    TestUtil.AssertEqual(20 \ 4.9, 4, "20 \ 4.9")

    TestUtil.AssertEqual(20 \ 4.4, 5, "20 \ 4.4")

    TestUtil.AssertEqual(16.4 \ 5.9, 2, "16.4 \ 5.9")



    Exit Sub
errorHandler:
    TestUtil.ReportErrorHandler("verify_testIDiv", Err, Error$, Erl)
End Sub
diff --git a/basic/qa/cppunit/test_vba.cxx b/basic/qa/cppunit/test_vba.cxx
index 818ba1c..7cb6455 100644
--- a/basic/qa/cppunit/test_vba.cxx
+++ b/basic/qa/cppunit/test_vba.cxx
@@ -134,6 +134,7 @@ void VBATest::testMiscVBAFunctions()
        "string.vb",
        "strreverse.vb",
        "switch.vb",
        "tdf147089_idiv.vb",
        "timeserial.vb",
        "timevalue.vb",
        "trim.vb",
diff --git a/basic/qa/vba_tests/tdf147089_idiv.vb b/basic/qa/vba_tests/tdf147089_idiv.vb
new file mode 100644
index 0000000..515f1e0
--- /dev/null
+++ b/basic/qa/vba_tests/tdf147089_idiv.vb
@@ -0,0 +1,31 @@
'

' 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/.

'



Option VBASupport 1

Option Explicit


Function doUnitTest() As String

    TestUtil.TestInit

    verify_testIDiv

    doUnitTest = TestUtil.GetResult()

End Function


Sub verify_testIDiv
    On Error GoTo errorHandler



    ' tdf#147089 - IDIV operands are rounded to Integer values before the operation is performed

    TestUtil.AssertEqual(8.4 \ 2, 4, "8.4 \ 2")

    TestUtil.AssertEqual(9.9 \ 2, 5, "9.9 \ 2")

    TestUtil.AssertEqual(20 \ 4.9, 4, "20 \ 4.9")

    TestUtil.AssertEqual(20 \ 4.4, 5, "20 \ 4.4")

    TestUtil.AssertEqual(16.4 \ 5.9, 2, "16.4 \ 5.9")



    Exit Sub
errorHandler:
    TestUtil.ReportErrorHandler("verify_testIDiv", Err, Error$, Erl)
End Sub
diff --git a/basic/source/comp/exprnode.cxx b/basic/source/comp/exprnode.cxx
index 17bdbca..a5fd8dd 100644
--- a/basic/source/comp/exprnode.cxx
+++ b/basic/source/comp/exprnode.cxx
@@ -296,8 +296,8 @@ void SbiExprNode::FoldConstantsBinaryNode(SbiParser* pParser)
    {
        double nl = pLeft->nVal;
        double nr = pRight->nVal;
        // tdf#141201 - round MOD literals to Integer values
        if (eTok == MOD)
        // tdf#141201, tdf#147089 - round MOD/IDIV literals to Integer values
        if (eTok == MOD || eTok == IDIV)
        {
            nl = rtl::math::round(nl);
            nr = rtl::math::round(nr);