/* * Copyright 2015 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.After; import org.junit.Test; import org.terasology.entitysystem.component.CodeGenComponentManager; import org.terasology.entitysystem.inmemory.InMemoryEntityManager; import org.terasology.valuetype.ImmutableCopy; import org.terasology.valuetype.TypeHandler; import org.terasology.valuetype.TypeLibrary; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Optional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * */ public class BasicEntityTest { private EntityManager entityManager; private URLClassLoader tempLoader; public BasicEntityTest() { TypeLibrary typeLibrary = new TypeLibrary(); typeLibrary.addHandler(new TypeHandler<>(String.class, ImmutableCopy.create())); tempLoader = new URLClassLoader(new URL[0]); entityManager = new InMemoryEntityManager(new CodeGenComponentManager(typeLibrary, tempLoader)); } @After public void teardown() throws IOException { tempLoader.close(); } @Test public void createEntity() { entityManager.createEntity(entityManager.createComponent(SampleComponent.class)); } @Test(expected = IllegalArgumentException.class) public void createEntityWithoutComponentsFails() { entityManager.createEntity(Lists.newArrayList()); } @Test public void retrieveComponentFromEntity() { SampleComponent component = entityManager.createComponent(SampleComponent.class); component.setName("Name"); component.setDescription("Description"); long entity = entityManager.createEntity(component); Optional<SampleComponent> retrievedComponent = entityManager.getComponent(entity, SampleComponent.class); assertTrue(retrievedComponent.isPresent()); assertEquals(component.getName(), retrievedComponent.get().getName()); assertEquals(component.getDescription(), retrievedComponent.get().getDescription()); } @Test public void addComponentToEntity() { long entity = entityManager.createEntity(entityManager.createComponent(SampleComponent.class)); SecondComponent secondComponent = entityManager.createComponent(SecondComponent.class); assertTrue(entityManager.addComponent(entity, secondComponent)); assertTrue(entityManager.getComponent(entity, SecondComponent.class).isPresent()); } @Test public void addComponentToEntityThatAlreadyHasIt() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); assertFalse(entityManager.addComponent(entity, component)); } @Test public void updateComponent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); SampleComponent updatedComponent = entityManager.getComponent(entity, SampleComponent.class).get(); updatedComponent.setName("Mooooo"); assertTrue(entityManager.updateComponent(entity, updatedComponent)); assertEquals(updatedComponent.getName(), entityManager.getComponent(entity, SampleComponent.class).get().getName()); } @Test public void updateComponentFailsIfComponentNotPresent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entityOne = entityManager.createEntity(component); long entityTwo = entityManager.createEntity(component); SecondComponent secondComponent = entityManager.createComponent(SecondComponent.class); entityManager.addComponent(entityOne, secondComponent); secondComponent.setName("Mooooo"); assertFalse(entityManager.updateComponent(entityTwo, secondComponent)); assertFalse(entityManager.getComponent(entityTwo, SecondComponent.class).isPresent()); } @Test public void removeComponent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); assertTrue(entityManager.removeComponent(entity, SampleComponent.class)); assertFalse(entityManager.getComponent(entity, SampleComponent.class).isPresent()); } @Test public void removeComponentFailsIfNotPresent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); assertFalse(entityManager.removeComponent(entity, SecondComponent.class)); } @Test public void changesInOriginalComponentDoesNotChangeStoredComponent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); component.setName("New Name"); assertNotEquals(component.getName(), entityManager.getComponent(entity, SampleComponent.class).get().getName()); } @Test public void changesInRetrievedComponentDoesNotChangeStoredComponent() { SampleComponent component = entityManager.createComponent(SampleComponent.class); long entity = entityManager.createEntity(component); component = entityManager.getComponent(entity, SampleComponent.class).get(); component.setName("New Name"); assertNotEquals(component.getName(), entityManager.getComponent(entity, SampleComponent.class).get().getName()); } }