weaks
[idea/community.git] / platform / util / testSrc / com / intellij / util / containers / WeaksTestCase.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.TestCase;
20
21 import java.lang.ref.WeakReference;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 public abstract class WeaksTestCase extends TestCase {
26   protected static final boolean JVM_IS_GC_CAPABLE = isJvmGcCapable();
27   private static boolean isJvmGcCapable() {
28     List<Object> list = new ArrayList<Object>();
29     Object o = new Object();
30     list.add(o);
31     WeakReference<Object> wr = new WeakReference<Object>(o);
32     assertSame(o, wr.get());
33     o = null;
34     list.clear();
35     gc();
36     boolean cleared = wr.get() == null;
37     if (!cleared) {
38       System.out.println("GC INCAPABLE JVM DETECTED");
39     }
40     return cleared;
41   }
42
43
44   protected final List<Object> myHolder = new ArrayList<Object>();
45
46   protected static void gc() {
47     System.gc();
48     List<Object> list = new ArrayList<Object>();
49     while (Runtime.getRuntime().freeMemory() > 10000) {
50       list.add(new byte[1000]);
51     }
52
53     System.gc();
54     list = null;
55     System.gc();
56
57     WeakReference<Object> weakReference = new WeakReference<Object>(new Object());
58     do {
59       System.gc();
60     }
61     while (weakReference.get() != null);
62   }
63
64
65   protected void checkSameElements(WeakReferenceArray collection) {
66     checkSameNotNulls(collection);
67     assertEquals(myHolder.size(), collection.size());
68     for (int i = 0; i < myHolder.size(); i++) {
69       assertSame(myHolder.get(i), collection.get(i));
70     }
71     WeakReference[] references = collection.getReferences();
72     for (int i = myHolder.size(); i < references.length; i++)
73       assertNull(references[i]);
74   }
75
76   protected void checkSameNotNulls(WeakReferenceArray collection) {
77     int validIndex = -1;
78     int validCount = 0;
79     for (int i = 0; i < myHolder.size(); i++) {
80       validIndex = nextValidIndex(validIndex, collection);
81       assertSame(i + "==" + validIndex, myHolder.get(i), collection.get(validIndex));
82       validCount++;
83     }
84     assertEquals(myHolder.size(), validCount);
85     assertTrue(collection.size() >= nextValidIndex(validIndex, collection));
86     assertTrue(collection.size() - myHolder.size() >= collection.getCorpseCount());
87
88     //validIndex = Math.max(validIndex, 0);
89     WeakReference[] references = collection.getReferences();
90     for (int i = collection.size(); i < references.length; i++)
91       assertNull(references[i]);
92   }
93
94   private static int nextValidIndex(int validIndex, WeakReferenceArray collection) {
95     validIndex++;
96     while (validIndex < collection.size() && collection.get(validIndex) == null) validIndex++;
97     return validIndex;
98   }
99
100   protected void addElement(Object o, WeakReferenceArray<Object> array) {
101     myHolder.add(o);
102     array.add(o);
103   }
104 }