a82cc3d5b5e94aba9ed76d995a4a3354d2ff4ac8
[idea/community.git] / platform / util / testSrc / com / intellij / util / containers / WeakListTest.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.util.containers;
18
19 import junit.framework.Assert;
20
21 import java.util.Iterator;
22
23 public class WeakListTest extends WeaksTestCase {
24   private final WeakReferenceArray<Object> myWeakArray = new WeakReferenceArray<Object>();
25   private final WeakList<Object> myWeakList = new WeakList<Object>(myWeakArray);
26
27   protected void setUp() throws Exception {
28     super.setUp();
29     Assert.assertTrue(WeakReferenceArray.PEFORM_CHECK_THREAD);
30     WeakReferenceArray.PEFORM_CHECK_THREAD = false;
31   }
32
33   protected void tearDown() throws Exception {
34     WeakReferenceArray.PEFORM_CHECK_THREAD = true;
35     super.tearDown();
36   }
37
38   public void testCompresses() {
39     for (int i = 0; i < 20; i++) {
40       addElement(new Object(), myWeakArray);
41     }
42     Assert.assertEquals(20, myWeakList.size());
43     checkSameElements(myWeakArray);
44     String obj = "xxx";
45     myHolder.add(obj);
46     myWeakList.add(obj);
47     checkSameElements(myWeakArray);
48     myHolder.clear();
49     gc();
50     assertEquals(21, myWeakList.size());
51     assertTrue(20 >= myWeakArray.getCorpseCount());
52     myWeakList.add(new Object());
53     assertTrue(String.valueOf(myWeakList.size()), myWeakList.size() <= 22);
54     gc();
55     myHolder.add(obj);
56     checkSameNotNulls(myWeakArray);
57   }
58   
59   public void testIterator() {
60     myWeakArray.add(new Object());
61     addElement(new Object(), myWeakArray);
62     myWeakArray.add(new Object());
63     addElement(new Object(), myWeakArray);
64     gc();
65     assertTrue(2 <= myWeakArray.getAliveCount());
66     int elementCount = 0;
67     for (Object element : myWeakList) {
68       assertNotNull(element);
69       elementCount++;
70     }
71     assertEquals(2, elementCount);
72   }
73   
74   public void testRemoveViaIterator() {
75     addElement(new Object(), myWeakArray);
76     myWeakArray.add(new Object());
77     addElement(new Object(), myWeakArray);
78     myWeakArray.add(new Object());
79     addElement(new Object(), myWeakArray);
80     Iterator<Object> iterator = myWeakList.iterator();
81     assertSame(myHolder.get(0), iterator.next());
82     while (myHolder.get(1) != iterator.next());
83     gc();
84     assertTrue(4 <= myWeakArray.getAliveCount());
85     iterator.remove();
86     gc();
87     assertTrue(3 <= myWeakArray.getAliveCount());
88     iterator.next();
89     gc();
90     assertTrue(2 <= myWeakArray.getAliveCount());
91     assertSame(myHolder.get(2), iterator.next());
92     assertFalse(iterator.hasNext());
93     myHolder.remove(1);
94     checkSameNotNulls(myWeakArray);
95     myWeakArray.compress(-1);
96     checkSameElements(myWeakArray);
97   }
98
99   public void testRemoveLastViaIterator() {
100     addElement(new Object(), myWeakArray);
101     addElement(new Object(), myWeakArray);
102     Iterator<Object> iterator = myWeakList.iterator();
103     iterator.next();
104     assertTrue(iterator.hasNext());
105     iterator.next();
106     assertFalse(iterator.hasNext());
107     iterator.remove();
108     assertFalse(iterator.hasNext());
109     myHolder.remove(1);
110     checkSameNotNulls(myWeakArray);
111   }
112
113   public void testIteratorKeepsFirstElement() {
114     addElement(new Object(), myWeakArray);
115     addElement(new Object(), myWeakArray);
116     Iterator<Object> iterator = myWeakList.iterator();
117     assertTrue(iterator.hasNext());
118     myHolder.clear();
119     gc();
120     assertNotNull(iterator.next());
121     assertFalse(iterator.hasNext());
122   }
123   
124   public void testIteratorKeepsNextElement() {
125     addElement(new Object(), myWeakArray);
126     addElement(new Object(), myWeakArray);
127     addElement(new Object(), myWeakArray);
128     Iterator<Object> iterator = myWeakList.iterator();
129     iterator.next();
130     assertTrue(iterator.hasNext());
131     myHolder.clear();
132     gc();
133     assertNotNull(iterator.next());
134     assertFalse(iterator.hasNext());
135   }
136 }