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 package testcase.uno.sc.data; 22 23 import static org.junit.Assert.*; 24 25 import java.util.Arrays; 26 import java.util.Collection; 27 28 import org.junit.After; 29 import org.junit.AfterClass; 30 import org.junit.Before; 31 import org.junit.BeforeClass; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 import org.junit.runners.Parameterized; 35 import org.junit.runners.Parameterized.Parameters; 36 import org.openoffice.test.uno.UnoApp; 37 import testlib.uno.SCUtil; 38 import com.sun.star.lang.XComponent; 39 import com.sun.star.sheet.GeneralFunction; 40 import com.sun.star.sheet.SubTotalColumn; 41 import com.sun.star.sheet.XCellRangeData; 42 import com.sun.star.sheet.XSpreadsheet; 43 import com.sun.star.sheet.XSpreadsheetDocument; 44 import com.sun.star.sheet.XSubTotalCalculatable; 45 import com.sun.star.sheet.XSubTotalDescriptor; 46 import com.sun.star.table.XCellRange; 47 import com.sun.star.uno.Enum; 48 import com.sun.star.uno.UnoRuntime; 49 50 @RunWith(value = Parameterized.class) 51 public class SubTotalsFunction { 52 private static final UnoApp app = new UnoApp(); 53 54 UnoApp unoApp = new UnoApp(); 55 XSpreadsheetDocument scDocument = null; 56 XComponent scComponent = null; 57 58 private GeneralFunction operator; 59 60 private String operatorString; 61 62 private int operatorvalue; 63 64 private double bssubtotalresult; 65 66 private double cssubtotalresult; 67 68 private double mssubtotalresult; 69 70 private double grandtotal; 71 72 @Parameters 73 public static Collection<Object[]> data() throws Exception { 74 // Remove GeneralFunction.Auto,GeneralFunction.NONE 75 return Arrays.asList(new Object[][] { 76 { GeneralFunction.SUM, "Sum", 9, 12, 12, 4, 28 }, 77 { GeneralFunction.AVERAGE, "Average", 1, 4, 6, 2, 4 }, 78 { GeneralFunction.COUNT, "Count", 3, 3, 2, 2, 7 }, 79 { GeneralFunction.COUNTNUMS, "Count", 2, 3, 2, 2, 7 }, 80 { GeneralFunction.MAX, "Max", 4, 6, 7, 3, 7 }, 81 { GeneralFunction.MIN, "Min", 5, 2, 5, 1, 1 }, 82 { GeneralFunction.VAR, "Var", 10, 4, 2, 2, 4.666666667 }, 83 { GeneralFunction.PRODUCT, "Product", 6, 48, 35, 3, 5040 }, 84 { GeneralFunction.STDEVP, "StDev", 8, 1.6329931619, 1, 1, 2 }, 85 { GeneralFunction.STDEV, "StDev", 7, 2, 1.4142135624, 86 1.4142135624, 2.1602468995 }, 87 { GeneralFunction.VARP, "Var", 11, 2.6666666667, 1, 1, 4 }, }); 88 } 89 90 @Before 91 public void setUpDocument() throws Exception { 92 unoApp.start(); 93 } 94 95 @After 96 public void tearDownDocument() { 97 unoApp.close(); 98 unoApp.closeDocument(scComponent); 99 100 } 101 102 @BeforeClass 103 public static void setUpConnection() throws Exception { 104 105 } 106 107 @AfterClass 108 public static void tearDownConnection() throws InterruptedException, 109 Exception { 110 111 } 112 113 public SubTotalsFunction(Enum operator, String operatorString, 114 int operatorvalue, double bssubtotalresult, 115 double cssubtotalresult, double mssubtotalresult, double grandtotal) { 116 this.operator = (GeneralFunction) operator; 117 this.operatorString = operatorString; 118 this.operatorvalue = operatorvalue; 119 this.bssubtotalresult = bssubtotalresult; 120 this.cssubtotalresult = cssubtotalresult; 121 this.mssubtotalresult = mssubtotalresult; 122 this.grandtotal = grandtotal; 123 } 124 125 @Test 126 public void test() throws Exception { 127 // New document and input data in document 128 scComponent = unoApp.newDocument("scalc"); 129 scDocument = SCUtil.getSCDocument(scComponent); 130 XSpreadsheet currentsheet = SCUtil.getCurrentSheet(scDocument); 131 XCellRange xdataRange = (XCellRange) UnoRuntime.queryInterface( 132 XCellRange.class, currentsheet); 133 XCellRange sourceRange = currentsheet.getCellRangeByName("A1:E8"); 134 XCellRangeData sourceData = (XCellRangeData) UnoRuntime.queryInterface( 135 XCellRangeData.class, sourceRange); 136 Object[][] Source = { { "Level", "Code", "No.", "Team", "Name" }, 137 { "BS", 20, 4, "B", "Elle" }, { "BS", 20, 6, "C", "Sweet" }, 138 { "BS", 20, 2, "A", "Chcomic" }, { "CS", 30, 5, "A", "Ally" }, 139 { "MS", 10, 1, "A", "Joker" }, { "MS", 10, 3, "B", "Kevin" }, 140 { "CS", 30, 7, "C", "Tom" } }; 141 sourceData.setDataArray(Source); 142 143 // Create SubTotals 144 XSubTotalCalculatable xSub = (XSubTotalCalculatable) UnoRuntime 145 .queryInterface(XSubTotalCalculatable.class, sourceRange); 146 XSubTotalDescriptor xSubDesc = xSub.createSubTotalDescriptor(true); 147 SubTotalColumn[] aColumns = new SubTotalColumn[1]; 148 // calculate sum of third column 149 aColumns[0] = new SubTotalColumn(); 150 aColumns[0].Column = 2; 151 aColumns[0].Function = operator; 152 // group by first column 153 xSubDesc.addNew(aColumns, 0); 154 xSub.applySubTotals(xSubDesc, true); 155 156 // Verify BS SubTotals result 157 String BSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$2:$C$4)"; 158 String BSsubtotalsString = "BS " + operatorString; 159 160 assertEquals(bssubtotalresult, 161 SCUtil.getValueFromCell(currentsheet, 2, 4), 0.000000001); 162 assertEquals(BSsubtotals, SCUtil.getFormulaFromCell(currentsheet, 2, 4)); 163 assertEquals(BSsubtotalsString, 164 SCUtil.getTextFromCell(currentsheet, 0, 4)); 165 166 // Verify CS SubTotals result 167 String CSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$6:$C$7)"; 168 String CSsubtotalsString = "CS " + operatorString; 169 170 assertEquals(cssubtotalresult, 171 SCUtil.getValueFromCell(currentsheet, 2, 7), 0.000000001); 172 assertEquals(CSsubtotals, SCUtil.getFormulaFromCell(currentsheet, 2, 7)); 173 assertEquals(CSsubtotalsString, 174 SCUtil.getTextFromCell(currentsheet, 0, 7)); 175 176 // Verify MS SubTotals result 177 String MSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$9:$C$10)"; 178 String MSsubtotalsString = "MS " + operatorString; 179 180 assertEquals(mssubtotalresult, 181 SCUtil.getValueFromCell(currentsheet, 2, 10), 0.000000001); 182 assertEquals(MSsubtotals, 183 SCUtil.getFormulaFromCell(currentsheet, 2, 10)); 184 assertEquals(MSsubtotalsString, 185 SCUtil.getTextFromCell(currentsheet, 0, 10)); 186 187 // Verify GrandTotal result 188 String GTsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$2:$C$11)"; 189 String GTsubtotalsString = "Grand Total"; 190 191 assertEquals(grandtotal, SCUtil.getValueFromCell(currentsheet, 2, 11), 192 0.000000001); 193 assertEquals(GTsubtotals, 194 SCUtil.getFormulaFromCell(currentsheet, 2, 11)); 195 assertEquals(GTsubtotalsString, 196 SCUtil.getTextFromCell(currentsheet, 0, 11)); 197 198 // Save the file and reload it 199 SCUtil.saveFileAs(scComponent, "Subtotals", "ods"); 200 XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp, 201 scDocument, "Subtotals.ods"); 202 scDocument = scDocumentTemp; 203 currentsheet = SCUtil.getCurrentSheet(scDocument); 204 205 // verify it again 206 // Verify BS SubTotals result 207 BSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$2:$C$4)"; 208 BSsubtotalsString = "BS " + operatorString; 209 210 assertEquals(bssubtotalresult, 211 SCUtil.getValueFromCell(currentsheet, 2, 4), 0.000000001); 212 assertEquals(BSsubtotals, SCUtil.getFormulaFromCell(currentsheet, 2, 4)); 213 assertEquals(BSsubtotalsString, 214 SCUtil.getTextFromCell(currentsheet, 0, 4)); 215 216 // Verify CS SubTotals result 217 CSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$6:$C$7)"; 218 CSsubtotalsString = "CS " + operatorString; 219 220 assertEquals(cssubtotalresult, 221 SCUtil.getValueFromCell(currentsheet, 2, 7), 0.000000001); 222 assertEquals(CSsubtotals, SCUtil.getFormulaFromCell(currentsheet, 2, 7)); 223 assertEquals(CSsubtotalsString, 224 SCUtil.getTextFromCell(currentsheet, 0, 7)); 225 226 // Verify MS SubTotals result 227 MSsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$9:$C$10)"; 228 MSsubtotalsString = "MS " + operatorString; 229 230 assertEquals(mssubtotalresult, 231 SCUtil.getValueFromCell(currentsheet, 2, 10), 0.000000001); 232 assertEquals(MSsubtotals, 233 SCUtil.getFormulaFromCell(currentsheet, 2, 10)); 234 assertEquals(MSsubtotalsString, 235 SCUtil.getTextFromCell(currentsheet, 0, 10)); 236 237 // Verify GrandTotal result 238 GTsubtotals = "=SUBTOTAL(" + operatorvalue + ";$C$2:$C$11)"; 239 GTsubtotalsString = "Grand Total"; 240 241 assertEquals(grandtotal, SCUtil.getValueFromCell(currentsheet, 2, 11), 242 0.000000001); 243 assertEquals(GTsubtotals, 244 SCUtil.getFormulaFromCell(currentsheet, 2, 11)); 245 assertEquals(GTsubtotalsString, 246 SCUtil.getTextFromCell(currentsheet, 0, 11)); 247 } 248 } 249