freecol/test/src/net/sf/freecol/common/model/SchoolTest.java

207 lines
8.0 KiB
Java

/**
* Copyright (C) 2002-2022 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.common.model;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import static net.sf.freecol.common.util.CollectionUtils.*;
import net.sf.freecol.server.model.ServerBuilding;
import net.sf.freecol.util.test.FreeColTestCase;
import net.sf.freecol.util.test.FreeColTestUtils;
import net.sf.freecol.util.test.FreeColTestUtils.ColonyBuilder;
public class SchoolTest extends FreeColTestCase {
private enum SchoolLevel { SCHOOLHOUSE, COLLEGE, UNIVERSITY };
private static final BuildingType schoolType
= spec().getBuildingType("model.building.schoolhouse");
private static final BuildingType collegeType
= spec().getBuildingType("model.building.college");
private static final BuildingType universityType
= spec().getBuildingType("model.building.university");
private static final GoodsType lumber
= spec().getGoodsType("model.goods.lumber");
private static final GoodsType cotton
= spec().getGoodsType("model.goods.cotton");
private static final UnitType colonialRegularType
= spec().getUnitType("model.unit.colonialRegular");
private static final UnitType elderStatesmanType
= spec().getUnitType("model.unit.elderStatesman");
private static final UnitType expertLumberJackType
= spec().getUnitType("model.unit.expertLumberJack");
private static final UnitType expertOreMinerType
= spec().getUnitType("model.unit.expertOreMiner");
private static final UnitType freeColonistType
= spec().getUnitType("model.unit.freeColonist");
private static final UnitType indenturedServantType
= spec().getUnitType("model.unit.indenturedServant");
private static final UnitType pettyCriminalType
= spec().getUnitType("model.unit.pettyCriminal");
private static final UnitType masterBlacksmithType
= spec().getUnitType("model.unit.masterBlacksmith");
private static final UnitType masterCarpenterType
= spec().getUnitType("model.unit.masterCarpenter");
private static final UnitType veteranSoldierType
= spec().getUnitType("model.unit.veteranSoldier");
private Building addSchoolToColony(Game game, Colony colony,
SchoolLevel level) {
BuildingType type = null;;
switch (level) {
case SCHOOLHOUSE:
type = schoolType;
break;
case COLLEGE:
type = collegeType;
break;
case UNIVERSITY:
type = universityType;
break;
default:
fail("Setup error, cannot setup school");
}
colony.addBuilding(new ServerBuilding(game, colony, type));
return colony.getBuilding(type);
}
/**
* Returns a list of all units in this colony of the given type.
*
* @param type The type of the units to include in the list. For instance
* Unit.EXPERT_FARMER.
* @return A list of all the units of the given type in this colony.
*/
private List<Unit> getUnitList(Colony colony, UnitType type) {
return transform(colony.getUnits(), matchKey(type, Unit::getType));
}
public void testUpgrades() {
assertEquals("Colonist should upgrade to carpenter",
masterCarpenterType,
freeColonistType.getTeachingType(masterCarpenterType));
assertEquals("Servant should upgrade to colonist",
freeColonistType,
indenturedServantType.getTeachingType(masterCarpenterType));
assertEquals("Criminal should upgrade to servant",
indenturedServantType,
pettyCriminalType.getTeachingType(masterCarpenterType));
}
public void testEducationOption() {
Game game = getGame();
game.changeMap(getTestMap(true));
Colony colony = getStandardColony(5);
Iterator<Unit> units = colony.getUnitList().iterator();
Unit lumberJack = units.next();
lumberJack.setType(expertLumberJackType);
Unit criminal1 = units.next();
criminal1.setType(pettyCriminalType);
Unit criminal2 = units.next();
criminal2.setType(pettyCriminalType);
Unit colonist1 = units.next();
colonist1.setType(freeColonistType);
Unit colonist2 = units.next();
colonist2.setType(freeColonistType);
boolean selection = FreeColTestUtils.setStudentSelection(true);
colony.addBuilding(new ServerBuilding(getGame(), colony, schoolType));
Building school = colony.getBuilding(schoolType);
assertTrue(school.canTeach());
assertTrue(colony.canTrain(lumberJack));
lumberJack.setLocation(school);
colonist1.changeWorkType(cotton);
colonist2.changeWorkType(lumber);
assertEquals(cotton, colonist1.getWorkType());
assertEquals(expertLumberJackType.getExpertProduction(), colonist2.getWorkType());
assertEquals(null, colony.findStudent(lumberJack));
lumberJack.setStudent(null);
colonist2.setTeacher(null);
FreeColTestUtils.setStudentSelection(false);
criminal1.changeWorkType(cotton);
criminal2.changeWorkType(lumber);
assertEquals(criminal2, colony.findStudent(lumberJack));
FreeColTestUtils.setStudentSelection(selection);
}
public void testChangeTeachers() {
Game game = getGame();
game.changeMap(getTestMap());
// Setup
ColonyBuilder colBuilder = FreeColTestUtils.getColonyBuilder();
colBuilder.initialColonists(3).addColonist(expertLumberJackType)
.addColonist(expertLumberJackType);
Colony colony = colBuilder.build();
Building school = addSchoolToColony(game, colony, SchoolLevel.COLLEGE);
Unit student = getUnitList(colony, freeColonistType).get(0);
List<Unit> teacherList = getUnitList(colony, expertLumberJackType);
Unit teacher1 = teacherList.get(0);
Unit teacher2 = teacherList.get(1);
assertNull("Teacher1 should not have a student yet",
teacher1.getStudent());
assertNull("Teacher2 should not have a student yet",
teacher2.getStudent());
boolean selection = FreeColTestUtils.setStudentSelection(false);
// add first teacher
teacher1.setLocation(school);
assertEquals("Teacher1 should now have a student", student,
teacher1.getStudent());
assertEquals("Student should have assigned teacher1", teacher1,
student.getTeacher());
// add a second teacher
teacher2.setLocation(school);
assertEquals("Teacher1 should still have a student",
teacher1.getStudent(), student);
assertNull("Teacher2 should not have a student yet",
teacher2.getStudent());
assertEquals("Student should have assigned teacher1",
student.getTeacher(), teacher1);
// change teacher
student.setTeacher(teacher2);
assertNull("Teacher1 should not have a student now",
teacher1.getStudent());
assertEquals("Teacher2 should now have a student", student,
teacher2.getStudent());
assertEquals("Student should have assigned teacher2", teacher2,
student.getTeacher());
FreeColTestUtils.setStudentSelection(selection);
}
}