/*
* Copyright 2010, Maarten Billemont
*
* 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 com.lyndir.omicron.api;
import static org.testng.Assert.*;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.lyndir.lhunath.opal.math.Side;
import com.lyndir.lhunath.opal.system.util.CollectionUtils;
import org.testng.annotations.Test;
/**
* @author lhunath, 2013-08-03
*/
public class ConstructorModuleTest extends AbstractTest {
@Test
public void testOnNewTurn()
throws Exception {
// Create a unit that can build BASE & MOBILITY.
ConstructorModule initBaseConstructorModule = ConstructorModule.createWithStandardResourceCost()
.buildSpeed( 3 )
.buildsModule( ModuleType.BASE );
ConstructorModule initMobilityConstructorModule = ConstructorModule.createWithStandardResourceCost()
.buildSpeed( 2 )
.buildsModule( ModuleType.MOBILITY );
GameObject baseMobilityConstructorUnit = createUnit( testUnitType( "Base Mobility Constructor",
BaseModule.createWithStandardResourceCost()
.maxHealth( 1 )
.armor( 1 )
.viewRange( 1 )
.supportedLayers( LevelType.values() ),
initBaseConstructorModule, initMobilityConstructorModule ), //
5, 5 );
staticGame.getController().setReady();
// Create a BASE unit type and a BASE & MOBILITY unit type.
UnitType baseUnit = testUnitType( "Base Unit", 5, BaseModule.createWithStandardResourceCost()
.maxHealth( 1 )
.armor( 1 )
.viewRange( 1 )
.supportedLayers( ImmutableSet.<LevelType>of() ) );
UnitType baseMobilityUnit = testUnitType( "Mobility Unit", 7, BaseModule.createWithStandardResourceCost()
.maxHealth( 1 )
.armor( 1 )
.viewRange( 1 )
.supportedLayers( ImmutableSet.<LevelType>of() ),
MobilityModule.createWithStandardResourceCost()
.movementSpeed( 1 )
.movementCost( ImmutableMap.<LevelType, Double>of() )
.levelingCost( ImmutableMap.<LevelType, Double>of() ) );
// Build a BASE unit, initially without resources.
ConstructorModule baseConstructorModule = baseMobilityConstructorUnit.getModule( ModuleType.CONSTRUCTOR, 0 ).get();
ConstructorModule mobilityConstructorModule = baseMobilityConstructorUnit.getModule( ModuleType.CONSTRUCTOR, 1 ).get();
ITile location1 = baseMobilityConstructorUnit.getLocation().get().neighbour( Side.E ).get();
ConstructorModule.ConstructionSite site1 = baseConstructorModule.schedule( baseUnit, location1 );
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site1.getRemainingWork( ModuleType.BASE ), 5 );
assertEquals( site1.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertEquals( site1.getLocation().get().getContents().get(), site1 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(), ImmutableSet.of( baseMobilityConstructorUnit, site1 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site1.getRemainingWork( ModuleType.BASE ), 5 );
assertEquals( site1.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertEquals( site1.getLocation().get().getContents().get(), site1 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(), ImmutableSet.of( baseMobilityConstructorUnit, site1 ) ) );
// Now provide resources, work = 5 so should take 2 turns at a speed of 3.
GameObject containerUnit = createUnit( testUnitType( "Metal Container", ContainerModule.createWithStandardResourceCost()
.resourceType( ResourceType.METALS )
.capacity( 100 ) ), 5, 6 );
final int baseMetals = baseUnit.getConstructionWork() * ModuleType.BASE.getStandardCost().get( ResourceType.METALS );
containerUnit.onModule( ModuleType.CONTAINER, 0, module -> module.addStock( baseMetals ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 0 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site1.getRemainingWork( ModuleType.BASE ), 2 );
assertEquals( site1.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertEquals( site1.getLocation().get().getContents().get(), site1 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, site1, containerUnit ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 1 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site1.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site1.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertNotEquals( site1.getLocation().get().getContents().get(), site1 );
GameObject newUnit1 = GameObject.cast( site1.getLocation().get().getContents().get() );
assertEquals( newUnit1.getType(), baseUnit );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, newUnit1, containerUnit ) ) );
assertEquals( containerUnit.getModule( ModuleType.CONTAINER, 0 ).get().getStock(), 0 );
newUnit1.getController().die();
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit ) ) );
// Build a BASE & MOBILITY unit, work = 7 so should take 3 turns at a speed of 3 for BASE and 4 turns at a speed of 2 for MOBILITY, so after 4 turns we should be done.
final int baseMobilityMetals =
baseMobilityUnit.getConstructionWork() * (ModuleType.BASE.getStandardCost().get( ResourceType.METALS ) + //
ModuleType.MOBILITY.getStandardCost().get( ResourceType.METALS ));
containerUnit.onModule( ModuleType.CONTAINER, 0, module -> module.addStock( baseMobilityMetals ) );
staticGame.getController().setReady();
ITile location2 = baseMobilityConstructorUnit.getLocation().get().neighbour( Side.W ).get();
ConstructorModule.ConstructionSite site2 = baseConstructorModule.schedule( baseMobilityUnit, location2 );
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site2.getRemainingWork( ModuleType.BASE ), 7 );
assertEquals( site2.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site2.getLocation().get().getContents().get(), site2 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit, site2 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 0 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site2.getRemainingWork( ModuleType.BASE ), 4 );
assertEquals( site2.getRemainingWork( ModuleType.MOBILITY ), 5 );
assertEquals( site2.getLocation().get().getContents().get(), site2 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit, site2 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 0 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site2.getRemainingWork( ModuleType.BASE ), 1 );
assertEquals( site2.getRemainingWork( ModuleType.MOBILITY ), 3 );
assertEquals( site2.getLocation().get().getContents().get(), site2 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit, site2 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 2 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site2.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site2.getRemainingWork( ModuleType.MOBILITY ), 1 );
assertEquals( site2.getLocation().get().getContents().get(), site2 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit, site2 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 1 );
assertEquals( site2.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site2.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertNotEquals( site2.getLocation().get().getContents().get(), site2 );
GameObject newUnit2 = GameObject.cast( site2.getLocation().get().getContents().get() );
assertEquals( newUnit2.getType(), baseMobilityUnit );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseMobilityConstructorUnit, containerUnit, newUnit2 ) ) );
assertEquals( containerUnit.getModule( ModuleType.CONTAINER, 0 ).get().getStock(), 0 );
newUnit2.getController().die();
baseMobilityConstructorUnit.getController().die();
containerUnit.getController().die();
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(), ImmutableSet.of() ) );
// Build a BASE & MOBILITY unit, using a constructor that can do only BASE, then help out with one that can do only MOBILITY.
initBaseConstructorModule = ConstructorModule.createWithStandardResourceCost().buildSpeed( 3 ).buildsModule( ModuleType.BASE );
GameObject baseConstructorUnit = createUnit( testUnitType( "Base Constructor", BaseModule.createWithStandardResourceCost()
.maxHealth( 1 )
.armor( 1 )
.viewRange( 1 )
.supportedLayers( LevelType.values() ),
initBaseConstructorModule ), 5, 5 );
baseConstructorModule = baseConstructorUnit.getModule( ModuleType.CONSTRUCTOR, 0 ).get();
containerUnit = createUnit( testUnitType( "Metal Container", ContainerModule.createWithStandardResourceCost()
.resourceType( ResourceType.METALS )
.capacity( 100 ) ), 5, 4 );
containerUnit.onModule( ModuleType.CONTAINER, 0, module -> module.addStock( baseMobilityMetals ) );
staticGame.getController().setReady();
ITile location3 = baseConstructorUnit.getLocation().get().neighbour( Side.E ).get();
ConstructorModule.ConstructionSite site3 = baseConstructorModule.schedule( baseMobilityUnit, location3 );
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 7 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 4 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 1 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, site3 ) ) );
// Send help.
initMobilityConstructorModule = ConstructorModule.createWithStandardResourceCost()
.buildSpeed( 2 )
.buildsModule( ModuleType.MOBILITY );
IGameObject mobilityConstructorUnit = createUnit( testUnitType( "Mobility Constructor", initMobilityConstructorModule ), 5, 6 );
mobilityConstructorModule = mobilityConstructorUnit.getModule( ModuleType.CONSTRUCTOR, 0 ).get();
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 2 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 7 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit,
site3 ) ) );
mobilityConstructorModule.setTarget( baseConstructorUnit );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 5 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit,
site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 3 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit,
site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 0 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 1 );
assertEquals( site3.getLocation().get().getContents().get(), site3 );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit,
site3 ) ) );
staticGame.getController().setReady();
assertEquals( baseConstructorModule.getRemainingSpeed(), 3 );
assertEquals( mobilityConstructorModule.getRemainingSpeed(), 1 );
assertEquals( site3.getRemainingWork( ModuleType.BASE ), 0 );
assertEquals( site3.getRemainingWork( ModuleType.MOBILITY ), 0 );
assertNotEquals( site3.getLocation().get().getContents().get(), site3 );
GameObject newUnit3 = GameObject.cast( site3.getLocation().get().getContents().get() );
assertEquals( newUnit3.getType(), baseMobilityUnit );
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit,
newUnit3 ) ) );
assertEquals( containerUnit.getModule( ModuleType.CONTAINER, 0 ).get().getStock(), 0 );
newUnit3.getController().die();
assertTrue( CollectionUtils.isEqualElements( staticPlayer.getObjects(),
ImmutableSet.of( baseConstructorUnit, containerUnit, mobilityConstructorUnit ) ) );
}
}