/*
* Copyright 2013 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.entitySystem;
import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.terasology.engine.SimpleUri;
import org.terasology.entitySystem.entity.EntityRef;
import org.terasology.entitySystem.entity.internal.PojoEntityManager;
import org.terasology.entitySystem.event.AbstractConsumableEvent;
import org.terasology.entitySystem.event.EventPriority;
import org.terasology.entitySystem.event.ReceiveEvent;
import org.terasology.entitySystem.event.internal.EventSystemImpl;
import org.terasology.entitySystem.metadata.ComponentLibrary;
import org.terasology.entitySystem.metadata.EntitySystemLibrary;
import org.terasology.entitySystem.prefab.internal.PojoPrefabManager;
import org.terasology.entitySystem.stubs.IntegerComponent;
import org.terasology.entitySystem.stubs.StringComponent;
import org.terasology.entitySystem.systems.BaseComponentSystem;
import org.terasology.network.NetworkMode;
import org.terasology.network.NetworkSystem;
import org.terasology.persistence.typeHandling.TypeSerializationLibrary;
import org.terasology.reflection.copy.CopyStrategyLibrary;
import org.terasology.reflection.reflect.ReflectFactory;
import org.terasology.reflection.reflect.ReflectionReflectFactory;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* @author Immortius <immortius@gmail.com>
*/
public class PojoEventSystemTests {
ComponentLibrary compLibrary;
EventSystemImpl eventSystem;
PojoEntityManager entityManager;
EntityRef entity;
@Before
public void setup() {
ReflectFactory reflectFactory = new ReflectionReflectFactory();
CopyStrategyLibrary copyStrategies = new CopyStrategyLibrary(reflectFactory);
TypeSerializationLibrary serializationLibrary = new TypeSerializationLibrary(reflectFactory, copyStrategies);
EntitySystemLibrary entitySystemLibrary = new EntitySystemLibrary(reflectFactory, copyStrategies, serializationLibrary);
compLibrary = entitySystemLibrary.getComponentLibrary();
entityManager = new PojoEntityManager();
entityManager.setEntitySystemLibrary(entitySystemLibrary);
entityManager.setPrefabManager(new PojoPrefabManager());
NetworkSystem networkSystem = mock(NetworkSystem.class);
when(networkSystem.getMode()).thenReturn(NetworkMode.NONE);
eventSystem = new EventSystemImpl(entitySystemLibrary.getEventLibrary(), networkSystem);
entityManager.setEventSystem(eventSystem);
entity = entityManager.create();
}
@Test
public void testSendEventToEntity() {
StringComponent component = entity.addComponent(new StringComponent());
TestEventHandler handler = new TestEventHandler();
eventSystem.registerEventHandler(handler);
TestEvent event = new TestEvent();
entity.send(event);
assertEquals(1, handler.receivedList.size());
assertEquals(event, handler.receivedList.get(0).event);
assertEquals(entity, handler.receivedList.get(0).entity);
}
@Test
public void testSendEventToEntityWithMultipleComponents() {
StringComponent stringComponent = entity.addComponent(new StringComponent());
IntegerComponent intComponent = entity.addComponent(new IntegerComponent());
TestEventHandler handler = new TestEventHandler();
eventSystem.registerEventHandler(handler);
TestEvent event = new TestEvent();
entity.send(event);
assertEquals(2, handler.receivedList.size());
for (TestEventHandler.Received received : handler.receivedList) {
assertEquals(event, received.event);
assertEquals(entity, received.entity);
}
}
@Test
public void testSendEventToEntityComponent() {
StringComponent component = entity.addComponent(new StringComponent());
IntegerComponent intComponent = entity.addComponent(new IntegerComponent());
TestEventHandler handler = new TestEventHandler();
eventSystem.registerEventHandler(handler);
TestEvent event = new TestEvent();
eventSystem.send(entity, event, intComponent);
assertEquals(1, handler.receivedList.size());
assertEquals(event, handler.receivedList.get(0).event);
assertEquals(entity, handler.receivedList.get(0).entity);
}
@Test
public void testNoReceiveEventWhenMissingComponents() {
StringComponent component = entity.addComponent(new StringComponent());
TestCompoundComponentEventHandler handler = new TestCompoundComponentEventHandler();
eventSystem.registerEventHandler(handler);
TestEvent event = new TestEvent();
eventSystem.send(entity, event);
assertEquals(0, handler.receivedList.size());
}
@Test
public void testReceiveEventRequiringMultipleComponents() {
StringComponent stringComponent = entity.addComponent(new StringComponent());
IntegerComponent intComponent = entity.addComponent(new IntegerComponent());
TestCompoundComponentEventHandler handler = new TestCompoundComponentEventHandler();
eventSystem.registerEventHandler(handler);
TestEvent event = new TestEvent();
eventSystem.send(entity, event);
assertEquals(1, handler.receivedList.size());
assertEquals(event, handler.receivedList.get(0).event);
assertEquals(entity, handler.receivedList.get(0).entity);
}
@Test
public void testPriorityAndCancel() {
StringComponent stringComponent = entity.addComponent(new StringComponent());
TestEventHandler handlerNormal = new TestEventHandler();
TestHighPriorityEventHandler handlerHigh = new TestHighPriorityEventHandler();
handlerHigh.cancel = true;
eventSystem.registerEventHandler(handlerNormal);
eventSystem.registerEventHandler(handlerHigh);
TestEvent event = new TestEvent();
eventSystem.send(entity, event);
assertEquals(1, handlerHigh.receivedList.size());
assertEquals(0, handlerNormal.receivedList.size());
}
@Test
public void testChildEvent() {
entity.addComponent(new IntegerComponent());
TestEventHandler handler = new TestEventHandler();
eventSystem.registerEvent(new SimpleUri("test:childEvent"), TestChildEvent.class);
eventSystem.registerEventHandler(handler);
TestChildEvent event = new TestChildEvent();
eventSystem.send(entity, event);
assertEquals(1, handler.childEventReceived.size());
assertEquals(1, handler.receivedList.size());
}
@Test
public void testChildEventReceivedByUnfilteredHandler() {
entity.addComponent(new IntegerComponent());
TestEventHandler handler = new TestEventHandler();
eventSystem.registerEvent(new SimpleUri("test:childEvent"), TestChildEvent.class);
eventSystem.registerEventHandler(handler);
TestChildEvent event = new TestChildEvent();
eventSystem.send(entity, event);
assertEquals(1, handler.unfilteredEvents.size());
}
private static class TestEvent extends AbstractConsumableEvent {
}
public static class TestChildEvent extends TestEvent {
}
public static class TestEventHandler extends BaseComponentSystem {
List<Received> receivedList = Lists.newArrayList();
List<Received> childEventReceived = Lists.newArrayList();
List<Received> unfilteredEvents = Lists.newArrayList();
@ReceiveEvent(components = StringComponent.class)
public void handleStringEvent(TestEvent event, EntityRef entity) {
receivedList.add(new Received(event, entity));
}
@ReceiveEvent(components = IntegerComponent.class)
public void handleIntegerEvent(TestEvent event, EntityRef entity) {
receivedList.add(new Received(event, entity));
}
@ReceiveEvent(components = IntegerComponent.class)
public void handleChildEvent(TestChildEvent event, EntityRef entity) {
childEventReceived.add(new Received(event, entity));
}
@ReceiveEvent
public void handleUnfilteredTestEvent(TestEvent event, EntityRef entity) {
unfilteredEvents.add(new Received(event, entity));
}
public void initialise() {
}
@Override
public void shutdown() {
}
public static class Received {
TestEvent event;
EntityRef entity;
public Received(TestEvent event, EntityRef entity) {
this.event = event;
this.entity = entity;
}
}
}
public static class TestHighPriorityEventHandler extends BaseComponentSystem {
public boolean cancel;
List<Received> receivedList = Lists.newArrayList();
@ReceiveEvent(components = StringComponent.class, priority = EventPriority.PRIORITY_HIGH)
public void handleStringEvent(TestEvent event, EntityRef entity) {
receivedList.add(new Received(event, entity));
if (cancel) {
event.consume();
}
}
@ReceiveEvent(components = IntegerComponent.class, priority = EventPriority.PRIORITY_HIGH)
public void handleIntegerEvent(TestEvent event, EntityRef entity) {
receivedList.add(new Received(event, entity));
}
public void initialise() {
}
@Override
public void shutdown() {
}
public static class Received {
TestEvent event;
EntityRef entity;
public Received(TestEvent event, EntityRef entity) {
this.event = event;
this.entity = entity;
}
}
}
public static class TestCompoundComponentEventHandler extends BaseComponentSystem {
List<Received> receivedList = Lists.newArrayList();
@ReceiveEvent(components = {StringComponent.class, IntegerComponent.class})
public void handleStringEvent(TestEvent event, EntityRef entity) {
receivedList.add(new Received(event, entity));
}
public void initialise() {
}
@Override
public void shutdown() {
}
public static class Received {
TestEvent event;
EntityRef entity;
public Received(TestEvent event, EntityRef entity) {
this.event = event;
this.entity = entity;
}
}
}
}