This is an automated email from the ASF dual-hosted git repository. cmarcum pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/trunk by this push: new 47b4b2ce06 Refs #128536 - fixes BasicSheetTest.insertSheetFromfile locks up and times out (#158) 47b4b2ce06 is described below commit 47b4b2ce067f6fce5207ec291d5b13ba47450c0b Author: Carl Marcum <carl.mar...@codebuilders.net> AuthorDate: Wed Oct 5 17:54:25 2022 -0400 Refs #128536 - fixes BasicSheetTest.insertSheetFromfile locks up and times out (#158) fix: set broken UNO BasicSheetTest to ignore and added two new mixed UNO/VCL test classes with three tests each to cover ignored tests for Excel and now also Calc sources. Refs: #128536 --- .../fvt/mix/sc/sheet/InsertCalcSheetTest.java | 766 +++++++++++++++++++++ .../fvt/mix/sc/sheet/InsertExcelSheetTest.java | 765 ++++++++++++++++++++ .../source/fvt/uno/sc/sheet/SheetBasicTest.java | 3 +- 3 files changed, 1533 insertions(+), 1 deletion(-) diff --git a/test/testuno/source/fvt/mix/sc/sheet/InsertCalcSheetTest.java b/test/testuno/source/fvt/mix/sc/sheet/InsertCalcSheetTest.java new file mode 100644 index 0000000000..e6002bb32b --- /dev/null +++ b/test/testuno/source/fvt/mix/sc/sheet/InsertCalcSheetTest.java @@ -0,0 +1,766 @@ +/************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + *************************************************************/ + +package fvt.mix.sc.sheet; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; + +import org.openoffice.test.common.Logger; +import org.openoffice.test.common.Testspace; +import org.openoffice.test.uno.UnoApp; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XIndexAccess; +import com.sun.star.frame.XDesktop; +import com.sun.star.lang.XComponent; +import com.sun.star.sheet.SheetLinkMode; +import com.sun.star.sheet.XSheetLinkable; +import com.sun.star.sheet.XSpreadsheet; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.sheet.XSpreadsheets; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XRefreshable; + +import org.openoffice.test.OpenOffice; +import org.openoffice.test.vcl.widgets.VclApp; +import org.openoffice.test.vcl.widgets.VclMessageBox; +import org.openoffice.test.vcl.widgets.VclButton; +import org.openoffice.test.vcl.widgets.VclComboBox; +import org.openoffice.test.vcl.widgets.VclListBox; +import org.openoffice.test.vcl.widgets.VclDialog; +import org.openoffice.test.vcl.client.Constant; +import static org.openoffice.test.vcl.Tester.sleep; + +import org.openoffice.test.vcl.client.VclHookException; + +import testlib.uno.SCUtil; + +/** + * test inserting linked and non-linked sheets from another Calc spreadsheet. + */ +public class InsertCalcSheetTest { + + OpenOffice aoo; + UnoApp unoApp; + VclApp vclApp; + VclMessageBox activeMsgBox; + VclButton scAfterCurrentSheet; + VclButton scNewSheetFromFile; + VclButton scFromFileLink; + VclButton scFromFileBrowse; + VclComboBox filePickerPath; + VclButton filePickerOpen; + VclListBox scFromFileSheetList; + VclDialog scInsertSheetDlg; + VclDialog scSelectSheetsDlg; + VclListBox scSheetsList; + + XSpreadsheetDocument scDocument = null; + XComponent scComponent = null; + + @Rule + public Logger log = Logger.getLogger(this); + + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + + OpenOffice aoo = OpenOffice.getDefault(); + unoApp = new UnoApp(aoo); + vclApp = new VclApp(aoo); + scAfterCurrentSheet = new VclButton(vclApp, "sc:RadioButton:RID_SCDLG_INSERT_TABLE:RB_BEHIND"); + scNewSheetFromFile = new VclButton(vclApp, "sc:RadioButton:RID_SCDLG_INSERT_TABLE:RB_FROMFILE"); + scFromFileLink = new VclButton(vclApp, "sc:CheckBox:RID_SCDLG_INSERT_TABLE:CB_LINK"); + scFromFileBrowse = new VclButton(vclApp, "sc:PushButton:RID_SCDLG_INSERT_TABLE:BTN_BROWSE"); + filePickerPath = new VclComboBox(vclApp, "SVT_HID_FILEDLG_AUTOCOMPLETEBOX"); + filePickerOpen = new VclButton(vclApp, "fpicker:PushButton:DLG_SVT_EXPLORERFILE:BTN_EXPLORERFILE_OPEN"); + scFromFileSheetList = new VclListBox(vclApp, "sc:MultiListBox:RID_SCDLG_INSERT_TABLE:LB_TABLES"); + scInsertSheetDlg = new VclDialog(vclApp, "sc:ModalDialog:RID_SCDLG_INSERT_TABLE"); + scSelectSheetsDlg = new VclDialog(vclApp, ".uno:SelectTables"); + scSheetsList = new VclListBox(vclApp, "SC_HID_SELECTTABLES"); + + // existing setup + unoApp.start(); + // New a SC document + scComponent = unoApp.newDocument("scalc"); + + // New a document source.ods, add value to 3 sheet + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + XSpreadsheet firstSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 0); + XSpreadsheet secondSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 1); + XSpreadsheet thirdSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 2); + SCUtil.setFormulaToCell(firstSheet, 1, 2, "=1*2"); // cell B3 + SCUtil.setFormulaToCell(secondSheet, 1, 2, "=2*2"); + SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=3*2"); + + // Save and close this document + SCUtil.saveFileAs(scComponent, "source", "ods"); + SCUtil.closeFile(scDocument); + + } + + @After + public void tearDown() throws Exception { + unoApp.closeDocument(scComponent); + unoApp.close(); + } + + /** + * test insert sheet from other file with a normal link meaning the cell + * will return the formula and text values like the source and the link + * will update the cell. + */ + @Test() + public void insertSheetFromFileLinkedNormal() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "ods"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + // Insert firstexternalsheet sheet, link with Sheet1 in source document + // and the link mode is NORMAL + + // using VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(true); + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // might have to select from + scFromFileSheetList.select(0); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted..."); + + activeMsgBox = new VclMessageBox(vclApp, Constant.UID_ACTIVE); + boolean msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + assertEquals("Expect first sheet link is NORMAL", + SheetLinkMode.NORMAL, xfirstSheetLinkable.getLinkMode()); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =1*2", "=1*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 2", "2", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions"); + log.info("saving document as linked-normal.ods"); + + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-normal", "ods"); + log.info("reloading linked-normal.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-normal.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + // xDesktop.getCurrentComponent returns an XComponent (XModel) + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =1*2", "=1*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 2", "2", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + + log.info("saving the document..."); + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + log.info("opening source.ods to modify first sheet..."); + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.ods"); + XSpreadsheet firstSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 0); + SCUtil.setFormulaToCell(firstSheet, 1, 2, "=1*3"); + log.info("saving and closing source.ods..."); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + log.info("opening linked-normal.ods..."); + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-normal.ods"); + + // Insert button + filePickerOpen.click(); + + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + // Refresh all links + log.info("refreshing all links..."); + for (int i = 0; i < xsheetlinks.getCount(); i++) { + Object sheetlink = xsheetlinks.getByIndex(i); + XRefreshable xsheetRefreshable = (XRefreshable) UnoRuntime + .queryInterface(XRefreshable.class, sheetlink); + xsheetRefreshable.refresh(); + log.info("in refresh loop " + i); + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + } + + // Verify firstexternalsheet did change + assertEquals("Expect first sheet formula should be =1*3", "=1*3", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 3", "3", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + } + + /** + * test insert sheet from other file with a value link, meaning the cell + * will return the text value for both the formula and the text values and + * the link will update the cell. + */ + @Test() + public void insertSheetFromFileLinkedValue() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "ods"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + // Insert firstexternalsheet sheet, link with Sheet2 in source document + // and the link mode is VALUE + + // using VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(true); + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // select sheet 2 + scFromFileSheetList.select(1); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted..."); + + // check for message box + activeMsgBox = new VclMessageBox(vclApp, Constant.UID_ACTIVE); + boolean msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + // this seem the only way to set this as it's not in the UI dialog + xfirstSheetLinkable.setLinkMode(SheetLinkMode.VALUE); + + assertEquals("Expect first sheet link is NORMAL", + SheetLinkMode.VALUE, xfirstSheetLinkable.getLinkMode()); + + // Verify firstexternalsheet + assertEquals("Expect second sheet formula should be 4", "4", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect second sheet text should be 4", "4", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions..."); + + log.info("saving document as linked-value.ods"); + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-value", "ods"); + + log.info("reloading linked-value.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-value.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect second sheet formula should be 4", "4", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect second sheet text should be 4", "4", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + log.info("saving the document..."); + + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.ods"); + XSpreadsheet secondSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 1); + SCUtil.setFormulaToCell(secondSheet, 1, 2, "=2*3"); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + log.info("opening linked-value.ods..."); + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-value.ods"); + + // Insert button + filePickerOpen.click(); + + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the dialog"); + } + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + log.info("refreshing all links..."); + // Refresh all links + for (int i = 0; i < xsheetlinks.getCount(); i++) { + Object sheetlink = xsheetlinks.getByIndex(i); + XRefreshable xsheetRefreshable = (XRefreshable) UnoRuntime + .queryInterface(XRefreshable.class, sheetlink); + xsheetRefreshable.refresh(); + log.info("in refresh loop " + i); + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the dialog"); + } + } + + // Verify firstexternalsheet did change + assertEquals("Expect first sheet formula should be =6", "6", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + + } + + /** + * test insert sheet from other file with no link meaning the cell will + * return the formula and text values like the source but the cell will + * not update. + */ + @Test() + public void insertSheetFromFileLinkedNone() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "ods"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + + // Insert firstexternalsheet sheet, link with Sheet1 in source document + // and the link mode is NORMAL + + // using VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(false); // no link + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // select sheet 3 + scFromFileSheetList.select(2); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted......"); + + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + assertEquals("Expect first sheet link is NONE", + SheetLinkMode.NONE, xfirstSheetLinkable.getLinkMode()); + + // Verify thirdexternalsheet + assertEquals("Expect third sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect third sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions..."); + log.info(""); + + log.info("saving document as linked-none.ods"); + + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-none", "ods"); + log.info("reloading linked-none.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-none.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // need to get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + // xDesktop.getCurrentComponent returns an XComponent (XModel) + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + log.info(""); + + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.ods"); + XSpreadsheet thirdSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 2); + SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=3*3"); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-none.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + log.info("Number of Links should be 0"); + assertEquals("Number of Links should be 0", 0, xsheetlinks.getCount()); + + // Verify firstexternalsheet did not change + assertEquals("Expect first sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + + } + +} // end class \ No newline at end of file diff --git a/test/testuno/source/fvt/mix/sc/sheet/InsertExcelSheetTest.java b/test/testuno/source/fvt/mix/sc/sheet/InsertExcelSheetTest.java new file mode 100644 index 0000000000..7e1a95114f --- /dev/null +++ b/test/testuno/source/fvt/mix/sc/sheet/InsertExcelSheetTest.java @@ -0,0 +1,765 @@ +/************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + *************************************************************/ + +package fvt.mix.sc.sheet; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; + +import org.openoffice.test.common.Logger; +import org.openoffice.test.common.Testspace; +import org.openoffice.test.uno.UnoApp; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XIndexAccess; +import com.sun.star.frame.XDesktop; +import com.sun.star.lang.XComponent; +import com.sun.star.sheet.SheetLinkMode; +import com.sun.star.sheet.XSheetLinkable; +import com.sun.star.sheet.XSpreadsheet; +import com.sun.star.sheet.XSpreadsheetDocument; +import com.sun.star.sheet.XSpreadsheets; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XRefreshable; + +import org.openoffice.test.OpenOffice; +import org.openoffice.test.vcl.widgets.VclApp; +import org.openoffice.test.vcl.widgets.VclMessageBox; +import org.openoffice.test.vcl.widgets.VclButton; +import org.openoffice.test.vcl.widgets.VclComboBox; +import org.openoffice.test.vcl.widgets.VclListBox; +import org.openoffice.test.vcl.widgets.VclDialog; +import org.openoffice.test.vcl.client.Constant; +import static org.openoffice.test.vcl.Tester.sleep; + +import org.openoffice.test.vcl.client.VclHookException; + +import testlib.uno.SCUtil; + +/** + * test inserting linked and non-linked sheets from an XLS spreadsheet. + */ +public class InsertExcelSheetTest { + + OpenOffice aoo; + UnoApp unoApp; + VclApp vclApp; + VclMessageBox activeMsgBox; + VclButton scAfterCurrentSheet; + VclButton scNewSheetFromFile; + VclButton scFromFileLink; + VclButton scFromFileBrowse; + VclComboBox filePickerPath; + VclButton filePickerOpen; + VclListBox scFromFileSheetList; + VclDialog scInsertSheetDlg; + VclDialog scSelectSheetsDlg; + VclListBox scSheetsList; + + XSpreadsheetDocument scDocument = null; + XComponent scComponent = null; + + @Rule + public Logger log = Logger.getLogger(this); + + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + + OpenOffice aoo = OpenOffice.getDefault(); + unoApp = new UnoApp(aoo); + vclApp = new VclApp(aoo); + scAfterCurrentSheet = new VclButton(vclApp, "sc:RadioButton:RID_SCDLG_INSERT_TABLE:RB_BEHIND"); + scNewSheetFromFile = new VclButton(vclApp, "sc:RadioButton:RID_SCDLG_INSERT_TABLE:RB_FROMFILE"); + scFromFileLink = new VclButton(vclApp, "sc:CheckBox:RID_SCDLG_INSERT_TABLE:CB_LINK"); + scFromFileBrowse = new VclButton(vclApp, "sc:PushButton:RID_SCDLG_INSERT_TABLE:BTN_BROWSE"); + filePickerPath = new VclComboBox(vclApp, "SVT_HID_FILEDLG_AUTOCOMPLETEBOX"); + filePickerOpen = new VclButton(vclApp, "fpicker:PushButton:DLG_SVT_EXPLORERFILE:BTN_EXPLORERFILE_OPEN"); + scFromFileSheetList = new VclListBox(vclApp, "sc:MultiListBox:RID_SCDLG_INSERT_TABLE:LB_TABLES"); + scInsertSheetDlg = new VclDialog(vclApp, "sc:ModalDialog:RID_SCDLG_INSERT_TABLE"); + scSelectSheetsDlg = new VclDialog(vclApp, ".uno:SelectTables"); + scSheetsList = new VclListBox(vclApp, "SC_HID_SELECTTABLES"); + + // existing setup + unoApp.start(); + // New a SC document + scComponent = unoApp.newDocument("scalc"); + + // New a document source.xls, add value to 3 sheet + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + XSpreadsheet firstSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 0); + XSpreadsheet secondSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 1); + XSpreadsheet thirdSheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 2); + SCUtil.setFormulaToCell(firstSheet, 1, 2, "=1*2"); // cell B3 + SCUtil.setFormulaToCell(secondSheet, 1, 2, "=2*2"); + SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=3*2"); + + // Save and close this document + SCUtil.saveFileAs(scComponent, "source", "xls"); + SCUtil.closeFile(scDocument); + + } + + @After + public void tearDown() throws Exception { + unoApp.closeDocument(scComponent); + unoApp.close(); + } + + /** + * test insert sheet from other file with a normal link meaning the cell + * will return the formula and text values like the source and the link + * will update the cell. + */ + @Test() + public void insertSheetFromFileLinkedNormal() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "xls"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + // Insert firstexternalsheet sheet, link with Sheet1 in source document + // and the link mode is NORMAL + + // using VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(true); + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // might have to select from + scFromFileSheetList.select(0); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted..."); + + activeMsgBox = new VclMessageBox(vclApp, Constant.UID_ACTIVE); + boolean msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + assertEquals("Expect first sheet link is NORMAL", + SheetLinkMode.NORMAL, xfirstSheetLinkable.getLinkMode()); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =1*2", "=1*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 2", "2", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions"); + log.info("saving document as linked-normal.ods"); + + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-normal", "ods"); + log.info("reloading linked-normal.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-normal.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + // xDesktop.getCurrentComponent returns an XComponent (XModel) + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =1*2", "=1*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 2", "2", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + + log.info("saving the document..."); + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + log.info("opening source.xls to modify first sheet..."); + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.xls"); + XSpreadsheet firstSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 0); + SCUtil.setFormulaToCell(firstSheet, 1, 2, "=1*3"); + log.info("saving and closing source.xls..."); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + log.info("opening linked-normal.ods..."); + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-normal.ods"); + + // Insert button + filePickerOpen.click(); + + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + // Refresh all links + log.info("refreshing all links..."); + for (int i = 0; i < xsheetlinks.getCount(); i++) { + Object sheetlink = xsheetlinks.getByIndex(i); + XRefreshable xsheetRefreshable = (XRefreshable) UnoRuntime + .queryInterface(XRefreshable.class, sheetlink); + xsheetRefreshable.refresh(); + log.info("in refresh loop " + i); + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + } + + // Verify firstexternalsheet did change + assertEquals("Expect first sheet formula should be =1*3", "=1*3", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 3", "3", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + } + + /** + * test insert sheet from other file with a value link, meaning the cell + * will return the text value for both the formula and the text values and + * the link will update the cell. + */ + @Test() + public void insertSheetFromFileLinkedValue() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "xls"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + // Insert firstexternalsheet sheet, link with Sheet2 in source document + // and the link mode is VALUE + + // using VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(true); + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // select sheet 2 + scFromFileSheetList.select(1); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted..."); + + // check for message box + activeMsgBox = new VclMessageBox(vclApp, Constant.UID_ACTIVE); + boolean msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the update links dialog"); + } + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + // this seem the only way to set this as it's not in the UI dialog + xfirstSheetLinkable.setLinkMode(SheetLinkMode.VALUE); + + assertEquals("Expect first sheet link is NORMAL", + SheetLinkMode.VALUE, xfirstSheetLinkable.getLinkMode()); + + // Verify firstexternalsheet + assertEquals("Expect second sheet formula should be 4", "4", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect second sheet text should be 4", "4", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions..."); + + log.info("saving document as linked-value.ods"); + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-value", "ods"); + + log.info("reloading linked-value.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-value.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect second sheet formula should be 4", "4", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect second sheet text should be 4", "4", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + log.info("saving the document..."); + + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.xls"); + XSpreadsheet secondSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 1); + SCUtil.setFormulaToCell(secondSheet, 1, 2, "=2*3"); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + log.info("opening linked-value.ods..."); + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-value.ods"); + + // Insert button + filePickerOpen.click(); + + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the dialog"); + } + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + log.info("refreshing all links..."); + // Refresh all links + for (int i = 0; i < xsheetlinks.getCount(); i++) { + Object sheetlink = xsheetlinks.getByIndex(i); + XRefreshable xsheetRefreshable = (XRefreshable) UnoRuntime + .queryInterface(XRefreshable.class, sheetlink); + xsheetRefreshable.refresh(); + log.info("in refresh loop " + i); + msgExists = activeMsgBox.exists(1); // wait 1 second for the dialog + if (msgExists) { + log.info("got the update links dialog and accepting"); + activeMsgBox.yes(); // yes dialog + } else { + log.info("missed the dialog"); + } + } + + // Verify firstexternalsheet did change + assertEquals("Expect first sheet formula should be =6", "6", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + + } + + /** + * test insert sheet from other file with no link meaning the cell will + * return the formula and text values like the source but the cell will + * not update. + */ + @Test() + public void insertSheetFromFileLinkedNone() throws Exception { + + // get source document URL + String SourcestoreUrl = Testspace.getUrl("output/sc/" + "source" + "." + + "xls"); + + // New a document + scComponent = unoApp.newDocument("scalc"); + scDocument = SCUtil.getSCDocument(scComponent); + XSpreadsheets spreadsheets = scDocument.getSheets(); + + // Insert firstexternalsheet sheet, link with Sheet1 in source document + // and the link mode is NORMAL + + // try with VCL + boolean retry = false; + int tryCount = 0; + int maxTries = 5; + do { + tryCount++; // starts at 1 + retry = false; + try { + vclApp.dispatch(".uno:SelectTables"); + } catch (java.lang.Exception e) { + // e.printStackTrace(); + log.info("Exception " + tryCount + "Caught !"); + retry = true; + if (tryCount == maxTries) { + throw e; // throw the exception + } + sleep(1); + } + } while ((retry) && (tryCount < maxTries)); + + // select sheet3 + scSheetsList.select(2); + + scSelectSheetsDlg.ok(); + + // Open Insert Sheet dialog via main menu Insert-> Sheet + vclApp.dispatch(".uno:Insert"); + + // set after current sheet + scAfterCurrentSheet.setChecked(true); + + // enable new sheet from file + scNewSheetFromFile.setChecked(true); + + // check Link + scFromFileLink.setChecked(false); // no link + + // browse + scFromFileBrowse.click(); + + // opens Insert dialog + + // add filename + filePickerPath.setText(SourcestoreUrl); + + // Insert button + filePickerOpen.click(); + + // back to Insert Sheet dialog + + // select sheet 3 + scFromFileSheetList.select(2); + + // select Insert button + scInsertSheetDlg.ok(); + + log.info("sheet inserted......"); + + XSpreadsheet firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, + (short) 3); + XSheetLinkable xfirstSheetLinkable = (XSheetLinkable) UnoRuntime + .queryInterface(XSheetLinkable.class, firstexternalsheet); + + assertEquals("Expect first sheet link is NONE", + SheetLinkMode.NONE, xfirstSheetLinkable.getLinkMode()); + + // Verify thirdexternalsheet + assertEquals("Expect third sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect third sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed first round of assertions..."); + log.info(""); + + log.info("saving document as linked-none.ods"); + + // save document and verify the linked sheet again + SCUtil.saveFileAs(scComponent, "linked-none", "ods"); + log.info("reloading linked-none.ods..."); + + // this will hang on "update links" dialog with no way out - leaving here for others that follow... + // XSpreadsheetDocument tempscDocument = SCUtil.reloadFile(unoApp, scDocument, "linked.ods"); + + // open it with VCL instead + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-none.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // need to get the current document as tempscdocument + XDesktop xDesktop = unoApp.getDesktop(); + // xDesktop.getCurrentComponent returns an XComponent (XModel) + XComponent xComponent = xDesktop.getCurrentComponent(); + XSpreadsheetDocument tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // Verify firstexternalsheet + assertEquals("Expect first sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + log.info("passed second round of assertions"); + log.info(""); + + // save and close document + SCUtil.save(scDocument); + SCUtil.closeFile(scDocument); + + // Open source document and change the value in source document + XSpreadsheetDocument sourcescDocument = SCUtil.reloadFile(unoApp, + scDocument, "source.xls"); + XSpreadsheet thirdSheet = SCUtil.getSCSheetByIndex(sourcescDocument, (short) 2); + SCUtil.setFormulaToCell(thirdSheet, 1, 2, "=3*3"); + SCUtil.save(sourcescDocument); + SCUtil.closeFile(sourcescDocument); + + // open test document + vclApp.dispatch(".uno:Open"); + // add filename + filePickerPath.setText("linked-none.ods"); + + // Insert button + filePickerOpen.click(); + sleep(1); + + // get the current document as tempscdocument + xDesktop = unoApp.getDesktop(); + xComponent = xDesktop.getCurrentComponent(); + tempscDocument = (XSpreadsheetDocument)UnoRuntime.queryInterface( + XSpreadsheetDocument.class, xComponent); + + scDocument = tempscDocument; + spreadsheets = scDocument.getSheets(); + + firstexternalsheet = SCUtil.getSCSheetByIndex(scDocument, (short) 3); + + // get Object SheetLinks for document + XPropertySet sheetpropertyset = (XPropertySet) UnoRuntime + .queryInterface(XPropertySet.class, scDocument); + Object sheetLinks = sheetpropertyset.getPropertyValue("SheetLinks"); + + XIndexAccess xsheetlinks = (XIndexAccess) UnoRuntime.queryInterface( + XIndexAccess.class, sheetLinks); + + log.info("Number of Links should be 0"); + assertEquals("Number of Links should be 0", 0, xsheetlinks.getCount()); + + // Verify firstexternalsheet did not change + assertEquals("Expect first sheet formula should be =3*2", "=3*2", + SCUtil.getFormulaFromCell(firstexternalsheet, 1, 2)); + assertEquals("Expect first sheet text should be 6", "6", + SCUtil.getTextFromCell(firstexternalsheet, 1, 2)); + + // Save the document before close + SCUtil.save(scDocument); + + } + +} // end class \ No newline at end of file diff --git a/test/testuno/source/fvt/uno/sc/sheet/SheetBasicTest.java b/test/testuno/source/fvt/uno/sc/sheet/SheetBasicTest.java index 3ac4c7aba8..e493bed80d 100644 --- a/test/testuno/source/fvt/uno/sc/sheet/SheetBasicTest.java +++ b/test/testuno/source/fvt/uno/sc/sheet/SheetBasicTest.java @@ -26,6 +26,7 @@ import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.openoffice.test.common.Testspace; import org.openoffice.test.uno.UnoApp; @@ -315,7 +316,7 @@ public class SheetBasicTest { /** * test insert sheet from other file */ - // FIXME: locks up on update link confirmation dialog. + @Ignore("Bug #128536 locks up on update link confirmation dialog. replaced by InsertExcelSheetTest class.") @Test(timeout = 15000) public void insertSheetFromfile() throws Exception { // New a document source.xls, add value to 3 sheet