1 /*
2  * This file is part of the LibreOffice project.
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  *
8  * This file incorporates work covered by the following license notice:
9  *
10  *   Licensed to the Apache Software Foundation (ASF) under one or more
11  *   contributor license agreements. See the NOTICE file distributed
12  *   with this work for additional information regarding copyright
13  *   ownership. The ASF licenses this file to you under the Apache
14  *   License, Version 2.0 (the "License"); you may not use this file
15  *   except in compliance with the License. You may obtain a copy of
16  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
17  */
18 
19 package ifc.text;
20 
21 import lib.MultiMethodTest;
22 import lib.Status;
23 import lib.StatusException;
24 import util.ValueComparer;
25 
26 import com.sun.star.text.XAutoTextGroup;
27 import com.sun.star.text.XTextRange;
28 
29 /**
30  * Testing <code>com.sun.star.text.XAutoTextGroup</code>
31  * interface methods :
32  * <ul>
33  *  <li><code> getTitles()</code></li>
34  *  <li><code> renameByName()</code></li>
35  *  <li><code> insertNewByName()</code></li>
36  *  <li><code> removeByName()</code></li>
37  * </ul> <p>
38  * This test needs the following object relations :
39  * <ul>
40  *  <li> <code>'TextRange'</code> (of type <code>XTextRange</code>):
41  *   the range for which an entry is added. </li>
42  * <ul> <p>
43  * Test is multithread compliant. <p>
44  * @see com.sun.star.text.XAutoTextGroup
45  */
46 public class _XAutoTextGroup extends MultiMethodTest {
47 
48     public XAutoTextGroup oObj = null;
49 
50     /**
51      * Unique number among different interface threads.
52      */
53     protected static int uniq = 0 ;
54 
55     /**
56      * Unique string for AutoTextEntry names among different
57      * threads.
58      */
59     protected String str = null ;
60 
61     /**
62      * Prefix for unique string.
63      * @see #str
64      */
65     protected static final String pref = "XAutoTextGroup" ;
66     protected XTextRange oRange = null;
67 
68     /**
69      * Constructs a unique string for current interface thread
70      * for naming purposes. All old entries which names are
71      * started with prefix used for entry names, are deleted
72      * from the group (they can remain after previous unsuccessful
73      * test runs). The relation is obtained.
74      *
75      * @throws StatusException if the relation is not found.
76      */
77     @Override
before()78     public void before() {
79         str = pref + uniq++ ;
80         String[] names = oObj.getElementNames() ;
81         for (int i = 0; i < names.length; i++) {
82             log.println("  " + names[i]);
83             if (names[i].toUpperCase().indexOf(pref.toUpperCase()) > 0) {
84                 try {
85                     log.println("  ... removing ...");
86                     oObj.removeByName(names[i]) ;
87                 } catch (com.sun.star.container.NoSuchElementException e) {
88                     log.println("Element '" + names[i] + "' not found.");
89                 }
90             }
91         }
92 
93         oRange = (XTextRange) tEnv.getObjRelation("TextRange");
94         if (oRange == null) {
95             throw new StatusException(Status.failed("No relation found")) ;
96         }
97     }
98 
99     /**
100      * Test calls the method. <p>
101      * Has <b> OK </b> status if the method returns not
102      * <code>null</code> value.
103      */
_getTitles()104     public void _getTitles() {
105 
106         String[] titles = oObj.getTitles();
107         tRes.tested("getTitles()",titles != null);
108     }
109 
110     /**
111      * Firsts inserts a new <code>AutoTextEntry</code> using a range
112      * from relation, entry titles are checked before and after
113      * insertion, second tries to add an entry with the same name. <p>
114      *
115      * Has <b>OK</b> status if in the first case titles are changed,
116      * and in the second case <code>ElementExistException</code> is
117      * thrown.
118      */
_insertNewByName()119     public void _insertNewByName() {
120 
121         boolean result = false;
122 
123         try {
124             String[] before = oObj.getTitles();
125             oObj.insertNewByName(str, "For " + str,oRange);
126             String[] after = oObj.getTitles();
127             result = !util.ValueComparer.equalValue(before, after);
128         }
129         catch (com.sun.star.container.ElementExistException ex) {
130             log.println("Exception occurred while testing insertNewByName");
131             ex.printStackTrace(log);
132             result = false;
133         }
134 
135         try {
136             oObj.insertNewByName(str, "For " + str, oRange);
137             log.println(
138                 "com::sun::star::container::ElementExistsException wasn't thrown");
139             oObj.removeByName(str);
140             result &= false;
141         } catch (com.sun.star.container.ElementExistException ex) {
142             result &= true;
143         } catch (com.sun.star.container.NoSuchElementException ex) {
144             log.println("Wrong exception was thrown :");
145             ex.printStackTrace(log);
146             result &= false;
147         }
148 
149         tRes.tested("insertNewByName()",result);
150 
151     }
152 
153     /**
154      * Removes <code>AutoTextEntry</code> added before and checks
155      * titles of the group before and after removing. <p>
156      * Has <b> OK </b> status if titles are not equal before and after
157      * removing and no exceptions were thrown. <p>
158      * The following method tests are to be completed successfully before :
159      * <ul>
160      *  <li> <code> insertNewByName() </code> : the entry is
161      *   inserted here. </li>
162      * </ul>
163      */
_removeByName()164     public void _removeByName() {
165         requiredMethod("insertNewByName()") ;
166 
167         try {
168             String[] before = oObj.getTitles();
169             oObj.removeByName(str);
170             String[] after = oObj.getTitles();
171             tRes.tested("removeByName()",
172                 !ValueComparer.equalValue(before,after));
173         }
174         catch (com.sun.star.container.NoSuchElementException ex) {
175             log.println("Exception occurred while testing removeByName");
176             ex.printStackTrace(log);
177             tRes.tested("removeByName()",false);
178         }
179     }
180 
181     /**
182      * Three cases are tested here :
183      * <ol>
184      *   <li> Trying to rename an entry to a name, which already
185      *     exists in the group. <code>ElementExistException</code>
186      *     must be thrown. </li>
187      *   <li> Trying to rename an element with non-existing name.
188      *     <code>IllegalArgumentException</code> must be thrown.</li>
189      *   <li> The normal situation : no exceptions must be thrown
190      *     and element with a new name must arise. </li>
191      * </ol>
192      *
193      * Has <b>OK</b> status if all three cases were completed successfully.
194      */
_renameByName()195     public void _renameByName() {
196         boolean result = false;
197 
198         try {
199             oObj.getTitles();
200             oObj.getElementNames();
201             oObj.insertNewByName(str,"For " + str,oRange);
202             oObj.insertNewByName(str + "dup","For " + str,oRange);
203             oObj.getTitles();
204             oObj.getElementNames();
205             result = true;
206         } catch (com.sun.star.container.ElementExistException e) {
207             log.println("Unexpected exception occurred :") ;
208             e.printStackTrace(log);
209         } finally {
210             if (!result) {
211                 try {
212                     oObj.removeByName(str);
213                 } catch (com.sun.star.container.NoSuchElementException e) {}
214                 try {
215                     oObj.removeByName(str + "dup");
216                 } catch (com.sun.star.container.NoSuchElementException e) {}
217                 tRes.tested("renameByName()", false);
218             }
219         }
220 
221 
222         try {
223             oObj.renameByName(str, str + "dup", "For "+str);
224             log.println(
225                 "com::sun::star::container::ElementExistsException wasn't thrown");
226             result = false;
227         } catch (com.sun.star.container.ElementExistException e) {
228             result = true;
229         } catch (com.sun.star.io.IOException e) {
230             log.println("Wrong exception was thrown :");
231             e.printStackTrace(log);
232             result = false;
233         } catch (com.sun.star.lang.IllegalArgumentException e) {
234             log.println("Wrong exception was thrown :");
235             e.printStackTrace(log);
236             result = false;
237         } finally {
238             try {
239                 oObj.removeByName(str);
240             } catch (com.sun.star.container.NoSuchElementException e) {}
241             try {
242                 oObj.removeByName(str + "dup");
243             } catch (com.sun.star.container.NoSuchElementException e) {}
244         }
245 
246         try {
247             oObj.renameByName("~"+str,str,str);
248             log.println(
249                 "com::sun::star::lang::IllegalArgumentException wasn't thrown");
250             result &= false;
251         } catch (com.sun.star.lang.IllegalArgumentException ex) {
252             result &= true;
253         } catch (com.sun.star.container.ElementExistException e) {
254             log.println("Unexpected exception :") ;
255             e.printStackTrace(log) ;
256             result = false ;
257         } catch (com.sun.star.io.IOException e) {
258             log.println("Unexpected exception :") ;
259             e.printStackTrace(log) ;
260             result = false ;
261         } finally {
262             try {
263                 oObj.removeByName(str);
264             } catch (com.sun.star.container.NoSuchElementException e) {}
265         }
266 
267         try {
268             oObj.insertNewByName(str, "For " + str, oRange);
269 
270             oObj.renameByName(str,str+"a",str+"b");
271             result &= oObj.hasByName(str + "a");
272         } catch (com.sun.star.container.ElementExistException ex) {
273             log.println("Exception occurred while testing renameByName");
274             ex.printStackTrace(log);
275             result &=false;
276         } catch (com.sun.star.lang.IllegalArgumentException ex) {
277             log.println("Exception occurred while testing renameByName");
278             ex.printStackTrace(log);
279             result &=false;
280         } catch (com.sun.star.io.IOException ex) {
281             log.println("Exception occurred while testing renameByName");
282             ex.printStackTrace(log);
283             result &=false;
284         } finally {
285             try {
286                 oObj.removeByName(str);
287             } catch (com.sun.star.container.NoSuchElementException e) {}
288             try {
289                 oObj.removeByName(str + "a");
290             } catch (com.sun.star.container.NoSuchElementException e) {}
291         }
292 
293         tRes.tested("renameByName()",result);
294 
295     }
296 
297 }  // finish class _XAutoTextGroup
298 
299 
300