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.sheet;
23 
24 import static org.junit.Assert.*;
25 import org.junit.After;
26 import org.junit.AfterClass;
27 import org.junit.Before;
28 import org.junit.BeforeClass;
29 import org.junit.Ignore;
30 import org.junit.Test;
31 import org.openoffice.test.common.Testspace;
32 import org.openoffice.test.uno.UnoApp;
33 import testlib.uno.SCUtil;
34 import com.sun.star.beans.XPropertySet;
35 import com.sun.star.container.XIndexAccess;
36 import com.sun.star.lang.XComponent;
37 import com.sun.star.sheet.SheetLinkMode;
38 import com.sun.star.sheet.XSheetLinkable;
39 import com.sun.star.sheet.XSpreadsheet;
40 import com.sun.star.sheet.XSpreadsheetDocument;
41 import com.sun.star.sheet.XSpreadsheets;
42 import com.sun.star.uno.UnoRuntime;
43 import com.sun.star.util.XRefreshable;
44 
45 /**
46  * Basic sheet operator testing
47  *
48  */
49 public class SheetBasicTest {
50 	UnoApp unoApp = new UnoApp();
51 	XSpreadsheetDocument scDocument = null;
52 	XComponent scComponent = null;
53 
54 	@BeforeClass
setUpBeforeClass()55 	public static void setUpBeforeClass() throws Exception {
56 
57 	}
58 
59 	@AfterClass
tearDownAfterClass()60 	public static void tearDownAfterClass() throws Exception {
61 	}
62 
63 	@Before
setUp()64 	public void setUp() throws Exception {
65 		unoApp.start();
66 		// New a SC document
67 		scComponent = unoApp.newDocument("scalc");
68 	}
69 
70 	@After
tearDown()71 	public void tearDown() throws Exception {
72 		unoApp.closeDocument(scComponent);
73 		unoApp.close();
74 	}
75 
76 	/**
77 	 * test insert a sheet, rename sheet name and delete sheet
78 	 */
79 	@Test
insertRenameDeleteSheet()80 	public void insertRenameDeleteSheet() throws Exception {
81 		// Insert a sheet named aa after first sheet
82 		String sheetname = "aa";
83 		scDocument = SCUtil.getSCDocument(scComponent);
84 		XSpreadsheets spreadsheets = scDocument.getSheets();
85 		spreadsheets.insertNewByName(sheetname, (short) 1);
86 
87 		// active the sheet second sheet aa
88 		XSpreadsheet newSpreadSheet = SCUtil.getSCSheetByIndex(scDocument,
89 				(short) 1);
90 		SCUtil.setCurrentSheet(scDocument, newSpreadSheet);
91 
92 		// get the new spreadsheet name
93 		assertEquals("actual should equals aa", sheetname,
94 				SCUtil.getSCSheetNameByIndex(scDocument, (short) 1));
95 
96 		// Change the Spreadsheet name
97 		String changedname = "SpeadsheetAfterChange";
98 		SCUtil.setSCSheetNameByIndex(scDocument, (short) 1, changedname);
99 
100 		// Save and reload document
101 		SCUtil.saveFileAs(scComponent, "TestSpreadsheet", "ods");
102 		XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
103 				scDocument, "TestSpreadsheet.ods");
104 
105 		scDocument = scDocumentTemp;
106 		String sheetnameaftermove = SCUtil.getSCSheetNameByIndex(scDocument,
107 				(short) 1);
108 
109 		// Verify the changed Spreadsheet name
110 		assertEquals("actual should equals SpeadsheetAfterChange", changedname,
111 				sheetnameaftermove);
112 
113 		scDocument.getSheets().removeByName(changedname);
114 
115 		assertFalse("actual should equals false",
116 				spreadsheets.hasByName(changedname));
117 		SCUtil.save(scDocumentTemp);
118 	}
119 
120 	/**
121 	 * Test copy and paste sheet
122 	 */
123 	@Test
copypastesheet()124 	public void copypastesheet() throws Exception {
125 		// Insert some value into cells
126 		scDocument = SCUtil.getSCDocument(scComponent);
127 		String souceSheetName = "sourcesheet";
128 		SCUtil.setSCSheetNameByIndex(scDocument, (short) 0, souceSheetName);
129 		String[][] stringValues = { { "", "Jan", "Feb", "Mar", "Apr", "Mai" },
130 				{ "Profit", "12.3", "43.2", "5.1", "76", "56.8" },
131 				{ "Rival in business", "12.2", "12.6", "17.7", "20.4", "100" }, };
132 		XSpreadsheet sourceSpreadSheet = SCUtil.getSCSheetByName(scDocument,
133 				souceSheetName);
134 		// input strings into sheet1
135 		SCUtil.setTextToCellRange(sourceSpreadSheet, 0, 0, stringValues);
136 		// copy the sheet from sourcesheet to copysheet
137 		String newcopysheet = "copysheet";
138 		XSpreadsheets spreadsheets = scDocument.getSheets();
139 		spreadsheets.copyByName(souceSheetName, newcopysheet, (short) 2);
140 
141 		// Save and reload document
142 		SCUtil.saveFileAs(scComponent, "TestCopysheet", "xls");
143 		XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
144 				scDocument, "TestCopysheet.xls");
145 		scDocument = scDocumentTemp;
146 
147 		XSpreadsheet copysheet = SCUtil
148 				.getSCSheetByIndex(scDocument, (short) 2);
149 		String[][] CopystringValues = SCUtil.getTextFromCellRange(copysheet, 0,
150 				0, 5, 2);
151 		assertArrayEquals("Expect string value should be stringValues",
152 				stringValues, CopystringValues);
153 
154 	}
155 
156 	/**
157 	 * Test move sheet
158 	 */
159 	@Test
movesheet()160 	public void movesheet() throws Exception {
161 
162 		// new sc document
163 		scDocument = SCUtil.getSCDocument(scComponent);
164 		XSpreadsheets spreadsheets = scDocument.getSheets();
165 
166 		// change the first sheet name and input same value into the sheet cell
167 		String sheetname = "sourcesheet";
168 		SCUtil.setSCSheetNameByIndex(scDocument, (short) 0, sheetname);
169 		String[][] stringValues = { { "", "Jan", "Feb", "Mar", "Apr", "Mai" },
170 				{ "Profit", "12.3", "43.2", "5.1", "76", "56.8" },
171 				{ "Rival in business", "12.2", "12.6", "17.7", "20.4", "100" }, };
172 		XSpreadsheet movesheet = SCUtil
173 				.getSCSheetByIndex(scDocument, (short) 0);
174 		SCUtil.setTextToCellRange(movesheet, 0, 0,stringValues);
175 
176 		// Before move, get the 2nd sheet name
177 		String secondSheetNameBeforeMove = SCUtil.getSCSheetNameByIndex(
178 				scDocument, (short) 1);
179 
180 		// move the first sheet
181 		spreadsheets.moveByName(sheetname, (short) 2);
182 
183 		// Save and reload document
184 		SCUtil.saveFileAs(scComponent, "Testmovesheet", "xls");
185 		XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
186 				scDocument, "Testmovesheet.xls");
187 		scDocument = scDocumentTemp;
188 
189 		// After move, get the first sheet name, and verify it same as 2nd sheet
190 		// name before move
191 		String firstsheetnameAfterMove = SCUtil.getSCSheetNameByIndex(
192 				scDocument, (short) 0);
193 		assertEquals("Expect result should be Sheet2",
194 				secondSheetNameBeforeMove, firstsheetnameAfterMove);
195 
196 		// Get the target sheet name after move
197 		String sheetnameAfterMove = SCUtil.getSCSheetNameByIndex(scDocument,
198 				(short) 1);
199 		assertEquals("Expect result should be sourcesheet", sheetname,
200 				sheetnameAfterMove);
201 
202 		// Check the cell value after move
203 		XSpreadsheet sheetaftermove = SCUtil.getSCSheetByIndex(scDocument,
204 				(short) 1);
205 		String[][] stringValuesaftermove = SCUtil.getTextFromCellRange(
206 				sheetaftermove, 0, 0, 5, 2);
207 
208 		assertArrayEquals("Expect result should be stringValues", stringValues,
209 				stringValuesaftermove);
210 	}
211 
212 	/**
213 	 * Test hide and show sheet
214 	 */
215 	@Test
hideShowSheet()216 	public void hideShowSheet() throws Exception {
217 		// Insert a sheet named hide sheet after first sheet
218 		String sheetname = "hide sheet";
219 		scDocument = SCUtil.getSCDocument(scComponent);
220 		XSpreadsheets spreadsheets = scDocument.getSheets();
221 		spreadsheets.insertNewByName(sheetname, (short) 1);
222 
223 		// active the sheet second sheet "hide sheet"
224 		XSpreadsheet secondSpreadSheet = SCUtil.getSCSheetByIndex(scDocument,
225 				(short) 1);
226 		SCUtil.setCurrentSheet(scDocument, secondSpreadSheet);
227 		// get second sheet name and verify it should be "hide sheet"
228 		assertEquals("expect active sheet name will be hide sheet", sheetname,
229 				SCUtil.getSCSheetNameByIndex(scDocument, (short) 1));
230 
231 		// hide the sheet you insert
232 		XPropertySet sheetPropertySet = (XPropertySet) UnoRuntime
233 				.queryInterface(XPropertySet.class, secondSpreadSheet);
234 		boolean isvisiable = false;
235 		sheetPropertySet.setPropertyValue("IsVisible", isvisiable);
236 
237 		// Save and reload document
238 		SCUtil.saveFileAs(scComponent, "Testhideshowsheet", "xls");
239 		XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
240 				scDocument, "Testhideshowsheet.xls");
241 		scDocument = scDocumentTemp;
242 
243 		// get the active sheet name after hide sheet, it should be Sheet2
244 		String sheet2Name = SCUtil.getSCSheetNameByIndex(scDocument, (short) 2);
245 		String activesheetname = SCUtil.getSCActiveSheetName(scDocument);
246 		assertEquals("Expect sheet name should be Sheet2", sheet2Name,
247 				activesheetname);
248 
249 		// show sheet "hide sheet"
250 		sheetPropertySet = (XPropertySet) UnoRuntime.queryInterface(
251 				XPropertySet.class,
252 				SCUtil.getSCSheetByIndex(scDocument, (short) 1));
253 		isvisiable = true;
254 		sheetPropertySet.setPropertyValue("IsVisible", isvisiable);
255 
256 		// active sheet "hide sheet"
257 		secondSpreadSheet = SCUtil.getSCSheetByIndex(scDocument, (short) 1);
258 		SCUtil.setCurrentSheet(scDocument, secondSpreadSheet);
259 
260 		// Get current active sheet name, verify it same as "hide sheet"
261 		String currentactivesheetname = SCUtil.getSCActiveSheetName(scDocument);
262 		assertEquals("Expect active sheet name is hidesheet", sheetname,
263 				currentactivesheetname);
264 		SCUtil.save(scDocument);
265 	}
266 
267 	/**
268 	 * Test sheet tab color
269 	 */
270 	@Test
sheetColor()271 	public void sheetColor() throws Exception {
272 		// get first sheet propertyset
273 		scDocument = SCUtil.getSCDocument(scComponent);
274 		XSpreadsheets spreadsheets = scDocument.getSheets();
275 		XSpreadsheet firstSpreadSheet = SCUtil.getSCSheetByIndex(scDocument,
276 				(short) 0);
277 		XPropertySet sheet1PropertySet = (XPropertySet) UnoRuntime
278 				.queryInterface(XPropertySet.class, firstSpreadSheet);
279 
280 		// Set sheet tab color to 111
281 		sheet1PropertySet.setPropertyValue("TabColor", 111);
282 
283 		// copy the color sheet to new sheet
284 		spreadsheets.copyByName(
285 				SCUtil.getSCSheetNameByIndex(scDocument, (short) 0),
286 				"newsheet", (short) 3);
287 
288 		// Save and reopen the document
289 		SCUtil.saveFileAs(scComponent, "Testcolorsheet", "ods");
290 		XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
291 				scDocument, "Testcolorsheet.ods");
292 		scDocument = scDocumentTemp;
293 
294 		// Get first sheet color
295 		sheet1PropertySet = (XPropertySet) UnoRuntime.queryInterface(
296 				XPropertySet.class,
297 				SCUtil.getSCSheetByIndex(scDocument, (short) 0));
298 		int firstSheetcolorid = (Integer) sheet1PropertySet
299 				.getPropertyValue("TabColor");
300 
301 		// Get the copied sheet color
302 		XPropertySet newsheetPropertySet = (XPropertySet) UnoRuntime
303 				.queryInterface(XPropertySet.class,
304 						SCUtil.getSCSheetByIndex(scDocument, (short) 3));
305 		int copySheetcolorid = (Integer) newsheetPropertySet
306 				.getPropertyValue("TabColor");
307 
308 		// Verify first sheet color changed successfully
309 		assertEquals("Expect color should be 111", 111, firstSheetcolorid);
310 
311 		// Verify first sheet color same as copy sheet color
312 		assertEquals("Expect color should be 111", firstSheetcolorid,
313 				copySheetcolorid);
314 	}
315 
316 	/**
317 	 * test insert sheet from other file
318 	 */
319     @Ignore("Bug #128536 locks up on update link confirmation dialog. replaced by InsertExcelSheetTest class.")
320 	@Test(timeout = 15000)
insertSheetFromfile()321 	public void insertSheetFromfile() throws Exception {
322 		// New a document source.xls, add value to 3 sheet
323 		scDocument = SCUtil.getSCDocument(scComponent);
324 		XSpreadsheets spreadsheets = scDocument.getSheets();
325 		XSpreadsheet firstSheet = SCUtil.getSCSheetByIndex(scDocument,
326 				(short) 0);
327 		XSpreadsheet secondSheet = SCUtil.getSCSheetByIndex(scDocument,
328 				(short) 1);
329 		XSpreadsheet thirdSheet = SCUtil.getSCSheetByIndex(scDocument,
330 				(short) 2);
331 		SCUtil.setFormulaToCell(firstSheet, 1, 2, "=2*2");
332 		SCUtil.setFormulaToCell(secondSheet, 1, 2, "=2*2");
333 		SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=2*2");
334 
335 		// Save and close this document
336 		SCUtil.saveFileAs(scComponent, "source", "xls");
337 		SCUtil.closeFile(scDocument);
338 
339 		// get source document URL
340 		String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "."
341 				+ "xls");
342 
343 		// New a document
344 		scComponent = unoApp.newDocument("scalc");
345 		scDocument = SCUtil.getSCDocument(scComponent);
346 		spreadsheets = scDocument.getSheets();
347 		// Insert firstexternalsheet sheet, link with Sheet1 in source document
348 		// and the link mode is NORMAL
349 		spreadsheets.insertNewByName("firstexternalsheet", (short) 3);
350 		XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument,
351 				(short) 3);
352 		XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime
353 				.queryInterface(XSheetLinkable.class, firstexternalsheet);
354 		xfirstSheetLinkable.link(SourcestoreUrl, "", "MS Excel 97", "",
355 				SheetLinkMode.NORMAL);
356 
357 		// Insert secondexternalsheet sheet, link with Sheet2 in source document
358 		// and the link mode is VALUE
359 		spreadsheets.insertNewByName("secondexternalsheet", (short) 4);
360 		XSpreadsheet secondexternalsheet = SCUtil.getSCSheetByIndex(scDocument,
361 				(short) 4);
362 		XSheetLinkable xsecondSheetLinkable = (XSheetLinkable) UnoRuntime
363 				.queryInterface(XSheetLinkable.class, secondexternalsheet);
364 		xsecondSheetLinkable.link(SourcestoreUrl, "Sheet2", "MS Excel 97", "",
365 				SheetLinkMode.VALUE);
366 
367 		// Insert secondexternalsheet sheet, link with Sheet2 in source document
368 		// and the link mode is NONE
369 		spreadsheets.insertNewByName("thirdexternalsheet", (short) 5);
370 		XSpreadsheet thirdexternalsheet = SCUtil.getSCSheetByIndex(scDocument,
371 				(short) 5);
372 		XSheetLinkable xthirdSheetLinkable = (XSheetLinkable) UnoRuntime
373 				.queryInterface(XSheetLinkable.class, thirdexternalsheet);
374 		xthirdSheetLinkable.link(SourcestoreUrl, "Sheet3", "MS Excel 97", "",
375 				SheetLinkMode.NONE);
376 
377 		// Verify firstexternalsheet
378 		assertEquals("Expect formula should be =2*2", "=2*2",
379 				SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2));
380 		assertEquals("Expect formula result should be 4", "4",
381 				SCUtil.getTextFromCell(firstexternalsheet, 1, 2));
382 
383 		// Verify secondexternalsheet
384 		assertEquals("Expect formula should be 4", "4",
385 				SCUtil.getFormulaFromCell(secondexternalsheet, 1, 2));
386 		assertEquals("Expect formula result should be 4", "4",
387 				SCUtil.getTextFromCell(secondexternalsheet, 1, 2));
388 
389 		// Verify thirdexternalsheet
390 		assertEquals("Expect formula should be blank", "",
391 				SCUtil.getFormulaFromCell(thirdexternalsheet, 1, 2));
392 		assertEquals("Expect formula result should be blank", "",
393 				SCUtil.getTextFromCell(thirdexternalsheet, 1, 2));
394 
395 		// save document and verify the linked sheet again
396 		SCUtil.saveFileAs(scComponent, "linked", "ods");
397 		XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp,
398 				scDocument, "linked.ods");
399 		scDocument = tempscDocument;
400 		firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3);
401 		secondexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 4);
402 		thirdexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 5);
403 
404 		// Verify firstexternalsheet
405 		assertEquals("Expect formula should be =2*2", "=2*2",
406 				SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2));
407 		assertEquals("Expect formula result should be 4", "4",
408 				SCUtil.getTextFromCell(firstexternalsheet, 1, 2));
409 
410 		// Verify secondexternalsheet
411 		assertEquals("Expect formula should be 4", "4",
412 				SCUtil.getFormulaFromCell(secondexternalsheet, 1, 2));
413 		assertEquals("Expect formula result should be 4", "4",
414 				SCUtil.getTextFromCell(secondexternalsheet, 1, 2));
415 
416 		// Verify thirdexternalsheet
417 		assertEquals("Expect formula should be blank", "",
418 				SCUtil.getFormulaFromCell(thirdexternalsheet, 1, 2));
419 		assertEquals("Expect formula result should be blank", "",
420 				SCUtil.getTextFromCell(thirdexternalsheet, 1, 2));
421 
422 		// save and close document
423 		SCUtil.save(scDocument);
424 		SCUtil.closeFile(scDocument);
425 
426 		// Open source document and change the value in source document
427 		XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp,
428 				scDocument, "source.xls");
429 		firstSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 0);
430 		secondSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 1);
431 		thirdSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 2);
432 		SCUtil.setFormulaToCell(firstSheet, 1, 2, "=3*3");
433 		SCUtil.setFormulaToCell(secondSheet, 1, 2, "=3*3");
434 		SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=3*3");
435 		SCUtil.save(sourcescDocument);
436 		SCUtil.closeFile(sourcescDocument);
437 
438 		// Open link document
439 		tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods");
440 		scDocument = tempscDocument;
441 		spreadsheets = scDocument.getSheets();
442 
443 		firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3);
444 		secondexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 4);
445 		thirdexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 5);
446 
447 		// get Object SheetLinks for document
448 		XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime
449 				.queryInterface(XPropertySet.class, scDocument);
450 		Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks");
451 
452 		XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface(
453 				XIndexAccess.class, sheetLinks);
454 
455 		// Refresh all links
456 		for (int i = 0; i < xsheetlinks.getCount(); i++) {
457 			Object sheetlink = xsheetlinks.getByIndex(i);
458 			XRefreshable xsheetRefreshable = (XRefreshable) UnoRuntime
459 					.queryInterface(XRefreshable.class, sheetlink);
460 			xsheetRefreshable.refresh();
461 		}
462 
463 		// Verify firstexternalsheet
464 		assertEquals("Expect formula should be =3*3", "=3*3",
465 				SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2));
466 		assertEquals("Expect formula result should be 9", "9",
467 				SCUtil.getTextFromCell(firstexternalsheet, 1, 2));
468 
469 		// Verify secondexternalsheet
470 		assertEquals("Expect formula should be 9", "9",
471 				SCUtil.getFormulaFromCell(secondexternalsheet, 1, 2));
472 		assertEquals("Expect formula result should be 9", "9",
473 				SCUtil.getTextFromCell(secondexternalsheet, 1, 2));
474 
475 		// Verify thirdexternalsheet
476 		assertEquals("Expect formula should be blank", "",
477 				SCUtil.getFormulaFromCell(thirdexternalsheet, 1, 2));
478 		assertEquals("Expect formula result should be blank", "",
479 				SCUtil.getTextFromCell(thirdexternalsheet, 1, 2));
480 
481 		// Save the document before close
482 		SCUtil.save(scDocument);
483 
484 	}
485 
486 }
487