Author: damjan Date: Wed Aug 26 02:10:46 2015 New Revision: 1697807 URL: http://svn.apache.org/r1697807 Log: #i117989# Basic functions Day(), Hour(), Minute(), and Second() return wrong results for dates <1900-1-1
Also extended our spreadsheeet test to search through more columns, open spreadsheets with macros enabled, and added a test for the the Year(), Month(), Day(), Hour(), Minute(), and Second() functions comparing Calc's formulas vs StarBasic's runtime functions. Found-by: villeroy Patch-by: Damjan Jovanovic Added: openoffice/trunk/test/testuno/data/uno/sc/fvt/StarBasicYearMonthDateHourMinuteSecondTests.ods (with props) Modified: openoffice/trunk/main/basic/source/runtime/methods.cxx openoffice/trunk/test/testuno/source/fvt/uno/sc/formula/TestFormulaDocs.java Modified: openoffice/trunk/main/basic/source/runtime/methods.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basic/source/runtime/methods.cxx?rev=1697807&r1=1697806&r2=1697807&view=diff ============================================================================== --- openoffice/trunk/main/basic/source/runtime/methods.cxx (original) +++ openoffice/trunk/main/basic/source/runtime/methods.cxx Wed Aug 26 02:10:46 2015 @@ -1789,17 +1789,9 @@ RTLFUNC(Val) sal_Int16 implGetDateDay( double aDate ) { aDate -= 2.0; // normieren: 1.1.1900 => 0.0 + aDate = floor( aDate ); Date aRefDate( 1, 1, 1900 ); - if ( aDate >= 0.0 ) - { - aDate = floor( aDate ); - aRefDate += (sal_uIntPtr)aDate; - } - else - { - aDate = ceil( aDate ); - aRefDate -= (sal_uIntPtr)(-1.0 * aDate); - } + aRefDate += (sal_uIntPtr)aDate; sal_Int16 nRet = (sal_Int16)( aRefDate.GetDay() ); return nRet; @@ -2110,8 +2102,6 @@ RTLFUNC(Year) sal_Int16 implGetHour( double dDate ) { - if( dDate < 0.0 ) - dDate *= -1.0; double nFrac = dDate - floor( dDate ); nFrac *= 86400.0; sal_Int32 nSeconds = (sal_Int32)(nFrac + 0.5); @@ -2136,8 +2126,6 @@ RTLFUNC(Hour) sal_Int16 implGetMinute( double dDate ) { - if( dDate < 0.0 ) - dDate *= -1.0; double nFrac = dDate - floor( dDate ); nFrac *= 86400.0; sal_Int32 nSeconds = (sal_Int32)(nFrac + 0.5); @@ -2177,8 +2165,6 @@ RTLFUNC(Month) sal_Int16 implGetSecond( double dDate ) { - if( dDate < 0.0 ) - dDate *= -1.0; double nFrac = dDate - floor( dDate ); nFrac *= 86400.0; sal_Int32 nSeconds = (sal_Int32)(nFrac + 0.5); Added: openoffice/trunk/test/testuno/data/uno/sc/fvt/StarBasicYearMonthDateHourMinuteSecondTests.ods URL: http://svn.apache.org/viewvc/openoffice/trunk/test/testuno/data/uno/sc/fvt/StarBasicYearMonthDateHourMinuteSecondTests.ods?rev=1697807&view=auto ============================================================================== Binary file - no diff available. Propchange: openoffice/trunk/test/testuno/data/uno/sc/fvt/StarBasicYearMonthDateHourMinuteSecondTests.ods ------------------------------------------------------------------------------ svn:mime-type = application/vnd.oasis.opendocument.spreadsheet Modified: openoffice/trunk/test/testuno/source/fvt/uno/sc/formula/TestFormulaDocs.java URL: http://svn.apache.org/viewvc/openoffice/trunk/test/testuno/source/fvt/uno/sc/formula/TestFormulaDocs.java?rev=1697807&r1=1697806&r2=1697807&view=diff ============================================================================== --- openoffice/trunk/test/testuno/source/fvt/uno/sc/formula/TestFormulaDocs.java (original) +++ openoffice/trunk/test/testuno/source/fvt/uno/sc/formula/TestFormulaDocs.java Wed Aug 26 02:10:46 2015 @@ -36,6 +36,8 @@ import org.openoffice.test.uno.UnoApp; import testlib.uno.SCUtil; import static testlib.uno.TestUtil.*; +import com.sun.star.beans.PropertyValue; +import com.sun.star.document.MacroExecMode; import com.sun.star.lang.XComponent; import com.sun.star.sheet.XSpreadsheet; import com.sun.star.sheet.XSpreadsheetDocument; @@ -76,12 +78,18 @@ public class TestFormulaDocs { @Test public void testFormulaDocs() throws Exception { testOneDoc( "uno/sc/fvt/FormulaTest1.ods"); + testOneDoc( "uno/sc/fvt/StarBasicYearMonthDateHourMinuteSecondTests.ods"); } public void testOneDoc( String filename) throws Exception { // open the spreadsheet document String sample = Testspace.prepareData( filename); - XSpreadsheetDocument scDoc = SCUtil.openFile( sample, unoApp); + // enable macros + PropertyValue prop = new PropertyValue(); + prop.Name = "MacroExecutionMode"; + prop.Value = MacroExecMode.ALWAYS_EXECUTE_NO_WARN; + XSpreadsheetDocument scDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface( + XSpreadsheetDocument.class, unoApp.loadDocument(sample, prop)); XSpreadsheet xSheet = SCUtil.getCurrentSheet( scDoc); // find the "TestID" and "TestOK" markers @@ -89,7 +97,7 @@ public class TestFormulaDocs { int nTestOkCol = -1; int nTestRowStart = -1; for( int y = 0; y < 8; ++y) { - for( int x = 0; x < 8; ++x) { + for( int x = 0; x < 26; ++x) { XCell xCell = xSheet.getCellByPosition( x, y); XText xText = (XText)UnoRuntime.queryInterface( XText.class, xCell); String name = xText.getString();