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