1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 package fvt.uno.sc.formula; 23 24 import static org.junit.Assert.*; 25 26 import org.junit.After; 27 import org.junit.Before; 28 import org.junit.Rule; 29 import org.junit.Test; 30 31 import org.openoffice.test.common.Testspace; 32 import org.openoffice.test.common.Logger; 33 34 import org.openoffice.test.uno.UnoApp; 35 36 import testlib.uno.SCUtil; 37 import static testlib.uno.TestUtil.*; 38 39 import com.sun.star.beans.PropertyValue; 40 import com.sun.star.document.MacroExecMode; 41 import com.sun.star.lang.XComponent; 42 import com.sun.star.sheet.XSpreadsheet; 43 import com.sun.star.sheet.XSpreadsheetDocument; 44 import com.sun.star.sheet.XSpreadsheets; 45 import com.sun.star.table.XCell; 46 import com.sun.star.uno.Any; 47 import com.sun.star.text.XText; 48 import com.sun.star.uno.UnoRuntime; 49 import com.sun.star.util.XModifiable; 50 51 import java.util.logging.Level; 52 53 54 public class TestFormulaDocs { 55 56 @Rule 57 public Logger log = Logger.getLogger(this); 58 59 UnoApp unoApp = new UnoApp(); 60 XComponent scComponent = null; 61 62 @Before setUp()63 public void setUp() throws Exception { 64 unoApp.start(); 65 } 66 67 @After tearDown()68 public void tearDown() throws Exception { 69 unoApp.close(); 70 } 71 72 /** 73 * Test evaluation of formulas in a sample document 74 * 75 * @throws Exception 76 */ 77 78 @Test testFormulaDocs()79 public void testFormulaDocs() throws Exception { 80 testOneDoc("uno/sc/fvt/FormulaTest1.ods"); 81 testOneDoc("uno/sc/fvt/StarBasicCLng.ods"); 82 testOneDoc("uno/sc/fvt/Basic Line as variable and Line Input.ods"); 83 testOneDoc("uno/sc/fvt/comment-in-single-line-if-then-else.ods"); 84 } 85 testOneDoc( String filename)86 public void testOneDoc( String filename) throws Exception { 87 // open the spreadsheet document 88 String sample = Testspace.prepareData( filename); 89 // enable macros 90 PropertyValue prop = new PropertyValue(); 91 prop.Name = "MacroExecutionMode"; 92 prop.Value = MacroExecMode.ALWAYS_EXECUTE_NO_WARN; 93 XSpreadsheetDocument scDoc = (XSpreadsheetDocument) UnoRuntime.queryInterface( 94 XSpreadsheetDocument.class, unoApp.loadDocument(sample, prop)); 95 XSpreadsheet xSheet = SCUtil.getCurrentSheet( scDoc); 96 97 // find the "TestID" and "TestOK" markers 98 int nTestIdCol = -1; 99 int nTestOkCol = -1; 100 int nTestRowStart = -1; 101 for( int y = 0; y < 8; ++y) { 102 for( int x = 0; x < 8; ++x) { 103 XCell xCell = xSheet.getCellByPosition( x, y); 104 XText xText = (XText)UnoRuntime.queryInterface( XText.class, xCell); 105 String name = xText.getString(); 106 if( name.equals( "TestID")) { 107 assertTrue( "Multiple rows with TestID marker!", nTestIdCol == -1); 108 assertTrue( nTestRowStart == -1); 109 nTestIdCol = x; 110 nTestRowStart = y + 1; 111 } else if( name.equals( "TestOK")) { 112 assertTrue( "Multiple rows with TestOK marker!", nTestOkCol == -1); 113 assertTrue( "TestID and TestOK marker not in same row!", nTestRowStart == y + 1); 114 nTestOkCol = x; 115 } 116 } 117 } 118 assertTrue( "Column \"TestID\" not found!", nTestIdCol >= 0); 119 assertTrue( "Column \"TestOK\" not found!", nTestOkCol >= 0); 120 121 int nTestRowEnd = nTestRowStart + 100; // TODO: get the last row from the sheet 122 int nTestCount = 0; 123 int nFailCount = 0; 124 for( int y = nTestRowStart; y < nTestRowEnd; ++y) { 125 // get the test id 126 XCell xCell = xSheet.getCellByPosition( nTestIdCol, y); 127 XText xText = (XText)UnoRuntime.queryInterface( XText.class, xCell); 128 String testId = xText.getString(); 129 // ignore rows without test ids 130 if( testId.length() == 0) 131 continue; 132 ++nTestCount; 133 134 // get and check the test result 135 xCell = xSheet.getCellByPosition( nTestOkCol, y); 136 String testOk = ((XText)UnoRuntime.queryInterface( XText.class, xCell)).getString(); 137 assertTrue( "Test result must be TRUE or FALSE", testOk.equals("TRUE") || testOk.equals("FALSE")); 138 boolean bOK = testOk.equals("TRUE"); 139 // mark evaluated test results 140 SCUtil.setProperties( xCell, "CellBackColor", (Integer)(bOK ? 0x00FF00 : 0xFF0000)); 141 // handle failed test cases 142 if( !bOK) { 143 ++nFailCount; 144 log.log( Level.SEVERE, "\ttest \""+testId+" failed"); 145 } 146 } 147 148 assertTrue( (""+nFailCount+" of "+nTestCount+" tests failed"), nFailCount==0); 149 150 XModifiable modified = (XModifiable)UnoRuntime.queryInterface( XModifiable.class, scDoc); 151 modified.setModified( false); 152 SCUtil.closeFile( scDoc); 153 } 154 155 } 156 157