diff -r 000000000000 -r 3905a2e66b9b samples/reentrant/test/org/apidesign/reentrant/CriticalSectionBase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/reentrant/test/org/apidesign/reentrant/CriticalSectionBase.java Sat Jun 14 09:54:36 2008 +0200 @@ -0,0 +1,101 @@ +package org.apidesign.reentrant; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; + +public abstract class CriticalSectionBase { + protected abstract CriticalSection create(); + + @Test + public void testCriticalSectionWith15() { + final CriticalSection cs = create(); + testFor15(cs); + } + + final void testFor15(CriticalSection cs) { + cs.assignPilot(15); + + List ints = new ArrayList(); + ints.add(8); + ints.add(11); + ints.add(10); + ints.add(5); + ints.add(12); + ints.add(18); + ints.add(13); + ints.add(7); + + int cnt = cs.sumBigger(ints); + + assertEquals("18 is bigger than 15", 1, cnt); + + } + + @Test + public void teaseCriticalSectionWithReentrantCalls() { + final CriticalSection cs = create(); + + cs.assignPilot(10); + + class ChangePilotTo15 implements Runnable { + public void run() { + testFor15(cs); + } + } + + List ints = new MyCollection(new ChangePilotTo15(), 3); + ints.add(8); + ints.add(11); + ints.add(10); + ints.add(5); + ints.add(12); + ints.add(18); + ints.add(13); + ints.add(7); + + int cnt = cs.sumBigger(ints); + + assertEquals("11, 12, 18, 13 are bigger than 10", 4, cnt); + + assertEquals("Global count is sum of ints(e.g. 4) plus result of testFor15(e.g. 1)", 5, cs.getCount()); + } + + class MyCollection extends ArrayList { + private final Runnable callback; + private final int callbackBeforeIndex; + + public MyCollection(Runnable callback, int callbackAtIndex) { + this.callback = callback; + this.callbackBeforeIndex = callbackAtIndex; + } + + @Override + public Iterator iterator() { + final Iterator delegate = super.iterator(); + class It implements Iterator { + private int index; + + public boolean hasNext() { + return delegate.hasNext(); + } + + public Integer next() { + if (index++ == callbackBeforeIndex) { + callback.run(); + } + + return delegate.next(); + } + + public void remove() { + delegate.remove(); + } + } // end of It + + return new It(); + } + } +} \ No newline at end of file