1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/samples/reentrant/test/org/apidesign/reentrant/CriticalSectionBase.java Sat Jun 14 09:54:36 2008 +0200
1.3 @@ -0,0 +1,101 @@
1.4 +package org.apidesign.reentrant;
1.5 +
1.6 +import java.util.ArrayList;
1.7 +import java.util.Iterator;
1.8 +import java.util.List;
1.9 +import org.junit.Test;
1.10 +import static org.junit.Assert.*;
1.11 +
1.12 +public abstract class CriticalSectionBase {
1.13 + protected abstract CriticalSection<Integer> create();
1.14 +
1.15 + @Test
1.16 + public void testCriticalSectionWith15() {
1.17 + final CriticalSection<Integer> cs = create();
1.18 + testFor15(cs);
1.19 + }
1.20 +
1.21 + final void testFor15(CriticalSection<Integer> cs) {
1.22 + cs.assignPilot(15);
1.23 +
1.24 + List<Integer> ints = new ArrayList<Integer>();
1.25 + ints.add(8);
1.26 + ints.add(11);
1.27 + ints.add(10);
1.28 + ints.add(5);
1.29 + ints.add(12);
1.30 + ints.add(18);
1.31 + ints.add(13);
1.32 + ints.add(7);
1.33 +
1.34 + int cnt = cs.sumBigger(ints);
1.35 +
1.36 + assertEquals("18 is bigger than 15", 1, cnt);
1.37 +
1.38 + }
1.39 +
1.40 + @Test
1.41 + public void teaseCriticalSectionWithReentrantCalls() {
1.42 + final CriticalSection<Integer> cs = create();
1.43 +
1.44 + cs.assignPilot(10);
1.45 +
1.46 + class ChangePilotTo15 implements Runnable {
1.47 + public void run() {
1.48 + testFor15(cs);
1.49 + }
1.50 + }
1.51 +
1.52 + List<Integer> ints = new MyCollection(new ChangePilotTo15(), 3);
1.53 + ints.add(8);
1.54 + ints.add(11);
1.55 + ints.add(10);
1.56 + ints.add(5);
1.57 + ints.add(12);
1.58 + ints.add(18);
1.59 + ints.add(13);
1.60 + ints.add(7);
1.61 +
1.62 + int cnt = cs.sumBigger(ints);
1.63 +
1.64 + assertEquals("11, 12, 18, 13 are bigger than 10", 4, cnt);
1.65 +
1.66 + assertEquals("Global count is sum of ints(e.g. 4) plus result of testFor15(e.g. 1)", 5, cs.getCount());
1.67 + }
1.68 +
1.69 + class MyCollection extends ArrayList<Integer> {
1.70 + private final Runnable callback;
1.71 + private final int callbackBeforeIndex;
1.72 +
1.73 + public MyCollection(Runnable callback, int callbackAtIndex) {
1.74 + this.callback = callback;
1.75 + this.callbackBeforeIndex = callbackAtIndex;
1.76 + }
1.77 +
1.78 + @Override
1.79 + public Iterator<Integer> iterator() {
1.80 + final Iterator<Integer> delegate = super.iterator();
1.81 + class It implements Iterator<Integer> {
1.82 + private int index;
1.83 +
1.84 + public boolean hasNext() {
1.85 + return delegate.hasNext();
1.86 + }
1.87 +
1.88 + public Integer next() {
1.89 + if (index++ == callbackBeforeIndex) {
1.90 + callback.run();
1.91 + }
1.92 +
1.93 + return delegate.next();
1.94 + }
1.95 +
1.96 + public void remove() {
1.97 + delegate.remove();
1.98 + }
1.99 + } // end of It
1.100 +
1.101 + return new It();
1.102 + }
1.103 + }
1.104 +}
1.105 \ No newline at end of file