xref: /AOO41X/test/testuno/source/fvt/uno/sw/crossreference/CheckCrossReferences.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 
22 package fvt.uno.sw.crossreference;
23 
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 
27 import org.junit.After;
28 import org.junit.AfterClass;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.openoffice.test.common.Testspace;
32 import org.openoffice.test.uno.UnoApp;
33 
34 import com.sun.star.beans.XPropertySet;
35 import com.sun.star.container.XEnumeration;
36 import com.sun.star.container.XEnumerationAccess;
37 import com.sun.star.container.XNamed;
38 import com.sun.star.lang.XMultiServiceFactory;
39 import com.sun.star.text.ReferenceFieldPart;
40 import com.sun.star.text.ReferenceFieldSource;
41 import com.sun.star.text.XTextContent;
42 import com.sun.star.text.XTextDocument;
43 import com.sun.star.text.XTextField;
44 import com.sun.star.text.XTextFieldsSupplier;
45 import com.sun.star.text.XTextRange;
46 import com.sun.star.uno.UnoRuntime;
47 import com.sun.star.util.XRefreshable;
48 
49 /**
50  *
51  */
52 public class CheckCrossReferences {
53 
54     private XEnumeration xParaEnum;
55     private XEnumeration xPortionEnum;
56     private com.sun.star.util.XRefreshable xFldsRefresh;
57     private final static UnoApp app = new UnoApp();
58 
59     private XTextDocument document = null;
60 
61     @Before
setUpDocument()62     public void setUpDocument() throws Exception {
63         app.start();
64         document = (XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, app.loadDocument(Testspace.prepareData("uno/sw/CheckCrossReferences.odt")));
65     }
66 
67     @After
tearDownDocument()68     public void tearDownDocument() {
69         app.closeDocument(document);
70     }
71 
72     @AfterClass
tearDownConnection()73     public static void tearDownConnection() throws InterruptedException, Exception {
74         app.close();
75     }
76 
getNextField()77     public XTextField getNextField() throws Exception {
78         if (xPortionEnum != null) {
79             while (xPortionEnum.hasMoreElements()) {
80                 XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement());
81                 final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString();
82                 if (sPortionType.equals("TextField"))
83                     return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField"));
84             }
85         }
86 
87         while (xParaEnum.hasMoreElements()) {
88             XEnumerationAccess aPara = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, xParaEnum.nextElement());
89             xPortionEnum = aPara.createEnumeration();
90             while (xPortionEnum.hasMoreElements()) {
91                 XPropertySet xPortionProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xPortionEnum.nextElement());
92                 final String sPortionType = xPortionProps.getPropertyValue("TextPortionType").toString();
93                 if (sPortionType.equals("TextField"))
94                     return (XTextField) UnoRuntime.queryInterface(XTextField.class, xPortionProps.getPropertyValue("TextField"));
95             }
96         }
97 
98         return null;
99     }
100 
getFieldProps(XTextField xField)101     public XPropertySet getFieldProps(XTextField xField) {
102         XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xField);
103         return xProps;
104     }
105 
checkField(XTextField xField, XPropertySet xProps, short nFormat, String aExpectedFldResult)106     public void checkField(XTextField xField, XPropertySet xProps, short nFormat, String aExpectedFldResult) throws Exception {
107         // set requested format
108         xProps.setPropertyValue("ReferenceFieldPart", new Short(nFormat));
109         // refresh fields in order to get new format applied
110         xFldsRefresh.refresh();
111         String aFldResult = xField.getPresentation(false);
112         assertEquals("set reference field format doesn't result in correct field result", aExpectedFldResult, aFldResult);
113     }
114 
115     @Test
checkCrossReferences()116     public void checkCrossReferences() throws Exception {
117         // setup paragraph enumeration
118         xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration();
119 
120         // get field refresher
121         XTextFieldsSupplier xFieldSupp = (XTextFieldsSupplier) UnoRuntime.queryInterface(XTextFieldsSupplier.class, document);
122         xFldsRefresh = (XRefreshable) UnoRuntime.queryInterface(XRefreshable.class, xFieldSupp.getTextFields());
123 
124         // strings for checking
125         final String FldResult1 = "*i*";
126         final String FldResult2 = "+b+*i*";
127         final String FldResult3 = "-1-+b+*i*";
128         final String FldResult4 = "1.";
129         final String FldResult5 = " 1.";
130         final String FldResult6 = "A. 1.";
131 
132         // variables for current field
133         XTextField xField = null;
134         XPropertySet xProps = null;
135 
136         xField = getNextField();
137         xProps = getFieldProps(xField);
138         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult2);
139         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1);
140         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3);
141 
142         xField = getNextField();
143         xProps = getFieldProps(xField);
144         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult1);
145         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1);
146         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3);
147 
148         xField = getNextField();
149         xProps = getFieldProps(xField);
150         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult3);
151         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult1);
152         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult3);
153 
154         xField = getNextField();
155         xProps = getFieldProps(xField);
156         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult5);
157         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4);
158         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6);
159 
160         xField = getNextField();
161         xProps = getFieldProps(xField);
162         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult4);
163         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4);
164         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6);
165 
166         xField = getNextField();
167         xProps = getFieldProps(xField);
168         checkField(xField, xProps, ReferenceFieldPart.NUMBER, FldResult6);
169         checkField(xField, xProps, ReferenceFieldPart.NUMBER_NO_CONTEXT, FldResult4);
170         checkField(xField, xProps, ReferenceFieldPart.NUMBER_FULL_CONTEXT, FldResult6);
171 
172         // insert a certain cross-reference bookmark and a reference field to this bookmark
173 
174         // restart paragraph enumeration
175         xParaEnum = ((XEnumerationAccess)UnoRuntime.queryInterface(XEnumerationAccess.class, document.getText())).createEnumeration();
176 
177         // iterate on the paragraphs to find certain paragraph to insert the bookmark
178         XTextRange xParaTextRange = null;
179         while (xParaEnum.hasMoreElements()) {
180             xParaTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement());
181             if (xParaTextRange.getString().equals("J")) {
182                 break;
183             } else {
184                 xParaTextRange = null;
185             }
186         }
187         assertNotNull("Cannot find paragraph to insert cross-reference bookmark.", xParaTextRange);
188 
189         // insert bookmark
190         XMultiServiceFactory xFac = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, document);
191         final String cBookmarkName = "__RefNumPara__47114711";
192         XTextContent xBookmark = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.Bookmark"));
193 
194         XNamed xName = (XNamed) UnoRuntime.queryInterface(XNamed.class, xBookmark);
195         xName.setName(cBookmarkName);
196         xBookmark.attach(xParaTextRange.getStart());
197 
198         // insert reference field, which references the inserted bookmark
199         XTextContent xNewField = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, xFac.createInstance("com.sun.star.text.textfield.GetReference"));
200 
201         XPropertySet xFieldProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xNewField);
202         xFieldProps.setPropertyValue("ReferenceFieldPart", new Short(ReferenceFieldPart.TEXT));
203         xFieldProps.setPropertyValue("ReferenceFieldSource", new Short(ReferenceFieldSource.BOOKMARK));
204         xFieldProps.setPropertyValue("SourceName", cBookmarkName);
205         XTextRange xFieldTextRange = (XTextRange) UnoRuntime.queryInterface(XTextRange.class, xParaEnum.nextElement());
206         xNewField.attach(xFieldTextRange.getEnd());
207         xFldsRefresh.refresh();
208 
209         // check inserted reference field
210         xField = (XTextField) UnoRuntime.queryInterface(XTextField.class, xNewField);
211         assertEquals("inserted reference field doesn't has correct field result", "J", xField.getPresentation(false));
212         xParaTextRange.getStart().setString("Hallo new bookmark: ");
213         xFldsRefresh.refresh();
214         assertEquals("inserted reference field doesn't has correct field result", "Hallo new bookmark: J", xField.getPresentation(false));
215 
216     }
217 
218 }
219