package net.zomis.cardshifter.ecs; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import com.cardshifter.modapi.base.ComponentRetriever; import com.cardshifter.modapi.base.ECSGame; import com.cardshifter.modapi.base.Entity; import com.cardshifter.modapi.phase.Phase; import com.cardshifter.modapi.phase.PhaseController; import com.cardshifter.modapi.phase.PhaseStartEvent; import com.cardshifter.modapi.resources.ECSResource; import com.cardshifter.modapi.resources.ECSResourceData; import com.cardshifter.modapi.resources.ECSResourceMap; import com.cardshifter.modapi.resources.ResourceValueChange; public class ResourceTest { private enum TestResource implements ECSResource { TEST_A, TEST_B; } private ECSGame game; private Entity entity; private ComponentRetriever<ECSResourceMap> resMapper; private int resourceChange = 0; @Before public void setup() { game = new ECSGame(); entity = game.newEntity(); resMapper = game.componentRetreiver(ECSResourceMap.class); ECSResourceMap res = ECSResourceMap.createFor(entity); res.getResource(TestResource.TEST_A).set(10); res.getResource(TestResource.TEST_B).set(5); PhaseController controller = new PhaseController(); controller.addPhase(new Phase(entity, "A")); controller.addPhase(new Phase(entity, "B")); entity.addComponent(controller); } @Test public void resourceEvents() { game.getEvents().registerHandlerAfter(this, ResourceValueChange.class, event -> this.resourceChange++); assertEquals(0, this.resourceChange); ECSResourceData resA = resMapper.get(entity).getResource(TestResource.TEST_A); resA.set(42); assertEquals(1, this.resourceChange); resA.set(100); assertEquals(2, this.resourceChange); resA.set(100); assertEquals(2, this.resourceChange); // no actual change, should not cause an event } @Test public void resourceGetsBonusFromOtherEntity() { ECSResourceData resA = resMapper.get(entity).getResource(TestResource.TEST_A); resA.set(5); Entity enchanter = game.newEntity(); ECSResourceMap.createFor(enchanter); ECSResourceData bonusResource = resMapper.get(enchanter).getResource(TestResource.TEST_B); resA.setStrategy((ent, res, value) -> value + bonusResource.get()); assertEquals(0, bonusResource.get()); assertEquals(5, resA.get()); bonusResource.set(10); assertEquals(15, resA.get()); } @Test public void addResourceEachTurn() { game.addSystem(g -> g.getEvents().registerHandlerAfter(this, PhaseStartEvent.class, this::addResources)); game.startGame(); ECSResourceData resA = resMapper.get(entity).getResource(TestResource.TEST_A); ECSResourceData resB = resMapper.get(entity).getResource(TestResource.TEST_B); assertEquals("Resource A first turn", 10, resA.get()); assertEquals("Resource B first turn", 5, resB.get()); PhaseController controller = entity.getComponent(PhaseController.class); controller.nextPhase(); assertEquals("Resource A turn 2", 10, resA.get()); assertEquals("Resource B turn 2", 6, resB.get()); controller.nextPhase(); assertEquals("Resource A turn 3", 11, resA.get()); assertEquals("Resource B turn 3", 6, resB.get()); controller.nextPhase(); assertEquals("Resource A turn 4", 11, resA.get()); assertEquals("Resource B turn 4", 7, resB.get()); } private void addResources(PhaseStartEvent event) { ECSResource resource = event.getNewPhase().getName().equals("A") ? TestResource.TEST_A : TestResource.TEST_B; entity.getComponent(ECSResourceMap.class).getResource(resource).change(1); } }