public void test() throws Exception {
Progress p = new Progress();
p.addProgressListener(new Progress.ProgressListener() {
+ @Override
public void progress(Progress progress, String name) {
pg = progress.getProgress();
}
p.addProgress(child2, 50);
p.addProgressListener(new Progress.ProgressListener() {
+ @Override
public void progress(Progress progress, String name) {
pg = p.getProgress();
}
p.addProgress(child2, 500);
p.addProgressListener(new Progress.ProgressListener() {
+ @Override
public void progress(Progress progress, String name) {
pg = p.getProgress();
}
// 200 = local progress
p.addProgressListener(new Progress.ProgressListener() {
+ @Override
public void progress(Progress progress, String name) {
pg = p.getProgress();
}
assertEquals(1000, pg);
}
});
+
+ addTest(new TestCase("Listeners with 5+ children, 4+ depth") {
+ int pg;
+
+ @Override
+ public void test() throws Exception {
+ final Progress p = new Progress();
+ Progress child1 = new Progress();
+ Progress child2 = new Progress();
+ p.addProgress(child1, 50);
+ p.addProgress(child2, 50);
+ Progress child11 = new Progress();
+ child1.addProgress(child11, 100);
+ Progress child111 = new Progress();
+ child11.addProgress(child111, 100);
+ Progress child1111 = new Progress();
+ child111.addProgress(child1111, 20);
+ Progress child1112 = new Progress();
+ child111.addProgress(child1112, 20);
+ Progress child1113 = new Progress();
+ child111.addProgress(child1113, 20);
+ Progress child1114 = new Progress();
+ child111.addProgress(child1114, 20);
+ Progress child1115 = new Progress();
+ child111.addProgress(child1115, 20);
+
+ p.addProgressListener(new Progress.ProgressListener() {
+ @Override
+ public void progress(Progress progress, String name) {
+ pg = p.getProgress();
+ }
+ });
+
+ child1111.setProgress(100);
+ child1112.setProgress(50);
+ child1113.setProgress(25);
+ child1114.setProgress(25);
+ child1115.setProgress(50);
+ assertEquals(25, pg);
+ child2.setProgress(100);
+ assertEquals(75, pg);
+ child1111.setProgress(100);
+ child1112.setProgress(100);
+ child1113.setProgress(100);
+ child1114.setProgress(100);
+ child1115.setProgress(100);
+ assertEquals(100, pg);
+ }
+ });
+
+ addTest(new TestCase("Listeners with children, multi-thread") {
+ int pg;
+ boolean decrease;
+ Object lock1 = new Object();
+ Object lock2 = new Object();
+ int currentStep1;
+ int currentStep2;
+
+ @Override
+ public void test() throws Exception {
+ final Progress p = new Progress(0, 200);
+
+ final Progress child1 = new Progress();
+ final Progress child2 = new Progress();
+ p.addProgress(child1, 100);
+ p.addProgress(child2, 100);
+
+ p.addProgressListener(new Progress.ProgressListener() {
+ @Override
+ public void progress(Progress progress, String name) {
+ int now = p.getProgress();
+ if (now < pg) {
+ decrease = true;
+ }
+ pg = now;
+ }
+ });
+
+ // Run 200 concurrent threads, 2 at a time allowed to
+ // make progress (each on a different child)
+ for (int i = 0; i <= 100; i++) {
+ final int step = i;
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ synchronized (lock1) {
+ if (step > currentStep1) {
+ currentStep1 = step;
+ child1.setProgress(step);
+ }
+ }
+ }
+ }).start();
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ synchronized (lock2) {
+ if (step > currentStep2) {
+ currentStep2 = step;
+ child2.setProgress(step);
+ }
+ }
+ }
+ }).start();
+ }
+
+ int i;
+ int timeout = 20; // in 1/10th of seconds
+ for (i = 0; i < timeout
+ && (currentStep1 + currentStep2) < 200; i++) {
+ Thread.sleep(100);
+ }
+
+ assertEquals("The test froze at step " + currentStep1
+ + " + " + currentStep2, true, i < timeout);
+ assertEquals(
+ "There should not have any decresing steps",
+ decrease, false);
+ assertEquals("The progress should have reached 200",
+ 200, p.getProgress());
+ assertEquals(
+ "The progress should have reached completion",
+ true, p.isDone());
+ }
+ });
}
});
}