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 com.sun.star.lib.uno.helper; 20 21 import com.sun.star.uno.XWeak; 22 import com.sun.star.lang.XTypeProvider; 23 import com.sun.star.lib.uno.environments.java.java_environment; 24 25 import java.util.ArrayList; 26 import java.util.Iterator; 27 import java.util.List; 28 import java.util.ListIterator; 29 import java.util.NoSuchElementException; 30 31 import java.util.logging.Level; 32 import java.util.logging.Logger; 33 34 import static org.junit.Assert.assertArrayEquals; 35 import static org.junit.Assert.assertEquals; 36 import static org.junit.Assert.assertFalse; 37 import static org.junit.Assert.assertNotNull; 38 import static org.junit.Assert.assertSame; 39 import static org.junit.Assert.assertTrue; 40 import static org.junit.Assert.fail; 41 import org.junit.Before; 42 import org.junit.Test; 43 44 public class InterfaceContainer_Test 45 { 46 private static final Logger logger = Logger.getLogger(InterfaceContainer_Test.class.getName()); 47 java_environment env= new java_environment(null); 48 /** Creates a new instance of InterfaceContainerTest */ 49 AWeakBase obj1,obj2,obj3,obj4; 50 Object proxyObj1Weak1; 51 Object proxyObj3Weak1; 52 Object proxyObj3Weak2; 53 Object proxyObj3TypeProv; 54 Object proxyObj2TypeProv; 55 //contains original objects 56 List<Object> list1; 57 //contains original objects + proxies 58 List<Object> list2; 59 //contains original object + proxies + null value 60 List<Object> list3; 61 62 /** Class variables are initialized before each Test method */ setUp()63 @Before public void setUp() throws Exception 64 { 65 obj1= new AWeakBase(); 66 obj2= new AWeakBase(); 67 obj3= new AWeakBase(); 68 obj4= new AWeakBase(); 69 70 proxyObj1Weak1= ProxyProvider.createProxy(obj1, XWeak.class); 71 proxyObj3Weak1= ProxyProvider.createProxy(obj3, XWeak.class); 72 proxyObj3Weak2= ProxyProvider.createProxy(obj3, XWeak.class); 73 assertNotNull(proxyObj1Weak1); 74 assertNotNull(proxyObj3Weak1); 75 assertNotNull(proxyObj3Weak2); 76 77 proxyObj2TypeProv= ProxyProvider.createProxy(obj2, XTypeProvider.class); 78 proxyObj3TypeProv= ProxyProvider.createProxy(obj3, XTypeProvider.class); 79 assertNotNull(proxyObj2TypeProv); 80 assertNotNull(proxyObj3TypeProv); 81 82 list1= new ArrayList<Object>(); 83 list1.add(obj1); 84 list1.add(obj2); 85 list1.add(obj3); 86 87 list2= new ArrayList<Object>(); 88 list2.add(obj1); 89 list2.add(proxyObj2TypeProv); 90 list2.add(proxyObj3TypeProv); 91 92 list3= new ArrayList<Object>(); 93 list3.add(obj1); 94 list3.add(null); 95 list3.add(proxyObj2TypeProv); 96 list3.add(proxyObj3Weak1); 97 } 98 99 /** Tests add(object), size(), clear(); 100 */ add()101 @Test public void add() throws Exception 102 { 103 logger.log(Level.INFO, "Testing List.add(Object), List.size(), List.clear(), List.isEmpty()"); 104 InterfaceContainer cont= new InterfaceContainer(); 105 106 assertEquals(cont.size(), 0); 107 108 assertTrue(cont.add(obj1)); 109 assertEquals(cont.size(), 1); 110 111 assertTrue(cont.add(obj1)); // add the same object again 112 assertEquals(cont.size(), 2); 113 114 assertTrue(cont.add(proxyObj3TypeProv)); 115 assertEquals(cont.size(), 3); 116 117 assertFalse(cont.isEmpty()); 118 cont.clear(); 119 assertEquals(cont.size(), 0); 120 assertTrue(cont.isEmpty()); 121 } 122 123 /**Tests list.addAll(Collection c), list.addAll(int index, Collection c) 124 */ listConstructors()125 @Test public void listConstructors() throws Exception 126 { 127 logger.log(Level.INFO, "Testing Constructors of InterfaceContainer"); 128 InterfaceContainer cont= new InterfaceContainer(100); 129 130 assertEquals(cont.elementData.length, 100); 131 } 132 trimToSize()133 @Test public void trimToSize() throws Exception 134 { 135 logger.log(Level.INFO, "Testing InterfaceContainer.trimToSize"); 136 InterfaceContainer cont= new InterfaceContainer(100); 137 138 cont.trimToSize(); 139 assertTrue(cont.isEmpty()); 140 cont= new InterfaceContainer(10); 141 cont.addAll(list1); 142 cont.trimToSize(); 143 assertEquals(cont.elementData.length, list1.size()); 144 } 145 ensureCapacity()146 @Test public void ensureCapacity() throws Exception 147 { 148 logger.log(Level.INFO, "Testing InterfaceContainer.ensureCapacity"); 149 InterfaceContainer cont= new InterfaceContainer(10); 150 151 cont.ensureCapacity(9); 152 assertTrue(cont.elementData.length >= 9); 153 154 cont.ensureCapacity(11); 155 assertTrue(cont.elementData.length >= 11); 156 } 157 addAll()158 @Test public void addAll() throws Exception 159 { 160 logger.log(Level.INFO, "Testing List.addAll(Collection c), List.addAll(int index, Collection c)"); 161 InterfaceContainer cont= new InterfaceContainer(); 162 163 assertTrue(cont.addAll(list1)); 164 assertEquals(cont.size(), list1.size()); 165 for (int c= 0; c < cont.size(); c++) 166 { 167 assertSame(list1.get(c), cont.get(c)); 168 } 169 assertTrue(cont.add(obj1)); 170 assertTrue(cont.addAll(1, list2)); 171 assertSame(cont.get(0), list1.get(0)); 172 assertSame(cont.get(1), list2.get(0)); 173 assertSame(cont.get(2), list2.get(1)); 174 assertSame(cont.get(3), list2.get(2)); 175 assertSame(cont.get(4), list1.get(1)); 176 assertSame(cont.get(5), list1.get(2)); 177 assertSame(cont.get(6), obj1); 178 179 cont.clear(); 180 cont.addAll(list3); 181 // the null element in list3 at index 1 is not added to cont 182 assertSame(cont.get(0), list3.get(0)); 183 assertSame(cont.get(1), list3.get(2)); 184 assertSame(cont.get(2), list3.get(3)); 185 } 186 187 /** Tests List.add(int index, Object element), List.get(int index) 188 */ get()189 @Test public void get() throws Exception 190 { 191 logger.log(Level.INFO, "Testing List.add(int index, Object element), List.get(int index)"); 192 InterfaceContainer cont= new InterfaceContainer(); 193 194 cont.add(0, obj1); 195 cont.add(1, obj2); 196 cont.add(1, proxyObj3Weak1); 197 cont.add(3, obj3); 198 199 assertSame(cont.get(0), obj1); 200 assertSame(cont.get(1), proxyObj3Weak1); 201 assertSame(cont.get(2), obj2); 202 assertSame(cont.get(3), obj3); 203 204 try { 205 cont.add(5, obj1); 206 fail("IndexOutOfBoundsException expected"); 207 } catch (IndexOutOfBoundsException indexOutOfBoundsException) { 208 logger.log(Level.FINE, "IndexOutOfBoundsException caught"); 209 } 210 } 211 212 /** Tests List.contains 213 */ contains()214 @Test public void contains() throws Exception 215 { 216 logger.log(Level.INFO, "Testing List.contains()"); 217 InterfaceContainer cont= new InterfaceContainer(); 218 219 assertFalse(cont.contains(obj1)); // nothing in the list 220 221 cont.add(obj1); 222 cont.add(proxyObj2TypeProv); 223 cont.add(proxyObj3TypeProv); 224 225 assertTrue(cont.contains(obj1)); 226 assertTrue(cont.contains(obj2)); 227 assertTrue(cont.contains(proxyObj3Weak1)); 228 assertTrue(cont.contains(proxyObj3Weak2)); 229 assertTrue(cont.contains(proxyObj1Weak1)); 230 assertTrue(cont.contains(obj3)); 231 assertFalse(cont.contains(null)); 232 } 233 234 /** Tests List.containsAll 235 */ containsAll()236 @Test public void containsAll() throws Exception 237 { 238 logger.log(Level.INFO, "Testing List.containsAll"); 239 InterfaceContainer cont= new InterfaceContainer(); 240 241 cont.addAll(list1); 242 assertTrue(cont.containsAll(list1)); 243 244 cont.clear(); 245 cont.addAll(list2); 246 assertTrue(cont.containsAll(list2)); 247 248 cont.clear(); 249 cont.addAll(list3); // the null element in list3 is not added to cont 250 assertFalse(cont.containsAll(list3)); 251 252 cont.clear(); 253 for( int x= 0; x < 6; x++) 254 cont.add(obj4); 255 assertFalse(cont.contains(list1)); 256 257 cont.add(1, list1.get(0)); 258 cont.add(3, list1.get(1)); 259 cont.add(5, list1.get(2)); 260 assertFalse(cont.contains(list1)); 261 } 262 /** Tests List.indexOf, List.lastIndexOf 263 */ indexOf()264 @Test public void indexOf() throws Exception 265 { 266 logger.log(Level.INFO, "Testing List.indexOf(Object element), List.lastIndexOf(Object element)"); 267 InterfaceContainer cont= new InterfaceContainer(); 268 269 cont.addAll(list1); 270 cont.addAll(list1); 271 assertEquals(cont.indexOf(obj3), 2); 272 assertEquals(cont.lastIndexOf(obj3), 5); 273 274 cont.clear(); 275 cont.addAll(list2); 276 cont.addAll(list2); 277 assertEquals(cont.indexOf(proxyObj3Weak1), 2); 278 assertEquals(cont.lastIndexOf(proxyObj3Weak2), 5); 279 } 280 281 /** Tests List.remove(int index), List.remove(Object element), List.removeAll(Collection c) 282 */ remove()283 @Test public void remove() throws Exception 284 { 285 logger.log(Level.INFO, "Testing List.remove(int index), List.remove(Object element), List.removeAll(Collection c)"); 286 InterfaceContainer cont= new InterfaceContainer(); 287 288 cont.addAll(list2); 289 assertTrue(proxyObj2TypeProv.equals(cont.remove(1))); 290 assertEquals(cont.size(), 2); 291 292 cont.clear(); 293 cont.addAll(list2); 294 assertTrue(cont.remove(obj1)); 295 assertTrue(cont.remove(proxyObj2TypeProv)); 296 assertTrue(cont.remove(proxyObj3Weak2)); 297 assertTrue(cont.isEmpty()); 298 299 cont.clear(); 300 cont.addAll(list3); 301 assertTrue(cont.removeAll(list3)); 302 assertTrue(cont.isEmpty()); 303 304 cont.addAll(list2); 305 List<Object> list= new ArrayList<Object>(); 306 list.add(list2.get(0)); 307 list.add(list2.get(1)); 308 list.add(proxyObj3Weak2); 309 assertTrue(cont.removeAll(list)); 310 assertTrue(cont.isEmpty()); 311 } 312 313 /** Tests List.retainAll 314 */ retainAll()315 @Test public void retainAll() throws Exception 316 { 317 logger.log(Level.INFO, "Testing List.retainAll(Collection c)"); 318 InterfaceContainer cont= new InterfaceContainer(); 319 320 cont.addAll(list1); //obj1, obj2, obj3 321 cont.addAll(list2); //obj1, proxyObj2TypeProv, proxyObj3TypeProv 322 List<Object> list = new ArrayList<Object>(); 323 list.add(obj1); 324 list.add(proxyObj3Weak1); 325 326 assertTrue(cont.retainAll(list)); 327 assertSame(cont.get(0), obj1); 328 assertSame(cont.get(1), obj3); 329 assertSame(cont.get(2), obj1); 330 assertSame(cont.get(3), proxyObj3TypeProv); 331 assertEquals(cont.size(), 4); 332 } 333 334 /** Tests List.set(int index, Object element) 335 **/ set()336 @Test public void set() throws Exception 337 { 338 logger.log(Level.INFO, "Testing List.set(int index, Object element)"); 339 InterfaceContainer cont= new InterfaceContainer(); 340 341 cont.addAll(list2); 342 Object o1= cont.set(0, obj3); 343 Object o2= cont.set(2, proxyObj3Weak1); 344 345 assertSame(list2.get(0), o1); 346 assertSame(list2.get(2), o2); 347 assertSame(cont.get(0), obj3); 348 assertSame(cont.get(2), proxyObj3Weak1); 349 } 350 351 /** Tests List.toArray(), List.toArray(Object[] a) 352 */ toArray()353 @Test public void toArray() throws Exception 354 { 355 logger.log(Level.INFO, "Testing List.toArray(), List.toArray(Object[] a)"); 356 InterfaceContainer cont= new InterfaceContainer(); 357 358 cont.addAll(list1); 359 Object[] ar= cont.toArray(); 360 Object[] arOrig= list1.toArray(); 361 assertEquals(ar.length, arOrig.length); 362 assertArrayEquals(ar, arOrig); 363 364 XWeak[] arWeak= new XWeak[3]; 365 XWeak[] arWeak2= (XWeak[])cont.toArray(arWeak); 366 assertEquals(ar.length, arWeak2.length); 367 assertArrayEquals(ar, arWeak2); 368 } 369 Iterator_next()370 @Test public void Iterator_next() throws Exception 371 { 372 logger.log(Level.INFO, "Testing InterfaceContainer.iterator, Iterator.next()"); 373 InterfaceContainer cont= new InterfaceContainer(); 374 375 cont.addAll(list1); 376 Iterator it= cont.iterator(); 377 assertSame(it.next(), list1.get(0)); 378 assertSame(it.next(), list1.get(1)); 379 assertSame(it.next(), list1.get(2)); 380 381 try { 382 it.next(); 383 fail("NoSuchElementException expected"); 384 } catch (NoSuchElementException noSuchElementException) { 385 logger.log(Level.FINE, "NoSuchElementException caught"); 386 } 387 } 388 Iterator_hasNext()389 @Test public void Iterator_hasNext() throws Exception 390 { 391 logger.log(Level.INFO, "Testing, Iterator.next()"); 392 InterfaceContainer cont= new InterfaceContainer(); 393 394 Iterator it= cont.iterator(); 395 assertFalse(it.hasNext()); 396 397 cont.addAll(list1); 398 it= cont.iterator(); 399 assertTrue(it.hasNext()); 400 401 it.next(); 402 assertTrue(it.hasNext()); 403 404 it.next(); 405 assertTrue(it.hasNext()); 406 407 it.next(); 408 assertFalse(it.hasNext()); 409 } 410 Iterator_remove()411 @Test public void Iterator_remove() throws Exception 412 { 413 logger.log(Level.INFO, "Testing, Iterator.remove()"); 414 InterfaceContainer cont= new InterfaceContainer(); 415 416 Iterator it= cont.iterator(); 417 try { 418 it.remove(); 419 fail("IllegalStateException expected"); 420 } catch (IllegalStateException illegalStateException) { 421 logger.log(Level.FINE, "IllegalStateException caught"); 422 } 423 424 cont.add(obj1); 425 it= cont.iterator(); 426 it.next(); 427 it.remove(); 428 assertTrue(cont.isEmpty()); 429 try { 430 it.remove(); 431 fail("IllegalStateException expected"); 432 } catch (IllegalStateException illegalStateException) { 433 logger.log(Level.FINE, "IllegalStateException caught"); 434 } 435 436 cont.clear(); 437 cont.addAll(list1); 438 it= cont.iterator(); 439 while (it.hasNext()) 440 { 441 it.next(); 442 it.remove(); 443 } 444 assertTrue(cont.isEmpty()); 445 446 // 2 iterators, remove must not impair the other iterator 447 cont.clear(); 448 cont.addAll(list1); 449 int size= cont.size(); 450 it= cont.iterator(); 451 Iterator it2= cont.iterator(); 452 while (it.hasNext()) 453 { 454 it.next(); 455 it.remove(); 456 } 457 for( int c= 0; c < size; c++) 458 it2.next(); 459 assertEquals(cont.size(), 0); 460 } 461 ListIterator_next()462 @Test public void ListIterator_next() throws Exception 463 { 464 logger.log(Level.INFO, "Testing InterfaceContainer.listIterator, ListIterator.next()"); 465 InterfaceContainer cont= new InterfaceContainer(); 466 467 cont.addAll(list1); 468 Iterator it= cont.listIterator(); 469 assertSame(it.next(), list1.get(0)); 470 assertSame(it.next(), list1.get(1)); 471 assertSame(it.next(), list1.get(2)); 472 try { 473 it.next(); 474 fail("NoSuchElementException expected"); 475 } catch (NoSuchElementException noSuchElementException) { 476 logger.log(Level.FINE, "NoSuchElementException caught"); 477 } 478 } 479 ListIterator_hasNext()480 @Test public void ListIterator_hasNext() throws Exception 481 { 482 logger.log(Level.INFO, "Testing ListIterator.hasNext()"); 483 InterfaceContainer cont= new InterfaceContainer(); 484 485 Iterator it= cont.listIterator(); 486 assertFalse(it.hasNext()); 487 488 cont.addAll(list1); 489 it= cont.listIterator(); 490 assertTrue(it.hasNext()); 491 it.next(); 492 assertTrue(it.hasNext()); 493 it.next(); 494 assertTrue(it.hasNext()); 495 it.next(); 496 assertFalse(it.hasNext()); 497 } 498 ListIterator_remove()499 @Test public void ListIterator_remove() throws Exception 500 { 501 logger.log(Level.INFO, "Testing ListIterator.remove()"); 502 InterfaceContainer cont= new InterfaceContainer(); 503 504 ListIterator it= cont.listIterator(); 505 try { 506 it.remove(); 507 fail("IllegalStateException expected"); 508 } catch (IllegalStateException illegalStateException) { 509 logger.log(Level.FINE, "IllegalStateException caught"); 510 } 511 512 cont.add(obj1); 513 it= cont.listIterator(); 514 it.next(); 515 it.remove(); 516 assertTrue(cont.isEmpty()); 517 try { 518 it.remove(); 519 fail("IllegalStateException expected"); 520 } catch (IllegalStateException illegalStateException) { 521 logger.log(Level.FINE, "IllegalStateException caught"); 522 } 523 524 cont.clear(); 525 cont.addAll(list1); 526 it= cont.listIterator(); 527 while (it.hasNext()) 528 { 529 it.next(); 530 it.remove(); 531 } 532 assertTrue(cont.isEmpty()); 533 534 // 2 iterators, remove must not impair the other iterator 535 cont.clear(); 536 cont.addAll(list1); 537 int size= cont.size(); 538 it= cont.listIterator(); 539 Iterator it2= cont.listIterator(); 540 while (it.hasNext()) 541 { 542 it.next(); 543 it.remove(); 544 } 545 for( int c= 0; c < size; c++) 546 it2.next(); 547 assertEquals(cont.size(), 0); 548 } 549 ListIterator_hasPrevious()550 @Test public void ListIterator_hasPrevious() throws Exception 551 { 552 logger.log(Level.INFO, "Testing ListIterator.hasPrevious()"); 553 InterfaceContainer cont= new InterfaceContainer(); 554 555 ListIterator it= cont.listIterator(); 556 assertFalse(it.hasPrevious()); 557 cont.addAll(list1); 558 it= cont.listIterator(); 559 while (it.hasNext()) 560 { 561 it.next(); 562 assertTrue(it.hasPrevious()); 563 } 564 } 565 ListIterator_previous()566 @Test public void ListIterator_previous() throws Exception 567 { 568 logger.log(Level.INFO, "Testing ListIterator.previous()"); 569 InterfaceContainer cont= new InterfaceContainer(); 570 571 cont.addAll(list1); 572 // go to the end of our list and list1 573 ListIterator it= cont.listIterator(); 574 while (it.hasNext()) { 575 it.next(); 576 } 577 ListIterator it_list1= list1.listIterator(); 578 while (it_list1.hasNext()) { 579 it_list1.next(); 580 } 581 582 while (it.hasPrevious()) 583 { 584 assertSame(it.previous(), it_list1.previous()); 585 } 586 try { 587 it.previous(); 588 fail("NoSuchElementException expected"); 589 } catch (NoSuchElementException noSuchElementException) { 590 logger.log(Level.FINE, "NoSuchElementException caught"); 591 } 592 } 593 ListIterator_nextIndex()594 @Test public void ListIterator_nextIndex() throws Exception 595 { 596 logger.log(Level.INFO, "Testing ListIterator.nextIndex()"); 597 InterfaceContainer cont= new InterfaceContainer(); 598 599 ListIterator it; 600 cont.addAll(list1); 601 it= cont.listIterator(); 602 assertEquals(it.nextIndex(), 0); 603 it.next(); 604 assertEquals(it.nextIndex(), 1); 605 it.next(); 606 assertEquals(it.nextIndex(), 2); 607 } 608 ListIterator_previousIndex()609 @Test public void ListIterator_previousIndex() throws Exception 610 { 611 logger.log(Level.INFO, "Testing ListIterator.previousIndex()"); 612 InterfaceContainer cont= new InterfaceContainer(); 613 614 ListIterator it; 615 cont.addAll(list1); 616 it= cont.listIterator(); 617 while (it.hasNext()) { 618 it.next(); 619 } 620 621 assertEquals(it.previousIndex(), 2); 622 it.previous(); 623 assertEquals(it.previousIndex(), 1); 624 it.previous(); 625 assertEquals(it.previousIndex(), 0); 626 it.previous(); 627 } 628 ListIterator_add()629 @Test public void ListIterator_add() throws Exception 630 { 631 logger.log(Level.INFO, "Testing ListIterator.add()"); 632 InterfaceContainer cont= new InterfaceContainer(); 633 634 ListIterator it= cont.listIterator(); 635 it.add(obj1); 636 assertEquals(cont.size(), 1); 637 it.add(obj2); 638 assertEquals(cont.size(), 2); 639 it.add(obj3); 640 assertSame(it.previous(), obj3); 641 assertSame(it.previous(), obj2); 642 assertSame(it.previous(), obj1); 643 } 644 disposeAndClear()645 @Test public void disposeAndClear() throws Exception 646 { 647 logger.log(Level.INFO, "Testing InterfaceContainer.disposeAndClear"); 648 InterfaceContainer cont= new InterfaceContainer(10); 649 650 cont.add(obj1); 651 cont.add(obj2); 652 cont.add(obj3); 653 cont.add(proxyObj1Weak1); 654 cont.add(proxyObj3TypeProv); 655 logger.log(Level.FINE, "Two proxies are called. Check the output:"); 656 cont.disposeAndClear(new com.sun.star.lang.EventObject()); 657 assertEquals(obj1.nDisposingCalled, 1); 658 assertEquals(obj2.nDisposingCalled, 1); 659 assertEquals(obj3.nDisposingCalled, 1); 660 } 661 } 662