xref: /AOO41X/test/testuno/source/fvt/uno/sc/data/SubTotalsFunction.java (revision eba4d44a33e5be0b2528d5a9a6f0dcbf65adaa0d)
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 fvt.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
data()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
setUpDocument()91     public void setUpDocument() throws Exception {
92         unoApp.start();
93     }
94 
95     @After
tearDownDocument()96     public void tearDownDocument() {
97          unoApp.close();
98          unoApp.closeDocument(scComponent);
99 
100     }
101 
102     @BeforeClass
setUpConnection()103     public static void setUpConnection() throws Exception {
104 
105     }
106 
107     @AfterClass
tearDownConnection()108     public static void tearDownConnection() throws InterruptedException,
109             Exception {
110 
111     }
112 
SubTotalsFunction(Enum operator, String operatorString, int operatorvalue, double bssubtotalresult, double cssubtotalresult, double mssubtotalresult, double grandtotal)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
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