/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package StevensLevel;
import StevensLevel.ViewControl;
import StevensLevel.ExperimentControl;
import StevensLevel.Sequence;
import StevensLevel.parts.ExperimentPart;
import StevensLevel.parts.EndingPart;
import StevensLevel.parts.BeginningPart;
import interaction.ExperimentInteractionListener;
import java.util.List;
import screens.AbstractStrictScreen;
import StevensLevel.parts.Round;
import configuration.TaskDesign;
import interaction.BasicInteraction;
import org.junit.runner.RunWith;
import org.junit.experimental.runners.Enclosed;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
/**
*
* @author tristangoffman
*/
@RunWith(Enclosed.class)
public class ExperimentControlTest extends TestBase {
public static ExperimentControl ex;
public ExperimentControlTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
public static void setUp() {
ex = new ExperimentControl();
}
@After
public void tearDown() {
}
public static class AfterConstruct {
@Before
public void setUp() {
ExperimentControlTest.setUp();
}
@Test
public void hasViewControl() {
hasFieldWith(ViewControl.class);
}
@Test
public void hasSequence() {
assertThat(ex.getSequence(), notNullValue());
}
@Test
public void styleSetGet() {
String title = "About to start stevens level test";
// ex.setStyle("startTitle", title);
//assertThat((String) ex.getStyle("startTitle"), equalTo(title));
}
@Test
public void viewControlInstantiated() {
assertThat(ex.getViewControl(), notNullValue());
}
@Test
public void viewControlHasExpControlAsInteractionReactor() {
viewControlInstantiated();
assertThat(ex, isIn(ex.getViewControl().getInteractionReactors()));
}
@Test
public void hasTaskRounds() {
assertThat(ex.getRounds(), notNullValue());
}
@Test
public void addPart() {
ex.addPart(new BeginningPart());
}
}
public static class addPartExtras extends SetupWithoutConfiguration {
@Test
public void addPartOrderering() {
BeginningPart add1 = new BeginningPart();
EndingPart add2 = new EndingPart();
ex.setSequence(new Sequence()); //Clean slate for order testing
ex.addPart(add1);
ex.addPart(add2);
assertEquals(ex.getSequence().last(), add2);
assertEquals(ex.getSequence().first(), add1);
}
}
public static class Interactions{
private ExperimentControl spy;
@Before
public void setUp(){
ExperimentControlTest.setUp();
spy = spy(ex);
ex.setup();
}
@Test
public void viewControlHasExpControlAsInteractionReactor() {
assertThat(ex, isIn(ex.getViewControl().getInteractionReactors()));
}
}
public static class TaskRounds {
@Before
public void setUp() {
ExperimentControlTest.setUp();
}
@Test
public void addTaskRound() {
Round rnd = new Round(new TaskDesign());
ex.addRound(rnd);
assertThat(ex.getRounds(), contains(rnd));
}
@Test
public void addTaskRoundisLast() {
TaskDesign tsk = new TaskDesign();
Round rnd = new Round(tsk);
Round rnd2 = new Round(tsk);
ex.addRound(rnd);
ex.addRound(rnd2);
List<Round> rnds = ex.getRounds();
assertThat(rnds.get(rnds.size() - 1), is(rnd2));
}
}
public static class Configuration {
@Test
public void placeHolder() {
}
}
public static class SetupWithoutConfiguration extends AfterConstruct {
@Before
public void setUp() {
ExperimentControlTest.setUp();
ex.setup();
}
public Sequence setSeqAndSpy(ExperimentControl cont) {
Sequence seq = new Sequence();
Sequence spy = spy(seq);
cont.setSequence(spy);
return spy;
}
@Test
public void canSetSequence() {
hasSequence();
Sequence spy = setSeqAndSpy(ex);
assertThat(ex.getSequence(), is(spy));
}
public class TestPart extends ExperimentPart<AbstractStrictScreen> {
@Override
public Class<AbstractStrictScreen> getScreenClass() {
return AbstractStrictScreen.class;
}
}
@Test
public void addToSequence() {
hasSequence();
canSetSequence();
Sequence spy = setSeqAndSpy(ex);
TestPart part = new TestPart();
ex.addPart(part);
verify(spy, times(1)).add(ex.getSequence().size(), part);
}
@Test
public void getPartByScreen() {
addToSequence();
ex.setSequence(new Sequence());
TestPart part = new TestPart();
ex.addPart(part);
assertEquals(part, ex.getPart(AbstractStrictScreen.class));
}
@Test
public void getPartByScreenNullWithNoCorrespondingPart() {
getPartByScreen();
ex.setSequence(new Sequence());
assertEquals(null, ex.getPart(AbstractStrictScreen.class));
}
public void containsClass(Class<? extends ExperimentPart> clazz) {
boolean contains = false;
for (ExperimentPart obj : ex.getSequence()) {
if(obj.getClass() == clazz){
contains = true;
}
}
assertTrue(contains);
}
// @Test
// public void hasStartScreenInSequence() throws Exception {
// // throw new Exception(ex.getSequence().toString());
//
// assertThat(ex.getSequence(), contains(instanceOf(BeginningPart.class)));
// }
//
// @Test
// public void startScreenFirstInSequence() {
// assertThat(ex.getSequence(), contains(instanceOf(BeginningPart.class)));
// //assertTrue(ex.getSequence().first() instanceof BeginningPart);
// }
//
// @Test
// public void endScreenLastInSequence() {
// assertThat(ex.getSequence(), contains(instanceOf(EndingPart.class)));
//
// }
}
public static class SetupWithConfiguration extends SetupWithoutConfiguration {
@Before
public void setUp() {
ExperimentControlTest.setUp();
}
}
}