package jalse.entities;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import jalse.actions.Action;
import jalse.actions.ActionContext;
import jalse.actions.DefaultActionScheduler;
import jalse.attributes.AttributeEvent;
import jalse.attributes.AttributeListener;
import jalse.attributes.Attributes;
import jalse.attributes.DefaultAttributeContainer;
public class DefaultEntityTest {
private class TestAction implements Action<Entity> {
@Override
public void perform(final ActionContext<Entity> context) throws InterruptedException {}
}
private class TestAttributeListener implements AttributeListener<Integer> {
public boolean present;
public int val;
@Override
public void attributeAdded(final AttributeEvent<Integer> event) {
present = true;
val = event.getValue();
}
@Override
public void attributeChanged(final AttributeEvent<Integer> event) {
val = event.getValue();
}
@Override
public void attributeRemoved(final AttributeEvent<Integer> event) {
present = false;
}
}
private interface TestEntity extends Entity {}
private interface TestEntity2 extends TestEntity {}
private class TestEntityListener implements EntityListener {
@Override
public void entityCreated(final EntityEvent event) {}
@Override
public void entityKilled(final EntityEvent event) {}
@Override
public void entityReceived(final EntityEvent event) {}
@Override
public void entityTransferred(final EntityEvent event) {}
}
private class TestEntityTypeListener implements EntityTypeListener {
boolean unmark;
boolean mark;
@Override
public void entityMarkedAsType(final EntityTypeEvent event) {
mark = true;
}
@Override
public void entityUnmarkedAsType(final EntityTypeEvent event) {
unmark = true;
}
}
DefaultEntity entity;
@After
public void after() {
entity = null;
}
@Test
public void attributeListenerTest() {
entity = createDefaultEntity();
final TestAttributeListener testAttributeListener = new TestAttributeListener();
Assert.assertFalse(testAttributeListener.present);
entity.addAttributeListener("test", Attributes.INTEGER_TYPE, testAttributeListener);
Assert.assertTrue(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
Assert.assertTrue(entity.getAttributeListenerNames().contains("test"));
Assert.assertTrue(entity.getAttributeListenerTypes("test").contains(Attributes.INTEGER_TYPE));
entity.setAttribute("test", Attributes.INTEGER_TYPE, 10);
Assert.assertTrue(testAttributeListener.present);
Assert.assertEquals(10, testAttributeListener.val);
entity.setAttribute("test", Attributes.INTEGER_TYPE, 42);
entity.fireAttributeChanged("test", Attributes.INTEGER_TYPE);
Assert.assertEquals(42, testAttributeListener.val);
entity.removeAttribute("test", Attributes.INTEGER_TYPE);
Assert.assertFalse(testAttributeListener.present);
entity.removeAttributeListener("test", Attributes.INTEGER_TYPE, testAttributeListener);
Assert.assertFalse(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
entity.addAttributeListener("test", Attributes.INTEGER_TYPE, testAttributeListener);
Assert.assertTrue(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
entity.removeAttributeListeners("test", Attributes.INTEGER_TYPE);
Assert.assertFalse(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
entity.addAttributeListener("test", Attributes.INTEGER_TYPE, testAttributeListener);
Assert.assertTrue(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
entity.removeAttributeListeners();
Assert.assertFalse(
entity.getAttributeListeners("test", Attributes.INTEGER_TYPE).contains(testAttributeListener));
}
@Test
public void attributeTest() {
entity = createDefaultEntity();
entity.setAttribute("test", Attributes.INTEGER_TYPE, 10);
Assert.assertEquals(10, (int) entity.getAttribute("test", Attributes.INTEGER_TYPE));
Assert.assertTrue(entity.getAttributeTypes("test").contains(Attributes.INTEGER_TYPE));
entity.setAttribute("test2", Attributes.DOUBLE_TYPE, 3.14);
Assert.assertEquals(2, entity.getAttributeCount());
final Set<String> entityAttributeNames = entity.getAttributeNames();
Assert.assertTrue(entityAttributeNames.contains("test"));
Assert.assertTrue(entityAttributeNames.contains("test2"));
Assert.assertNotNull(entity.streamAttributes());
entity.removeAttribute("test", Attributes.INTEGER_TYPE);
Assert.assertFalse(entity.getAttributeNames().contains("test"));
entity.removeAttributes();
Assert.assertTrue(entity.getAttributeNames().isEmpty());
}
@Test
public void buildEntityTest() {
entity = createDefaultEntity();
Assert.assertNotNull(entity);
}
public DefaultEntity createDefaultEntity() {
final UUID id = new UUID(0, 0);
final DefaultEntityFactory factory = new DefaultEntityFactory();
final DefaultEntityContainer container = new DefaultEntityContainer();
return new DefaultEntity(id, factory, container);
}
@Test(expected = IllegalStateException.class)
public void deadEntityTest() {
entity = createDefaultEntity();
entity.markAsDead();
Assert.assertFalse(entity.isAlive());
Assert.assertNull(entity.getContainer());
entity.newEntity(new UUID(0, 1), new DefaultAttributeContainer());
}
@Test
public void entityListenerTest() {
entity = createDefaultEntity();
final TestEntityListener testEntityListener = new TestEntityListener();
entity.addEntityListener(testEntityListener);
Assert.assertTrue(entity.getEntityListeners().contains(testEntityListener));
entity.removeEntityListener(testEntityListener);
Assert.assertFalse(entity.getEntityListeners().contains(testEntityListener));
entity.addEntityListener(testEntityListener);
Assert.assertTrue(entity.getEntityListeners().contains(testEntityListener));
entity.removeEntityListeners();
Assert.assertFalse(entity.getEntityListeners().contains(testEntityListener));
}
@Test
public void entityTypeListenerTest() {
entity = createDefaultEntity();
final TestEntityTypeListener testEntityTypeListener = new TestEntityTypeListener();
entity.addEntityTypeListener(testEntityTypeListener);
Assert.assertTrue(entity.getEntityTypeListeners().contains(testEntityTypeListener));
entity.removeEntityTypeListener(testEntityTypeListener);
Assert.assertFalse(entity.getEntityTypeListeners().contains(testEntityTypeListener));
entity.addEntityTypeListener(testEntityTypeListener);
Assert.assertTrue(entity.getEntityTypeListeners().contains(testEntityTypeListener));
entity.removeEntityTypeListeners();
Assert.assertFalse(entity.getEntityTypeListeners().contains(testEntityTypeListener));
}
@Test
public void getEntityTest() {
entity = createDefaultEntity();
entity.markAsAlive();
entity.newEntity(new UUID(0, 1), new DefaultAttributeContainer());
Assert.assertEquals(1, entity.getEntityCount());
Assert.assertTrue(entity.getEntityIDs().contains(new UUID(0, 1)));
Assert.assertTrue(entity.streamEntityIDs().iterator().hasNext());
Assert.assertNotNull(entity.getEntity(new UUID(0, 1)));
}
@Test
public void killEntityTest() {
entity = createDefaultEntity();
entity.markAsAlive();
entity.newEntity(new UUID(0, 0), new DefaultAttributeContainer());
Assert.assertNotNull(entity.getEntity(new UUID(0, 0)));
Assert.assertFalse(entity.kill());
entity.newEntity(new UUID(0, 1), new DefaultAttributeContainer());
entity.newEntity(new UUID(0, 2), new DefaultAttributeContainer());
entity.newEntity(new UUID(0, 3), new DefaultAttributeContainer());
Assert.assertNotNull(entity.getEntity(new UUID(0, 1)));
Assert.assertNotNull(entity.getEntity(new UUID(0, 2)));
Assert.assertNotNull(entity.getEntity(new UUID(0, 3)));
Assert.assertTrue(entity.killEntity(new UUID(0, 1)));
Assert.assertNull(entity.getEntity(new UUID(0, 1)));
entity.killEntities();
Assert.assertNull(entity.getEntity(new UUID(0, 2)));
Assert.assertNull(entity.getEntity(new UUID(0, 3)));
}
@Test
public void liveEntityTest() {
final UUID id = new UUID(0, 0);
final DefaultEntityFactory factory = new DefaultEntityFactory();
final DefaultEntityContainer container = new DefaultEntityContainer();
entity = new DefaultEntity(id, factory, container);
entity.markAsAlive();
entity.newEntity(new UUID(0, 1), new DefaultAttributeContainer());
Assert.assertEquals(1, entity.getEntityCount());
Assert.assertTrue(entity.isAlive());
Assert.assertEquals(container, entity.getContainer());
}
@Test
public void markAsTypeTest() {
entity = createDefaultEntity();
final TestEntityTypeListener listener = new TestEntityTypeListener();
entity.addEntityTypeListener(listener);
Assert.assertTrue(entity.markAsType(TestEntity2.class));
Assert.assertTrue(listener.mark);
Assert.assertTrue(entity.getMarkedAsTypes().contains(TestEntity2.class));
Assert.assertTrue(entity.getMarkedAsTypes().contains(TestEntity.class));
Assert.assertTrue(entity.isMarkedAsType(TestEntity2.class));
Assert.assertTrue(entity.isMarkedAsType(TestEntity.class));
Assert.assertFalse(entity.markAsType(TestEntity2.class));
Assert.assertFalse(entity.markAsType(TestEntity.class));
entity.unmarkAsType(TestEntity.class);
Assert.assertFalse(entity.getMarkedAsTypes().contains(TestEntity.class));
Assert.assertFalse(entity.isMarkedAsType(TestEntity.class));
Assert.assertTrue(listener.unmark);
Assert.assertTrue(entity.markAsType(TestEntity2.class));
entity.unmarkAsAllTypes();
Assert.assertTrue(entity.getMarkedAsTypes().isEmpty());
Assert.assertFalse(entity.streamMarkedAsTypes().iterator().hasNext());
}
@Test(expected = IllegalStateException.class)
public void newEntityTypeTest() {
entity = createDefaultEntity();
entity.markAsAlive();
entity.newEntity(new UUID(0, 1), TestEntity.class, new DefaultAttributeContainer());
Assert.assertEquals(1, entity.getEntityCount());
entity.markAsDead();
entity.newEntity(new UUID(0, 2), TestEntity.class, new DefaultAttributeContainer());
}
@Test
public void receiveEntityTest() {
entity = createDefaultEntity();
final UUID id = new UUID(0, 1);
final DefaultEntityFactory factory = new DefaultEntityFactory();
final DefaultEntityContainer container = new DefaultEntityContainer();
final DefaultEntity otherEntity = new DefaultEntity(id, factory, container);
otherEntity.markAsAlive();
entity.receiveEntity(otherEntity);
otherEntity.transfer(container);
Assert.assertEquals(otherEntity.getContainer(), container);
}
@Test(expected = IllegalStateException.class)
public void scheduleDeadTest() {
entity = createDefaultEntity();
entity.markAsDead();
entity.scheduleForActor(new TestAction(), 1, 10, TimeUnit.SECONDS);
}
@Test
public void scheduleLiveTest() {
entity = createDefaultEntity();
entity.markAsAlive();
Assert.assertEquals(new DefaultActionScheduler<>(entity).getEngine(), entity.getEngine());
entity.scheduleForActor(new TestAction(), 1, 10, TimeUnit.SECONDS);
}
}