basic/qa/basic_coverage/test_split_method.vb |   63 +++++++++++++++++++++++----
 basic/qa/cppunit/test_vba.cxx                |    1 
 basic/qa/vba_tests/split.vb                  |   57 ++++++++++++++++++++++++
 basic/source/runtime/methods1.cxx            |    6 ++
 4 files changed, 118 insertions(+), 9 deletions(-)

New commits:
commit 74aef3f0af59008aa9390bad0b24f8fce0632c87
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Tue Oct 5 21:10:22 2021 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Mon Oct 11 16:21:45 2021 +0200

    tdf#144924 - Change return type of array elements of the split function
    
    If VBA is not enabled, allow the assignment of variables with different
    data types to the individual array elements created by the split
    function.
    
    Change-Id: I7bdd432cdebbfded5f7fb3acc0216474eb6b6821
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123122
    Tested-by: Andreas Heinisch <andreas.heini...@yahoo.de>
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123373
    Tested-by: Jenkins

diff --git a/basic/qa/basic_coverage/test_split_method.vb 
b/basic/qa/basic_coverage/test_split_method.vb
index 8f3701e3d987..5570850c7b97 100644
--- a/basic/qa/basic_coverage/test_split_method.vb
+++ b/basic/qa/basic_coverage/test_split_method.vb
@@ -5,28 +5,73 @@
 ' file, You can obtain one at http://mozilla.org/MPL/2.0/.
 '
 
-Function doUnitTest as Integer
+Dim passCount As Integer
+Dim failCount As Integer
+Dim result As String
 
-    doUnitTest = 0
+Function doUnitTest() As String
+    result = verify_testSplit()
+    If failCount <> 0 Or passCount = 0 Then
+        doUnitTest = 0
+    Else
+        doUnitTest = 1
+    End If
+End Function
+
+Function verify_testSplit() As String
+
+    passCount = 0
+    failCount = 0
+
+    result = "Test Results" & Chr$(10) & "============" & Chr$(10)
 
     ' SPLIT
-    If ( Split( "Hello world" )(1) <> "world" ) Then Exit Function
+    TestLog_ASSERT Split( "Hello world" )(1), "world", "Split( ""Hello world"" 
)(1)"
 
     ' tdf#123025 - split function sets the datatype of the array to empty,
     ' preventing any subsequent assignments of values to the array and to the 
elements itself.
     Dim arr(1) As String
     arr = Split("a/b", "/")
-    If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
+    TestLog_ASSERT arr(0), "a", "Split(""a/b"", ""/"")(0)"
+    TestLog_ASSERT arr(1), "b", "Split(""a/b"", ""/"")(1)"
     ReDim Preserve arr(1)
-    If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
+    TestLog_ASSERT arr(0), "a", "ReDim Preserve arr(1)(0)"
+    TestLog_ASSERT arr(1), "b", "ReDim Preserve arr(1)(1)"
     ReDim arr(1)
-    If ( arr(0) <> "" Or arr(1) <> "" ) Then Exit Function
+    TestLog_ASSERT arr(0), "", "ReDim arr(1)(0)"
+    TestLog_ASSERT arr(1), "", "ReDim arr(1)(1)"
+
     arr(0) = "a"
     arr(1) = "b"
-    If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
+    TestLog_ASSERT arr(0), "a", "arr(0)"
+    TestLog_ASSERT arr(1), "b", "arr(1)"
     ReDim Preserve arr(1)
-    If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function
+    TestLog_ASSERT arr(0), "a", "ReDim Preserve arr(1)(0) after assignment"
+    TestLog_ASSERT arr(1), "b", "ReDim Preserve arr(1)(1) after assignment"
+
+    ' tdf#144924 - allow the assignment of different data types to the 
individual elements
+    Dim splitArr
+    splitArr = Split("a/b&&c/d", "&&")
+    Dim i As Integer
+    For i = 0 To UBound(splitArr)
+        ' Without the fix in place, this assignment would have failed
+        splitArr(i) = Split(splitArr(i), "/")
+        ' Without the fix in place, this test would have failed with:
+        ' - Expected: 8200 (8192 for Array and 8 for String)
+        ' - Actual  : 8    (8 for String)
+        TestLog_ASSERT VarType(splitArr(i)), 8200, "VarType(splitArr(i))"
+    Next
 
-    doUnitTest = 1
+    result = result & Chr$(10) & "Tests passed: " & passCount & Chr$(10) & 
"Tests failed: " & failCount & Chr$(10)
+    verify_testSplit = result
 
 End Function
+
+Sub TestLog_ASSERT(actual As Variant, expected As Variant, testName As String)
+    If expected = actual Then
+        passCount = passCount + 1
+    Else
+        result = result & Chr$(10) & "Failed: " & testName & " returned " & 
actual & ", expected " & expected
+        failCount = failCount + 1
+    End If
+End Sub
diff --git a/basic/qa/cppunit/test_vba.cxx b/basic/qa/cppunit/test_vba.cxx
index 9a3cbe8baab9..c49bd89f3de9 100644
--- a/basic/qa/cppunit/test_vba.cxx
+++ b/basic/qa/cppunit/test_vba.cxx
@@ -123,6 +123,7 @@ void VBATest::testMiscVBAFunctions()
         "sgn.vb",
         "sin.vb",
         "space.vb",
+        "split.vb",
         "sqr.vb",
         "str.vb",
         "strcomp.vb",
diff --git a/basic/qa/vba_tests/split.vb b/basic/qa/vba_tests/split.vb
new file mode 100644
index 000000000000..56d4522180b0
--- /dev/null
+++ b/basic/qa/vba_tests/split.vb
@@ -0,0 +1,57 @@
+'
+' 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_testSplit
+    doUnitTest = TestUtil.GetResult()
+End Function
+
+Sub verify_testSplit
+    On Error GoTo errorHandler
+
+    ' SPLIT
+    TestUtil.AssertEqual(Split( "Hello world" )(1), "world", "Split( ""Hello 
world"" )(1)")
+
+    ' tdf#123025 - split function sets the datatype of the array to empty,
+    ' preventing any subsequent assignments of values to the array and to the 
elements itself.
+    Dim arr(1) As String
+    arr = Split("a/b", "/")
+    TestUtil.AssertEqual(arr(0), "a", "Split(""a/b"", ""/"")(0)")
+    TestUtil.AssertEqual(arr(1), "b", "Split(""a/b"", ""/"")(1)")
+    ReDim Preserve arr(1)
+    TestUtil.AssertEqual(arr(0), "a", "ReDim Preserve arr(1)(0)")
+    TestUtil.AssertEqual(arr(1), "b", "ReDim Preserve arr(1)(1)")
+    ReDim arr(1)
+    TestUtil.AssertEqual(arr(0), "", "ReDim arr(1)(0)")
+    TestUtil.AssertEqual(arr(1), "", "ReDim arr(1)(1)")
+
+    arr(0) = "a"
+    arr(1) = "b"
+    TestUtil.AssertEqual(arr(0), "a", "arr(0)")
+    TestUtil.AssertEqual(arr(1), "b", "arr(1)")
+    ReDim Preserve arr(1)
+    TestUtil.AssertEqual(arr(0), "a", "ReDim Preserve arr(1)(0) after 
assignment")
+    TestUtil.AssertEqual(arr(1), "b", "ReDim Preserve arr(1)(1) after 
assignment")
+
+    ' tdf#144924 - using VBASupport 1, the split function returns an array of 
substrings, hence no
+    ' assignment of different data types to the individual elements is possible
+    Dim splitArr
+    splitArr = Split("a/b&&c/d", "&&")
+    ' Without the fix in place, this test would have failed with:
+    ' - Expected: 8    (8 for String)
+    ' - Actual  : 8200 (8192 for Array and 8 for String)
+    TestUtil.AssertEqual(VarType(splitArr(0)), 8, "VarType(splitArr(0))")
+
+    Exit Sub
+errorHandler:
+    TestUtil.ReportErrorHandler("verify_testSplit", Err, Error$, Erl)
+End Sub
diff --git a/basic/source/runtime/methods1.cxx 
b/basic/source/runtime/methods1.cxx
index b20b3fce3775..684dc5827583 100644
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -1628,11 +1628,17 @@ void SbRtl_Split(StarBASIC *, SbxArray & rPar, bool)
     pArray->unoAddDim(0, nArraySize - 1);
 
     // insert parameter(s) into the array
+    const bool bIsVBAInterOp = SbiRuntime::isVBAEnabled();
     for(sal_Int32 i = 0 ; i < nArraySize ; i++ )
     {
         // tdf#123025 - split returns an array of substrings
         SbxVariableRef xVar = new SbxVariable( SbxSTRING );
         xVar->PutString( vRet[i] );
+        // tdf#144924 - allow the assignment of different data types to the 
individual elements
+        if (!bIsVBAInterOp)
+        {
+            xVar->ResetFlag(SbxFlagBits::Fixed);
+        }
         pArray->Put(xVar.get(), &i);
     }
 

Reply via email to