package org.drugis.common.threading.activity; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.drugis.common.threading.Task; import org.junit.Test; public class ActivityModelTest { @Test public void testInitialState() { MockTask start = new MockTask(); start.start(); MockTask end = new MockTask(); Transition trans = new DirectTransition(start, end); ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans)); assertEquals(Collections.singleton(start), model.getNextStates()); } @Test public void testSimpleTransition() { MockTask start = new MockTask(); start.start(); MockTask end = new MockTask(); Transition trans = new DirectTransition(start, end); ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans)); start.finish(); assertEquals(Collections.singleton(end), model.getNextStates()); } @Test public void testIsFinished() { MockTask start = new MockTask(); start.start(); MockTask end = new MockTask(); Transition trans = new DirectTransition(start, end); ActivityModel model = new ActivityModel(start, end, Collections.singleton(trans)); start.finish(); end.start(); end.finish(); assertTrue(model.isFinished()); assertEquals(Collections.<Task>emptySet(), model.getNextStates()); } @Test public void testForkJoinModel() { MockTask start = new MockTask(); start.start(); MockTask end = new MockTask(); List<MockTask> parallel = new ArrayList<MockTask>(); parallel.add(new MockTask()); parallel.add(new MockTask()); List<Transition> transitions = new ArrayList<Transition>(); transitions.add(new ForkTransition(start, parallel)); transitions.add(new JoinTransition(parallel, end)); ActivityModel model = new ActivityModel(start, end, transitions); assertEquals(Collections.singleton(start), model.getNextStates()); start.finish(); assertEquals(new HashSet<Task>(parallel), model.getNextStates()); parallel.get(1).finish(); assertEquals(Collections.singleton(parallel.get(0)), model.getNextStates()); parallel.get(0).finish(); assertEquals(Collections.singleton(end), model.getNextStates()); end.finish(); assertTrue(model.isFinished()); } @Test public void testForkJoinComplexModel() { MockTask start = new MockTask(); start.start(); MockTask end = new MockTask(); List<MockTask> fork = new ArrayList<MockTask>(); fork.add(new MockTask()); fork.add(new MockTask()); List<MockTask> join = new ArrayList<MockTask>(); join.add(new MockTask()); join.add(new MockTask()); List<Transition> transitions = new ArrayList<Transition>(); transitions.add(new ForkTransition(start, fork)); transitions.add(new JoinTransition(join, end)); transitions.add(new DirectTransition(fork.get(0), join.get(1))); transitions.add(new DirectTransition(fork.get(1), join.get(0))); ActivityModel model = new ActivityModel(start, end, transitions); assertEquals(Collections.singleton(start), model.getNextStates()); start.finish(); assertEquals(new HashSet<Task>(fork), model.getNextStates()); fork.get(1).finish(); Set<Task> expected = new HashSet<Task>(); expected.add(fork.get(0)); expected.add(join.get(0)); assertEquals(expected, model.getNextStates()); join.get(0).finish(); assertEquals(Collections.singleton(fork.get(0)), model.getNextStates()); fork.get(0).finish(); assertEquals(Collections.singleton(join.get(1)), model.getNextStates()); join.get(1).finish(); assertEquals(Collections.singleton(end), model.getNextStates()); end.finish(); assertTrue(model.isFinished()); } }