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