mirror of https://github.com/swig/swig
102 lines
2.7 KiB
Java
102 lines
2.7 KiB
Java
// Mainly tests that directors are finalized correctly
|
|
|
|
import java_director.*;
|
|
|
|
public class java_director_runme {
|
|
|
|
static {
|
|
try {
|
|
System.loadLibrary("java_director");
|
|
} catch (UnsatisfiedLinkError e) {
|
|
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
// Suppress warning about System.runFinalization() call.
|
|
@SuppressWarnings({"deprecation", "removal"})
|
|
private static void WaitForGC()
|
|
{
|
|
System.gc();
|
|
System.runFinalization();
|
|
try {
|
|
java.lang.Thread.sleep(10);
|
|
} catch (java.lang.InterruptedException e) {
|
|
}
|
|
}
|
|
|
|
public static void main(String argv[]) {
|
|
QuuxContainer qc = createContainer();
|
|
|
|
int instances = Quux.instances();
|
|
if (instances != 4)
|
|
throw new RuntimeException("Quux instances should be 4, actually " + instances);
|
|
|
|
for (int i = 0; i < qc.size(); ++i) {
|
|
Quux q = qc.get(i);
|
|
|
|
if (!q.director_method().equals(qc.invoke(i))) {
|
|
throw new RuntimeException ( "q.director_method()/qv.invoke(" + i + ")");
|
|
}
|
|
}
|
|
|
|
qc = null;
|
|
/* Watch qc get reaped, which causes the C++ object to delete
|
|
objects from the internal vector */
|
|
{
|
|
int countdown = 500;
|
|
int expectedCount = 0;
|
|
while (true) {
|
|
WaitForGC();
|
|
if (--countdown == 0)
|
|
break;
|
|
if (Quux.instances() == expectedCount)
|
|
break;
|
|
};
|
|
int actualCount = Quux.instances();
|
|
if (actualCount != expectedCount)
|
|
System.err.println("GC failed to run (java_director). Expected count: " + expectedCount + " Actual count: " + actualCount); // Finalizers are not guaranteed to be run and sometimes they just don't
|
|
}
|
|
|
|
/* Test Quux1's director disconnect method rename */
|
|
Quux1 quux1 = new Quux1("quux1");
|
|
if (quux1.disconnectMethodCalled)
|
|
throw new RuntimeException("Oops");
|
|
quux1.delete();
|
|
if (!quux1.disconnectMethodCalled)
|
|
throw new RuntimeException("disconnect method not called");
|
|
}
|
|
|
|
public static QuuxContainer createContainer() {
|
|
QuuxContainer qc = new QuuxContainer();
|
|
|
|
qc.push(new Quux("element 1"));
|
|
qc.push(new java_director_MyQuux("element 2"));
|
|
qc.push(new java_director_MyQuux("element 3"));
|
|
qc.push(new Quux("element 4"));
|
|
|
|
return qc;
|
|
}
|
|
}
|
|
|
|
class java_director_MyQuux extends Quux {
|
|
public java_director_MyQuux(String arg) {
|
|
super(arg);
|
|
}
|
|
|
|
public String director_method() {
|
|
return "java_director_MyQuux:" + member();
|
|
}
|
|
}
|
|
|
|
class java_director_JavaExceptionTest extends JavaExceptionTest {
|
|
public java_director_JavaExceptionTest() {
|
|
super();
|
|
}
|
|
|
|
public void etest() throws Exception {
|
|
super.etest();
|
|
}
|
|
}
|
|
|