1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski package ifc.container;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski import lib.MultiMethodTest;
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski import com.sun.star.container.XIndexContainer;
29*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException;
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski /**
32*b1cdbd2cSJim Jagielski * Testing <code>com.sun.star.container.XIndexContainer</code>
33*b1cdbd2cSJim Jagielski * interface methods :
34*b1cdbd2cSJim Jagielski * <ul>
35*b1cdbd2cSJim Jagielski *  <li><code> insertByIndex()</code></li>
36*b1cdbd2cSJim Jagielski *  <li><code> removeByIndex()</code></li>
37*b1cdbd2cSJim Jagielski * </ul> <p>
38*b1cdbd2cSJim Jagielski *
39*b1cdbd2cSJim Jagielski * This test needs the following object relations :
40*b1cdbd2cSJim Jagielski * <ul>
41*b1cdbd2cSJim Jagielski *  <li> <code>'INSTANCE1', ..., 'INSTANCEN'</code> : N relations
42*b1cdbd2cSJim Jagielski *   which represents objects to be inserted. See below
43*b1cdbd2cSJim Jagielski *   for more information.</li>
44*b1cdbd2cSJim Jagielski *  <li> <code>'XIndexContainerINDEX'</code> : For internal test
45*b1cdbd2cSJim Jagielski *   usage. Contains current thread number. </li>
46*b1cdbd2cSJim Jagielski *  <li> Test environment variable <code>'THRCNT'</code> : number
47*b1cdbd2cSJim Jagielski *   of interface threads running concurently. </li>
48*b1cdbd2cSJim Jagielski * <ul> <p>
49*b1cdbd2cSJim Jagielski * XIndexComtainer needs n ObjectRelations "INSTANCEn" , where n=1, ...,
50*b1cdbd2cSJim Jagielski * THRCNT.<p>
51*b1cdbd2cSJim Jagielski * When this interface tested by different threads, it must use different
52*b1cdbd2cSJim Jagielski * instances to insert/remove - one for each thread.
53*b1cdbd2cSJim Jagielski * <p>
54*b1cdbd2cSJim Jagielski * That's why we use objRelation "XIndexComtainerINDEX" to store the number of
55*b1cdbd2cSJim Jagielski * last taken instance. If there is no such relation, it initialize with 1.
56*b1cdbd2cSJim Jagielski * <p>
57*b1cdbd2cSJim Jagielski * This ObjectRelations should be necessary to create an Object,
58*b1cdbd2cSJim Jagielski * which is insertable by insterByIndex()
59*b1cdbd2cSJim Jagielski * INSTANCEn are n Objectrelations so that every thread can isert it's own
60*b1cdbd2cSJim Jagielski * object. n depends on the variable THRCNT which and comes from API.INI
61*b1cdbd2cSJim Jagielski * <p>
62*b1cdbd2cSJim Jagielski * Why that:
63*b1cdbd2cSJim Jagielski * If you insert the same Object by insertByIndex() several times you
64*b1cdbd2cSJim Jagielski * don't insert the Object several times. The first insertByIndex() inserts
65*b1cdbd2cSJim Jagielski * the Object to the Container but all other insertByIndex() changes
66*b1cdbd2cSJim Jagielski * the Index in the Continer because it's the same Object. <p>
67*b1cdbd2cSJim Jagielski * Test is multithread compilant. <p>
68*b1cdbd2cSJim Jagielski * @see com.sun.star.container.XIndexContainer
69*b1cdbd2cSJim Jagielski */
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski public class _XIndexContainer extends MultiMethodTest {
72*b1cdbd2cSJim Jagielski     public XIndexContainer oObj = null;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski      int Index = 0;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     /**
77*b1cdbd2cSJim Jagielski     * First tries to insert proper object. Second tries to insert
78*b1cdbd2cSJim Jagielski     * null value. For each test thread different objects are inserted
79*b1cdbd2cSJim Jagielski     * on different indexes. For exmaple for the first started test index
80*b1cdbd2cSJim Jagielski     * is 0 and object is get from relation 'INCTANCE1', and so on. <p>
81*b1cdbd2cSJim Jagielski     * Has <b>OK</b> status if in the first case <code>getByIndex</code>
82*b1cdbd2cSJim Jagielski     * method returns non null value and in the second <code>
83*b1cdbd2cSJim Jagielski     * IndexOutOfBoundsException</code> was thrown.
84*b1cdbd2cSJim Jagielski     */
_insertByIndex()85*b1cdbd2cSJim Jagielski     public void _insertByIndex() {
86*b1cdbd2cSJim Jagielski         boolean result = true;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski         log.println("get ObjRelation(\"XIndexContainerINDEX\")");
89*b1cdbd2cSJim Jagielski         String sIndex = (String)tEnv.getObjRelation("XIndexContainerINDEX");
90*b1cdbd2cSJim Jagielski         if (sIndex == null) {
91*b1cdbd2cSJim Jagielski             log.println("No XIndexContainerINDEX - so set it to 1.");
92*b1cdbd2cSJim Jagielski             tEnv.addObjRelation("XIndexContainerINDEX", Integer.toString(1));
93*b1cdbd2cSJim Jagielski             Index = 1;
94*b1cdbd2cSJim Jagielski         } else {
95*b1cdbd2cSJim Jagielski             Index = Integer.parseInt(sIndex);
96*b1cdbd2cSJim Jagielski             Index++;
97*b1cdbd2cSJim Jagielski             tEnv.addObjRelation("XIndexContainerINDEX",
98*b1cdbd2cSJim Jagielski                 Integer.toString(Index));
99*b1cdbd2cSJim Jagielski         }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski         log.println("get ObjRelation(\"INSTANCE" + Index +"\")");
103*b1cdbd2cSJim Jagielski         Object oInstance = tEnv.getObjRelation("INSTANCE"+ Index);
104*b1cdbd2cSJim Jagielski         if (oInstance == null) {
105*b1cdbd2cSJim Jagielski             log.println("ObjRelation(\"INSTANCE" + Index +"\") Object n.a.");
106*b1cdbd2cSJim Jagielski         }
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski         log.println("testing insertByIndex(\"" + Index + "\")...");
109*b1cdbd2cSJim Jagielski         try {
110*b1cdbd2cSJim Jagielski             oObj.insertByIndex(Index, oInstance);
111*b1cdbd2cSJim Jagielski             result &= oObj.getByIndex(Index) != null ;
112*b1cdbd2cSJim Jagielski             log.println("insertByIndex(\""+Index+"\")...OK");
113*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
114*b1cdbd2cSJim Jagielski             log.println("insertByIndex(\""+Index+"\"): " + e + " FLASE");
115*b1cdbd2cSJim Jagielski             result = false;
116*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IllegalArgumentException e) {
117*b1cdbd2cSJim Jagielski             log.println("insertByIndex(\""+Index+"\"): " + e + " FLASE");
118*b1cdbd2cSJim Jagielski             result = false;
119*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
120*b1cdbd2cSJim Jagielski             log.println("insertByIndex(\""+Index+"\"): " + e + " FLASE");
121*b1cdbd2cSJim Jagielski             result = false;
122*b1cdbd2cSJim Jagielski         }
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         log.println("inserting a wrong Object occurs Exceptions ...");
125*b1cdbd2cSJim Jagielski         try {
126*b1cdbd2cSJim Jagielski             Object dummy = null;
127*b1cdbd2cSJim Jagielski             oObj.insertByIndex(0, dummy);
128*b1cdbd2cSJim Jagielski             log.println("No Exception: -> FALSE");
129*b1cdbd2cSJim Jagielski             result = false;
130*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IllegalArgumentException e) {
131*b1cdbd2cSJim Jagielski             log.println("Dummy-Exception: " + e + " -> OK");
132*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
133*b1cdbd2cSJim Jagielski             log.println("!!! Wrong Exception: " + e + " -> FAILED");
134*b1cdbd2cSJim Jagielski             result = false;
135*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
136*b1cdbd2cSJim Jagielski             log.println("!!! Wrong Exception: " + e + " -> FAILED");
137*b1cdbd2cSJim Jagielski             result = false;
138*b1cdbd2cSJim Jagielski         }
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski         tRes.tested("insertByIndex()", result);
141*b1cdbd2cSJim Jagielski     }
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     /**
144*b1cdbd2cSJim Jagielski     * Removes the element inserted by <code>insertByIndex</code> method test.
145*b1cdbd2cSJim Jagielski     * The number of elements is checked before and after removing.
146*b1cdbd2cSJim Jagielski     * Then tries to remove an element with invalid index and checks exceptions.
147*b1cdbd2cSJim Jagielski     * <p>
148*b1cdbd2cSJim Jagielski     * Has <b>OK</b> status if after removing number of elements decreases by
149*b1cdbd2cSJim Jagielski     * one and <code>IndexOutOfBoundsException</code> is thrown on invalid index
150*b1cdbd2cSJim Jagielski     * removing.
151*b1cdbd2cSJim Jagielski     * The following method tests are to be completed successfully before :
152*b1cdbd2cSJim Jagielski     * <ul>
153*b1cdbd2cSJim Jagielski     *  <li> <code> insertByIndex </code> : to have an object which can be
154*b1cdbd2cSJim Jagielski     * removed.</li>
155*b1cdbd2cSJim Jagielski     * </ul>
156*b1cdbd2cSJim Jagielski     */
_removeByIndex()157*b1cdbd2cSJim Jagielski     public void _removeByIndex() {
158*b1cdbd2cSJim Jagielski         requiredMethod("insertByIndex()");
159*b1cdbd2cSJim Jagielski         boolean result = true;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski         log.println("testing removeByIndex() ...");
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski         try {
164*b1cdbd2cSJim Jagielski             log.println("remove " +Index);
165*b1cdbd2cSJim Jagielski             int cnt1 = -1 , cnt2 = -1 ;
166*b1cdbd2cSJim Jagielski             synchronized (oObj) {
167*b1cdbd2cSJim Jagielski                 cnt1 = oObj.getCount() ;
168*b1cdbd2cSJim Jagielski                 oObj.removeByIndex(Index);
169*b1cdbd2cSJim Jagielski                 cnt2 = oObj.getCount() ;
170*b1cdbd2cSJim Jagielski             }
171*b1cdbd2cSJim Jagielski             log.println("Count before removing : " + cnt1 +
172*b1cdbd2cSJim Jagielski                 ", and after : " + cnt2) ;
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski             result &= cnt1 == cnt2 + 1 ;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski             log.println("1. removeByIndex(\""+Index+"\") ...OK");
177*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
178*b1cdbd2cSJim Jagielski             result = false;
179*b1cdbd2cSJim Jagielski             log.println("1. removeByIndex:(\""+Index+"\") " +
180*b1cdbd2cSJim Jagielski                 e + " - FAILED");
181*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
182*b1cdbd2cSJim Jagielski             result = false;
183*b1cdbd2cSJim Jagielski             log.println("1. removeByIndex:(\""+Index+"\") " +
184*b1cdbd2cSJim Jagielski                 e + " - FAILED");
185*b1cdbd2cSJim Jagielski         }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski         log.println("removing a non existent object to get an exception");
188*b1cdbd2cSJim Jagielski         try {
189*b1cdbd2cSJim Jagielski             oObj.removeByIndex(100);
190*b1cdbd2cSJim Jagielski             result = false;
191*b1cdbd2cSJim Jagielski             log.println("2. removeByIndex(): Exception expected! - FAILED");
192*b1cdbd2cSJim Jagielski         } catch (IndexOutOfBoundsException e) {
193*b1cdbd2cSJim Jagielski             log.println("2. removeByIndex(): Expected exception - OK");
194*b1cdbd2cSJim Jagielski             result &= true;
195*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.WrappedTargetException e) {
196*b1cdbd2cSJim Jagielski             result = false;
197*b1cdbd2cSJim Jagielski             log.println("2. removeByIndex(): Unexpected exception! - " +
198*b1cdbd2cSJim Jagielski                 e + " - FAILED");
199*b1cdbd2cSJim Jagielski         }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski         tRes.tested("removeByIndex()", result);
202*b1cdbd2cSJim Jagielski     }
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 
207