/** * Copyright (C) 2002-2012 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.io.ByteArrayInputStream; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.StringReader; import java.io.StringWriter; import java.util.List; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import net.sf.freecol.common.io.FreeColSavegameFile; import net.sf.freecol.common.io.FreeColTcFile; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.server.ServerTestHelper; import net.sf.freecol.util.test.FreeColTestCase; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class SerializationTest extends FreeColTestCase { private static Validator buildValidator(String path) throws SAXException { SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); File schemaLocation = new File(path); Schema schema = factory.newSchema(schemaLocation); return schema.newValidator(); } private Source buildSource(FreeColObject object, Player player, boolean showAll, boolean toSavedGame) throws Exception { return new StreamSource(new StringReader(serialize(object, player, showAll, toSavedGame))); } private void validateMap(String name) throws Exception { try{ Validator mapValidator = buildValidator("schema/data/data-savedGame.xsd"); FreeColSavegameFile mapFile = new FreeColSavegameFile(new File(name)); mapValidator.validate(new StreamSource(mapFile.getSavegameInputStream())); } catch(SAXParseException e){ String errMsg = e.getMessage() + " at line=" + e.getLineNumber() + " column=" + e.getColumnNumber(); fail(errMsg); } } public void testValidation() throws Exception { Game game = ServerTestHelper.startServerGame(getTestMap(true)); Colony colony = getStandardColony(6); Player player = game.getPlayer("model.nation.dutch"); ServerTestHelper.newTurn(); ServerTestHelper.newTurn(); try { Validator validator = buildValidator("schema/data/data-game.xsd"); validator.validate(buildSource(game, player, true, true)); } catch(SAXParseException e){ String errMsg = e.getMessage() + " at line=" + e.getLineNumber() + " column=" + e.getColumnNumber(); fail(errMsg); } ServerTestHelper.stopServerGame(); } public void testMapAfrica() throws Exception { validateMap("data/maps/Africa.fsg"); } public void testMapAustralia() throws Exception { validateMap("data/maps/Australia.fsg"); } public void testMapAmerica() throws Exception { validateMap("data/maps/America_large.fsg"); } public void testMapCaribbean() throws Exception { validateMap("data/maps/Caribbean_basin.fsg"); } public void testStringTemplate() throws Exception { StringTemplate t1 = StringTemplate.template("model.goods.goodsAmount") .add("%goods%", "model.goods.food.name") .addName("%amount%", "100"); StringTemplate t2 = StringTemplate.template("model.goods.goodsAmount") .addAmount("%amount%", 50) .addStringTemplate("%goods%", t1); Game game = getGame(); Player player = game.getPlayer("model.nation.dutch"); try { Validator validator = buildValidator("schema/data/data-stringTemplate.xsd"); validator.validate(buildSource(t2, player, true, true)); } catch (SAXParseException e){ String errMsg = e.getMessage() + " at line=" + e.getLineNumber() + " column=" + e.getColumnNumber(); fail(errMsg); } } public void testSpecification() throws Exception { try { String filename = "test/data/specification.xml"; Validator validator = buildValidator("schema/specification-schema.xsd"); FileWriter sw = new FileWriter(filename); XMLOutputFactory xif = XMLOutputFactory.newInstance(); XMLStreamWriter out = xif.createXMLStreamWriter(sw); spec().toXMLImpl(out); out.close(); validator.validate(new StreamSource(new FileReader(filename))); } catch (SAXParseException e) { String errMsg = e.getMessage() + " at line=" + e.getLineNumber() + " column=" + e.getColumnNumber(); fail(errMsg); } } public void testDifficulty() throws Exception { Specification specification1 = null; Specification specification2 = null; try { specification1 = new FreeColTcFile("classic").getSpecification(); specification1.applyDifficultyLevel("model.difficulty.veryEasy"); StringWriter sw = new StringWriter(); XMLOutputFactory xif = XMLOutputFactory.newInstance(); XMLStreamWriter out = xif.createXMLStreamWriter(sw); specification1.toXMLImpl(out); out.close(); specification2 = new Specification(new ByteArrayInputStream(sw.toString().getBytes())); } catch(Exception e) { fail(e.getMessage()); } assertNotNull(specification1); assertNotNull(specification2); OptionGroup level1 = specification1.getDifficultyLevel(); OptionGroup level2 = specification2.getDifficultyLevel(); assertNotNull(level1); assertNotNull(level2); assertEquals(level1.getId(), level2.getId()); try { int increment1 = specification1.getIntegerOption("model.option.crossesIncrement").getValue(); int increment2 = specification2.getIntegerOption("model.option.crossesIncrement").getValue(); assertEquals(increment1, increment2); } catch (Exception e) { fail(e.getMessage()); } } public void testGeneratedLists() throws Exception { Specification specification1 = null; Specification specification2 = null; try { specification1 = new FreeColTcFile("classic").getSpecification(); specification1.applyDifficultyLevel("model.difficulty.veryEasy"); StringWriter sw = new StringWriter(); XMLOutputFactory xif = XMLOutputFactory.newInstance(); XMLStreamWriter out = xif.createXMLStreamWriter(sw); specification1.toXMLImpl(out); out.close(); specification2 = new Specification(new ByteArrayInputStream(sw.toString().getBytes())); } catch (Exception e) { fail(e.getMessage()); } List<GoodsType> food1 = specification1.getFoodGoodsTypeList(); List<GoodsType> food2 = specification2.getFoodGoodsTypeList(); assertEquals(food1.size(), food2.size()); assertEquals(food1.get(0).getId(), food2.get(0).getId()); List<GoodsType> farmed1 = specification1.getFarmedGoodsTypeList(); List<GoodsType> farmed2 = specification2.getFarmedGoodsTypeList(); assertEquals(farmed1.size(), farmed2.size()); assertEquals(farmed1.get(0).getId(), farmed2.get(0).getId()); } }