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 import util.ValueComparer; 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski import com.sun.star.container.XIndexReplace; 30*b1cdbd2cSJim Jagielski import com.sun.star.container.XNameContainer; 31*b1cdbd2cSJim Jagielski import com.sun.star.lang.IllegalArgumentException; 32*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException; 33*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski /** 37*b1cdbd2cSJim Jagielski * Testing <code>com.sun.star.container.XIndexReplace</code> 38*b1cdbd2cSJim Jagielski * interface methods : 39*b1cdbd2cSJim Jagielski * <ul> 40*b1cdbd2cSJim Jagielski * <li><code> replaceByIndex()</code></li> 41*b1cdbd2cSJim Jagielski * </ul> 42*b1cdbd2cSJim Jagielski * This test needs the following object relations : 43*b1cdbd2cSJim Jagielski * <ul> 44*b1cdbd2cSJim Jagielski * <li> <code>'INSTANCE1', ..., 'INSTANCEN'</code> : N relations 45*b1cdbd2cSJim Jagielski * which represents objects to be replaced with. See below 46*b1cdbd2cSJim Jagielski * for more information.</li> 47*b1cdbd2cSJim Jagielski * <li> <code>'XIndexReplaceINDEX'</code> : For internal test 48*b1cdbd2cSJim Jagielski * usage. Contains current thread number. </li> 49*b1cdbd2cSJim Jagielski * <li> Test environment variable <code>'THRCNT'</code> : number 50*b1cdbd2cSJim Jagielski * of interface threads running concurently. </li> 51*b1cdbd2cSJim Jagielski * <ul> <p> 52*b1cdbd2cSJim Jagielski * XIndexReplace needs n ObjectRelations "INSTANCEn" , where n = 1, ..., THRCNT. 53*b1cdbd2cSJim Jagielski * <p> 54*b1cdbd2cSJim Jagielski * When this interface tested by different threads, it must use different 55*b1cdbd2cSJim Jagielski * instances to replace - one for each thread.<p> 56*b1cdbd2cSJim Jagielski * That's why we use objRelation "XIndexReplaceINDEX" to store the number of 57*b1cdbd2cSJim Jagielski * last taken instance. If there is no such relation, it initialize with 1. 58*b1cdbd2cSJim Jagielski * <p> 59*b1cdbd2cSJim Jagielski * This ObjectRelations should be necessary to create an Object, 60*b1cdbd2cSJim Jagielski * which is can be replaced by index 61*b1cdbd2cSJim Jagielski * INSTANCEn are n Objectrelations so that every thread can isert it's own 62*b1cdbd2cSJim Jagielski * object. n depends on the variable THRCNT which and comes from API.INI 63*b1cdbd2cSJim Jagielski * <p> 64*b1cdbd2cSJim Jagielski * Why that: 65*b1cdbd2cSJim Jagielski * If you insert the same Object by replaceByIndex() several times you 66*b1cdbd2cSJim Jagielski * don't insert the Object several times. The first replaceByIndex() inserts 67*b1cdbd2cSJim Jagielski * the Object to the Container but all other replaceByIndex() changes 68*b1cdbd2cSJim Jagielski * the Index in the Continer because it's the same Object. <p> 69*b1cdbd2cSJim Jagielski * Test is multithread compilant. <p> 70*b1cdbd2cSJim Jagielski * @see com.sun.star.container.XIndexReplace 71*b1cdbd2cSJim Jagielski */ 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski public class _XIndexReplace extends MultiMethodTest { 74*b1cdbd2cSJim Jagielski public XIndexReplace oObj = null; 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski /** 77*b1cdbd2cSJim Jagielski * Primarily tries to replace elements in a proper way : 78*b1cdbd2cSJim Jagielski * replaces the first, middle and the last element then 79*b1cdbd2cSJim Jagielski * checks if elements were properly replaced. 80*b1cdbd2cSJim Jagielski * Then wrong parameters are passed : invalid index and 81*b1cdbd2cSJim Jagielski * null value for replacing, and test checks for proper 82*b1cdbd2cSJim Jagielski * exceptions to be thrown. <p> 83*b1cdbd2cSJim Jagielski * In different threads it replaces elements with different 84*b1cdbd2cSJim Jagielski * objects. 85*b1cdbd2cSJim Jagielski * Has <b>OK</b> status if in the first (correct) case 86*b1cdbd2cSJim Jagielski * elements were successfully replaced (i.e. values got 87*b1cdbd2cSJim Jagielski * after replacing must be equal to those replaced with), 88*b1cdbd2cSJim Jagielski * and in the second case proper exceptions were thrown. 89*b1cdbd2cSJim Jagielski */ _replaceByIndex()90*b1cdbd2cSJim Jagielski public void _replaceByIndex() { 91*b1cdbd2cSJim Jagielski boolean result = true; 92*b1cdbd2cSJim Jagielski Object old = null; 93*b1cdbd2cSJim Jagielski Object oInstance = null; 94*b1cdbd2cSJim Jagielski int Index = 0; 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski //get for every thread its own Object to insert it 97*b1cdbd2cSJim Jagielski log.println("get ObjRelation(\"XIndexReplaceINDEX\")"); 98*b1cdbd2cSJim Jagielski String sIndex = (String)tEnv.getObjRelation("XIndexReplaceINDEX"); 99*b1cdbd2cSJim Jagielski if (sIndex == null) { 100*b1cdbd2cSJim Jagielski log.println("No XIndexReplaceINDEX - so set it to 1."); 101*b1cdbd2cSJim Jagielski tEnv.addObjRelation("XIndexReplaceINDEX", Integer.toString(1)); 102*b1cdbd2cSJim Jagielski Index = 1; 103*b1cdbd2cSJim Jagielski } else { 104*b1cdbd2cSJim Jagielski Index = Integer.parseInt(sIndex); 105*b1cdbd2cSJim Jagielski Index++; 106*b1cdbd2cSJim Jagielski tEnv.addObjRelation("XIndexReplaceINDEX", Integer.toString(Index)); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski log.println("get ObjRelation(\"INSTANCE" + Index +"\")"); 111*b1cdbd2cSJim Jagielski oInstance = tEnv.getObjRelation("INSTANCE"+ Index); 112*b1cdbd2cSJim Jagielski if (oInstance == null) { 113*b1cdbd2cSJim Jagielski log.println("ObjRelation(\"INSTANCE" + Index +"\") Object n.a."); 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski log.println("testing replaceByIndex(0)..."); 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski try { 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski log.println("Getting old object"); 121*b1cdbd2cSJim Jagielski old = oObj.getByIndex(0); 122*b1cdbd2cSJim Jagielski oObj.replaceByIndex(0, oInstance); 123*b1cdbd2cSJim Jagielski result = !(oObj.getByIndex(0)).equals(old); 124*b1cdbd2cSJim Jagielski result = ! ValueComparer.equalValue(oObj,old); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IndexOutOfBoundsException e) { 127*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 128*b1cdbd2cSJim Jagielski result = false; 129*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IllegalArgumentException e) { 130*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 131*b1cdbd2cSJim Jagielski result = false; 132*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.WrappedTargetException e) { 133*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 134*b1cdbd2cSJim Jagielski result = false; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski log.println("replace with a wrong Object occurs Exceptions ..."); 139*b1cdbd2cSJim Jagielski try { 140*b1cdbd2cSJim Jagielski oObj.replaceByIndex(999, oInstance); 141*b1cdbd2cSJim Jagielski result = false; 142*b1cdbd2cSJim Jagielski log.println("1. replaceByIndex(): Exception expected! - FAILED"); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski XNameContainer xNC = (XNameContainer) 146*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XNameContainer.class, oObj) ; 147*b1cdbd2cSJim Jagielski String[] names = xNC.getElementNames() ; 148*b1cdbd2cSJim Jagielski log.println("Element names :") ; 149*b1cdbd2cSJim Jagielski for (int i = 0; i<names.length; i++) { 150*b1cdbd2cSJim Jagielski log.println(" '" + names[i] + "'") ; 151*b1cdbd2cSJim Jagielski } 152*b1cdbd2cSJim Jagielski } catch (IndexOutOfBoundsException e) { 153*b1cdbd2cSJim Jagielski log.println("1. replaceByIndex(): Expected exception - OK"); 154*b1cdbd2cSJim Jagielski result &= true; 155*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IllegalArgumentException e) { 156*b1cdbd2cSJim Jagielski result = false; 157*b1cdbd2cSJim Jagielski log.println("1. replaceByIndex(): Unexpected exception! - " + 158*b1cdbd2cSJim Jagielski e + " - FAILED"); 159*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.WrappedTargetException e) { 160*b1cdbd2cSJim Jagielski result = false; 161*b1cdbd2cSJim Jagielski log.println("1. replaceByIndex(): Unexpected exception! - " + 162*b1cdbd2cSJim Jagielski e + " - FAILED"); 163*b1cdbd2cSJim Jagielski } 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski log.println("replace with a wrong Object occurs Exceptions ..."); 166*b1cdbd2cSJim Jagielski try { 167*b1cdbd2cSJim Jagielski oObj.replaceByIndex(0, null); 168*b1cdbd2cSJim Jagielski result = false; 169*b1cdbd2cSJim Jagielski log.println("2. replaceByIndex(): Exception expected! - FAILED"); 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski XNameContainer xNC = (XNameContainer) 173*b1cdbd2cSJim Jagielski UnoRuntime.queryInterface(XNameContainer.class, oObj) ; 174*b1cdbd2cSJim Jagielski String[] names = xNC.getElementNames() ; 175*b1cdbd2cSJim Jagielski log.println("Element names :") ; 176*b1cdbd2cSJim Jagielski for (int i = 0; i<names.length; i++) { 177*b1cdbd2cSJim Jagielski log.println(" '" + names[i] + "'") ; 178*b1cdbd2cSJim Jagielski } 179*b1cdbd2cSJim Jagielski } catch (IllegalArgumentException e) { 180*b1cdbd2cSJim Jagielski log.println("2. replaceByIndex(): Expected exception - OK"); 181*b1cdbd2cSJim Jagielski result &= true; 182*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.WrappedTargetException e) { 183*b1cdbd2cSJim Jagielski result = false; 184*b1cdbd2cSJim Jagielski log.println("2. replaceByIndex(): Unexpected exception! - " + 185*b1cdbd2cSJim Jagielski e + " - FAILED"); 186*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IndexOutOfBoundsException e) { 187*b1cdbd2cSJim Jagielski result = false; 188*b1cdbd2cSJim Jagielski log.println("2. replaceByIndex(): Unexpected exception! - " + 189*b1cdbd2cSJim Jagielski e + " - FAILED"); 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski log.println("replace with the old object"); 193*b1cdbd2cSJim Jagielski try { 194*b1cdbd2cSJim Jagielski oObj.replaceByIndex(0, old); 195*b1cdbd2cSJim Jagielski } catch (IllegalArgumentException e) { 196*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 197*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.WrappedTargetException e) { 198*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 199*b1cdbd2cSJim Jagielski } catch (com.sun.star.lang.IndexOutOfBoundsException e) { 200*b1cdbd2cSJim Jagielski e.printStackTrace(log) ; 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski tRes.tested("replaceByIndex()", result); 204*b1cdbd2cSJim Jagielski } 205*b1cdbd2cSJim Jagielski } 206*b1cdbd2cSJim Jagielski 207*b1cdbd2cSJim Jagielski 208