xref: /AOO41X/test/testuno/source/fvt/uno/sc/data/SubTotalsFunction.java (revision eba4d44a33e5be0b2528d5a9a6f0dcbf65adaa0d)
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