package jalse;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import jalse.actions.Action;
import jalse.actions.ActionContext;
import jalse.actions.ForkJoinActionEngine;
import jalse.actions.ThreadPoolActionEngine;
import jalse.attributes.DefaultAttributeContainer;
import jalse.entities.DefaultEntityFactory;
import jalse.entities.Entity;
import jalse.entities.EntityEvent;
import jalse.entities.EntityListener;
public class DefaultJALSETest {
public static class BuilderTest {
JALSE jalse;
@After
public void after() {
jalse = null;
}
@Test
public void buildTest1() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setForkJoinEngine();
jalse = builder.build();
}
@Test
public void buildTest2() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setThreadPoolEngine();
jalse = builder.build();
}
@Test
public void buildTest3() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setRandomID().setNoEntityLimit()
.setParallelismToProcessors();
jalse = builder.build();
}
@Test
public void buildTest4() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setForkJoinEngine().setRandomID().setParallelism(2);
jalse = builder.build();
}
@Test
public void buildTest5() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setForkJoinEngine().setParallelismToProcessors();
jalse = builder.build();
}
@Test
public void buildTest6() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setThreadPoolEngine().setRandomID().setNoEntityLimit();
jalse = builder.build();
}
@Test
public void buildTest7() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder();
builder.setForkJoinEngine().setRandomID().setNoEntityLimit();
jalse = builder.build();
}
@Test
public void buildTest8() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setRandomID().setNoEntityLimit()
.setParallelismToProcessors().setForkJoinEngine();
jalse = builder.build();
Assert.assertNotNull(jalse);
}
@Test
public void buildTest9() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setManualEngine();
jalse = builder.build();
Assert.assertNotNull(jalse);
}
@Test
public void buildTest10() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setCommonPoolEngine();
jalse = builder.build();
Assert.assertNotNull(jalse);
}
@Test
public void buildTest11() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setID(new UUID(0, 0));
jalse = builder.build();
Assert.assertNotNull(jalse);
}
@Test(expected = IllegalArgumentException.class)
public void buildTest12() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setParallelism(0);
jalse = builder.build();
}
@Test
public void buildTest13() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setSingleThread();
jalse = builder.build();
Assert.assertNotNull(jalse);
}
@Test(expected = IllegalArgumentException.class)
public void buildTest14() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setTotalEntityLimit(0);
jalse = builder.build();
}
@Test
public void buildTest15() {
final DefaultJALSE.Builder builder = new DefaultJALSE.Builder().setTotalEntityLimit(1);
jalse = builder.build();
Assert.assertNotNull(jalse);
}
}
private class TestAction implements Action<JALSE> {
public int actCount;
@Override
public void perform(final ActionContext<JALSE> context) throws InterruptedException {
actCount++;
}
}
private interface TestEntity extends Entity {}
private class TestEntityListener implements EntityListener {
public boolean created;
public boolean killed;
@Override
public void entityCreated(final EntityEvent event) {
created = true;
}
@Override
public void entityKilled(final EntityEvent event) {
killed = true;
}
@Override
public void entityReceived(final EntityEvent event) {}
@Override
public void entityTransferred(final EntityEvent event) {}
}
JALSE jalse;
@After
public void after() {
jalse = null;
}
@Test
public void bindingsTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
Assert.assertTrue(jalse.getBindings().toMap().isEmpty());
}
@Test
public void contextTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
Assert.assertNotNull(jalse.newContext(new TestAction()));
}
@Test
public void contructorTest() {
jalse = new DefaultJALSE(new UUID(0, 0), new ForkJoinActionEngine(), new DefaultEntityFactory());
Assert.assertNotNull(jalse);
}
@Test
public void entityListenerTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
final TestEntityListener listener = new TestEntityListener();
jalse.addEntityListener(listener);
Assert.assertTrue(jalse.getEntityListeners().contains(listener));
Assert.assertFalse(listener.created);
Assert.assertFalse(listener.killed);
jalse.newEntity(new UUID(0, 1));
Assert.assertTrue(listener.created);
jalse.killEntity(new UUID(0, 1));
Assert.assertTrue(listener.killed);
jalse.removeEntityListener(listener);
Assert.assertFalse(jalse.getEntityListeners().contains(listener));
jalse.addEntityListener(new TestEntityListener());
jalse.addEntityListener(new TestEntityListener());
jalse.removeEntityListeners();
Assert.assertTrue(jalse.getEntityListeners().isEmpty());
}
@Test
public void killEntityTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
final Entity entity1 = jalse.newEntity(new UUID(0, 1));
final Entity entity2 = jalse.newEntity(new UUID(0, 2));
final Entity entity3 = jalse.newEntity(new UUID(0, 3));
Assert.assertTrue(entity1.isAlive());
Assert.assertTrue(entity2.isAlive());
Assert.assertTrue(entity3.isAlive());
jalse.killEntity(new UUID(0, 1));
Assert.assertFalse(entity1.isAlive());
Assert.assertTrue(entity2.isAlive());
Assert.assertTrue(entity3.isAlive());
jalse.killEntities();
Assert.assertFalse(entity1.isAlive());
Assert.assertFalse(entity2.isAlive());
Assert.assertFalse(entity3.isAlive());
}
@Test
public void newEntityTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
final UUID id = new UUID(0, 1);
final Entity entity = jalse.newEntity(id, TestEntity.class, new DefaultAttributeContainer());
Assert.assertEquals(1, jalse.getEntityCount());
Assert.assertTrue(jalse.getEntityIDs().contains(id));
Assert.assertEquals(entity, jalse.getEntity(id));
final UUID otherID = new UUID(0, 2);
entity.newEntity(otherID);
Assert.assertEquals(1, jalse.getEntityCount());
Assert.assertEquals(2, jalse.getTreeCount());
Assert.assertTrue(jalse.getIDsInTree().contains(id));
Assert.assertTrue(jalse.getIDsInTree().contains(otherID));
final UUID thirdID = new UUID(0, 3);
final DefaultJALSE jalse2 = new DefaultJALSE(new UUID(0, 1), ForkJoinActionEngine.commonPoolEngine(),
new DefaultEntityFactory());
final Entity otherEntity = jalse2.newEntity(thirdID);
jalse.receiveEntity(otherEntity);
Assert.assertTrue(jalse.getEntityIDs().contains(thirdID));
Stream<Entity> entityStream = jalse.streamEntities();
Assert.assertTrue(entityStream.filter(e -> e.getID().equals(id)).findAny().isPresent());
entityStream = jalse.streamEntityTree();
Assert.assertTrue(entityStream.filter(e -> e.getID().equals(otherID)).findAny().isPresent());
}
@Test
public void pauseTest() {
jalse = new DefaultJALSE(new UUID(0, 0), new ThreadPoolActionEngine(1), new DefaultEntityFactory());
Assert.assertFalse(jalse.isPaused());
jalse.pause();
Assert.assertTrue(jalse.isPaused());
jalse.resume();
Assert.assertFalse(jalse.isPaused());
}
@Test
public void scheduleTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
final TestAction action = new TestAction();
jalse.scheduleForActor(action, 0, 1, TimeUnit.MILLISECONDS);
try {
Thread.sleep(10);
} catch (final InterruptedException e) {
Assert.fail();
}
Assert.assertNotEquals(0, action.actCount);
jalse.cancelAllScheduledForActor();
final int actCount = action.actCount;
try {
Thread.sleep(10);
} catch (final InterruptedException e) {
Assert.fail();
}
Assert.assertEquals(actCount, action.actCount);
}
@Test
public void stopTest() {
jalse = new DefaultJALSE(new UUID(0, 0), new ThreadPoolActionEngine(1), new DefaultEntityFactory());
Assert.assertFalse(jalse.isStopped());
jalse.stop();
Assert.assertTrue(jalse.isStopped());
}
@Test
public void tagTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
Assert.assertFalse(jalse.getTags().isEmpty());
}
@Test
public void transferEntityTest() {
jalse = new DefaultJALSE(new UUID(0, 0), ForkJoinActionEngine.commonPoolEngine(), new DefaultEntityFactory());
final DefaultJALSE otherJALSE = new DefaultJALSE(new UUID(0, 1), ForkJoinActionEngine.commonPoolEngine(),
new DefaultEntityFactory());
final UUID id = new UUID(0, 2);
jalse.newEntity(id);
jalse.transferEntity(id, otherJALSE);
Assert.assertFalse(jalse.getEntityIDs().contains(id));
Assert.assertTrue(otherJALSE.getEntityIDs().contains(id));
}
}