diff options
-rw-r--r-- | basic/qa/basic_coverage/test_unsigned_integers.bas | 46 | ||||
-rw-r--r-- | basic/source/classes/sbunoobj.cxx | 17 |
2 files changed, 53 insertions, 10 deletions
diff --git a/basic/qa/basic_coverage/test_unsigned_integers.bas b/basic/qa/basic_coverage/test_unsigned_integers.bas new file mode 100644 index 000000000000..d7f2385ecff5 --- /dev/null +++ b/basic/qa/basic_coverage/test_unsigned_integers.bas @@ -0,0 +1,46 @@ +' +' 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_testUnsignedIntegers + doUnitTest = TestUtil.GetResult() +End Function + +Function convertToDouble(n) + Dim conv As Object + conv = CreateUnoService("com.sun.star.script.Converter") + convertToDouble = conv.convertToSimpleType(n, com.sun.star.uno.TypeClass.DOUBLE) +End Function + +Sub verify_testUnsignedIntegers() + On Error GoTo errorHandler + + Dim t As New com.sun.star.util.Time ' has both unsigned long and unsigned short + t.Seconds = 201 + t.NanoSeconds = 202 + Dim u8 As Byte, u16, u32 + u8 = 200 + u16 = t.Seconds ' UShort + u32 = t.NanoSeconds ' ULong + + TestUtil.AssertEqual(TypeName(u8), "Byte", "TypeName(u8)") + TestUtil.AssertEqual(convertToDouble(u8), 200, "convertToDouble(u8)") + + TestUtil.AssertEqual(TypeName(u16), "UShort", "TypeName(u16)") + TestUtil.AssertEqual(convertToDouble(u16), 201, "convertToDouble(u16)") + + TestUtil.AssertEqual(TypeName(u32), "ULong", "TypeName(u32)") + TestUtil.AssertEqual(convertToDouble(u32), 202, "convertToDouble(u32)") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_testUnsignedIntegers", Err, Error$, Erl) +End Sub diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx index 51b1b956b170..8ad9e3fe9e66 100644 --- a/basic/source/classes/sbunoobj.cxx +++ b/basic/source/classes/sbunoobj.cxx @@ -969,6 +969,12 @@ static Type getUnoTypeForSbxValue( const SbxValue* pVal ) // No object, convert basic type else { + if (eBaseType == SbxBYTE && pVal->GetByte() > 127) + { + // Basic Byte type is unsigned; cppu::UnoType<sal_uInt8> corresponds to UNO boolean, + // so values 128-255 are only representable starting with UNO short types + eBaseType = SbxUSHORT; + } aRetType = getUnoTypeForSbxBaseType( eBaseType ); } return aRetType; @@ -1049,19 +1055,10 @@ static Any sbxToUnoValueImpl( const SbxValue* pVar, bool bBlockConversionToSmall aType = ::cppu::UnoType<sal_Int16>::get(); break; } - case TypeClass_UNSIGNED_SHORT: - { - sal_uInt16 n = pVar->GetUShort(); - if( n <= 255 ) - aType = cppu::UnoType<sal_uInt8>::get(); - break; - } case TypeClass_UNSIGNED_LONG: { sal_uInt32 n = pVar->GetLong(); - if( n <= 255 ) - aType = cppu::UnoType<sal_uInt8>::get(); - else if( n <= SbxMAXUINT ) + if( n <= SbxMAXUINT ) aType = cppu::UnoType<cppu::UnoUnsignedShortType>::get(); break; } |