jtulach@374: package org.apidesign.openfixed; jtulach@374: jtulach@374: import java.util.ArrayList; jtulach@374: import java.util.List; jtulach@374: import junit.framework.TestCase; jtulach@374: jtulach@374: public abstract class CalculatorBase extends TestCase { jtulach@374: jtulach@374: public CalculatorBase(String testName) { jtulach@374: super(testName); jtulach@374: } jtulach@374: jtulach@374: protected abstract Calculator create(); jtulach@374: jtulach@374: public void testSumAndListeners() throws Exception { jtulach@374: Calculator a = create(); jtulach@374: MockListener l = new MockListener(); jtulach@374: a.addModificationListener(l); jtulach@374: a.add(5); jtulach@374: a.add(10); jtulach@374: a.add(20); jtulach@374: int ch = allChanges(l.assertEvents("Three changes", 3)); jtulach@374: assertEquals("35 was the change", 35, ch); jtulach@374: assertEquals("Current value", 35, a.getSum()); jtulach@374: a.add(-5); jtulach@374: int ch2 = allChanges(l.assertEvents("One change", 1)); jtulach@374: assertEquals("minus five was the change", -5, ch2); jtulach@374: assertEquals("Final value", 30, a.getSum()); jtulach@374: } jtulach@374: jtulach@374: private static int allChanges(List events) { jtulach@374: int changes = 0; jtulach@374: for (ModificationEvent me : events) { jtulach@374: changes += me.getChange(); jtulach@374: } jtulach@374: return changes; jtulach@374: } jtulach@374: jtulach@374: public static class MockListener implements ModificationListener { jtulach@374: private List events; jtulach@374: jtulach@374: @Override jtulach@374: public synchronized void modification(ModificationEvent ev) { jtulach@374: if (events == null) { jtulach@374: events = new ArrayList(); jtulach@374: } jtulach@374: events.add(ev); jtulach@374: } jtulach@374: jtulach@374: public synchronized List assertEvents(String msg, int cnt) jtulach@374: throws InterruptedException { jtulach@374: for (int i = 0; i < 10; i++) { jtulach@374: if (events != null && events.size() >= cnt) { jtulach@374: break; jtulach@374: } jtulach@374: wait(1000); jtulach@374: } jtulach@374: assertEquals(msg + ":\n" + events, cnt, events.size()); jtulach@374: List res = events; jtulach@374: events = null; jtulach@374: return res; jtulach@374: } jtulach@374: } // end of ModificationListener jtulach@374: }