package org.oddjob.scheduling.state; import java.util.concurrent.Callable; import junit.framework.TestCase; import org.oddjob.Stateful; import org.oddjob.framework.JobDestroyedException; import org.oddjob.state.ParentState; import org.oddjob.state.ParentStateHandler; import org.oddjob.state.State; import org.oddjob.state.StateEvent; import org.oddjob.state.StateListener; public class TimerStateAdapterTest extends TestCase { private class OurStateful implements Stateful { @Override public StateEvent lastStateEvent() { throw new RuntimeException("Unexpected!"); } @Override public void addStateListener(StateListener listener) throws JobDestroyedException { throw new RuntimeException("Unexpected!"); } @Override public void removeStateListener(StateListener listener) { throw new RuntimeException("Unexpected!"); } } private class OurListener implements StateListener { State state; @Override public void jobStateChange(StateEvent event) { state = event.getState(); } } public void testStateChanges() { final ParentStateHandler parentStateful = new ParentStateHandler( new OurStateful()); TimerStateAdapter test = new TimerStateAdapter(parentStateful); assertEquals(TimerState.STARTABLE, test.lastStateEvent().getState()); OurListener listener = new OurListener(); test.addStateListener(listener); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.STARTED); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.STARTED, listener.state); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.INCOMPLETE); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.INCOMPLETE, listener.state); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.READY); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.STARTABLE, listener.state); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.EXCEPTION); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.EXCEPTION, listener.state); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.COMPLETE); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.COMPLETE, listener.state); test.removeStateListener(listener); parentStateful.callLocked(new Callable<Void>() { @Override public Void call() throws Exception { parentStateful.setState(ParentState.READY); parentStateful.fireEvent(); return null; } }); assertEquals(TimerState.COMPLETE, listener.state); } }