001/*
002 * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
003 * Copyright (C) 2000-2010 The Gridarta Developers.
004 *
005 * This program is free software; you can redistribute it and/or modify
006 * it under the terms of the GNU General Public License as published by
007 * the Free Software Foundation; either version 2 of the License, or
008 * (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU General Public License for more details.
014 *
015 * You should have received a copy of the GNU General Public License along
016 * with this program; if not, write to the Free Software Foundation, Inc.,
017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
018 */
019
020package net.sf.gridarta.model.gameobject;
021
022import java.awt.Point;
023import javax.swing.ImageIcon;
024import net.sf.gridarta.model.archetype.DuplicateArchetypeException;
025import net.sf.gridarta.model.archetype.TestArchetype;
026import net.sf.gridarta.model.archetypeset.ArchetypeSet;
027import net.sf.gridarta.model.baseobject.BaseObject;
028import net.sf.gridarta.model.face.FaceProvider;
029import net.sf.gridarta.model.maparchobject.TestMapArchObject;
030import net.sf.gridarta.model.mapmodel.CannotInsertGameObjectException;
031import net.sf.gridarta.model.mapmodel.MapModel;
032import net.sf.gridarta.model.mapmodel.TestMapModelCreator;
033import net.sf.gridarta.model.mapmodel.TestMapModelHelper;
034import org.jetbrains.annotations.NotNull;
035import org.junit.Assert;
036import org.junit.Test;
037
038/**
039 * Regression tests for {@link GameObjectFactory}.
040 * @author Andreas Kirschbaum
041 */
042public class GameObjectFactoryTest {
043
044    /**
045     * Checks that {@link net.sf.gridarta.model.gameobject.GameObjectFactory#cloneGameObject(GameObject)}
046     * correctly updates the container.
047     * @throws CannotInsertGameObjectException if the test fails
048     * @throws DuplicateArchetypeException if the test fails
049     */
050    @Test
051    public void testDoMoveSquareTopSingle() throws CannotInsertGameObjectException, DuplicateArchetypeException {
052        final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false);
053        final TestMapModelHelper mapModelHelper = mapModelCreator.newTestMapModelHelper();
054        final MapModel<TestGameObject, TestMapArchObject, TestArchetype> mapModel = mapModelCreator.newMapModel(1, 1);
055
056        final Point point = new Point(0, 0);
057        mapModel.beginTransaction("TEST");
058        final TestGameObject ob1 = mapModelHelper.insertFloor(mapModel, point);
059        final TestGameObject ob2 = mapModelHelper.insertExit(ob1);
060
061        final TestGameObject ob1Clone = mapModelCreator.getGameObjectFactory().cloneGameObject(ob1);
062
063        Assert.assertNotSame(ob1, ob1Clone);
064        Assert.assertEquals(1, ob1Clone.countInvObjects());
065        final TestGameObject ob2Clone = ob1Clone.getFirst();
066        Assert.assertNotNull(ob2Clone);
067        Assert.assertNotSame(ob2, ob2Clone);
068
069        Assert.assertSame(ob1, ob2.getContainer());
070        Assert.assertSame(ob1Clone, ob2Clone.getContainer());
071    }
072
073    /**
074     * Checks that face information is updated for inventory objects cloned from
075     * an archetype.
076     * @throws CannotInsertGameObjectException if the test fails
077     * @throws DuplicateArchetypeException if the test fails
078     */
079    @Test
080    public void testUpdateFaceInformation() throws CannotInsertGameObjectException, DuplicateArchetypeException {
081        final TestMapModelCreator mapModelCreator = new TestMapModelCreator(false);
082        final TestMapModelHelper mapModelHelper = mapModelCreator.newTestMapModelHelper();
083        final MapModel<TestGameObject, TestMapArchObject, TestArchetype> mapModel = mapModelCreator.newMapModel(1, 1);
084
085        final GameObjectFactory<TestGameObject, TestMapArchObject, TestArchetype> gameObjectFactory = mapModelCreator.getGameObjectFactory();
086        final ArchetypeSet<TestGameObject, TestMapArchObject, TestArchetype> archetypeSet = mapModelCreator.getArchetypeSet();
087
088        final TestArchetype invArchetype = gameObjectFactory.newArchetype("inv");
089        invArchetype.setAttributeString(BaseObject.FACE, "face");
090        archetypeSet.addArchetype(invArchetype);
091
092        final TestArchetype envArchetype = gameObjectFactory.newArchetype("env");
093        envArchetype.setAttributeString(BaseObject.FACE, "face");
094        envArchetype.addLast(gameObjectFactory.createGameObject(invArchetype));
095        archetypeSet.addArchetype(envArchetype);
096
097        final FaceProvider faceProvider = new FaceProvider() {
098
099            @Override
100            public ImageIcon getImageIconForFacename(@NotNull final String faceName) {
101                if (faceName.equals("face")) {
102                    return new ImageIcon();
103                }
104                return null;
105            }
106
107            @Override
108            public void reload() {
109                // do nothing
110            }
111
112        };
113        mapModelCreator.getFaceObjectProviders().setNormal(faceProvider);
114
115        final Point point = new Point(0, 0);
116        mapModel.beginTransaction("TEST");
117        final TestGameObject env = mapModelHelper.insertArchetype(mapModel, point, envArchetype, false);
118
119        Assert.assertNotNull(env);
120        Assert.assertEquals(FaceSource.ARCHETYPE_FACE, env.getFaceObjSource());
121
122        final TestGameObject inv = env.getFirst();
123        Assert.assertNotNull(inv);
124        Assert.assertEquals(FaceSource.ARCHETYPE_FACE, inv.getFaceObjSource());
125    }
126
127}