/* * HomeFileRecorderTest.java 28 aout 2006 * * Copyright (c) 2006 Emmanuel PUYBARET / eTeks <info@eteks.com>. All Rights * Reserved. * * This program 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. * * This program 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 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ package com.eteks.sweethome3d.junit; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import junit.framework.TestCase; import com.eteks.sweethome3d.io.DefaultFurnitureCatalog; import com.eteks.sweethome3d.io.HomeFileRecorder; import com.eteks.sweethome3d.model.Content; import com.eteks.sweethome3d.model.FurnitureCatalog; import com.eteks.sweethome3d.model.Home; import com.eteks.sweethome3d.model.HomePieceOfFurniture; import com.eteks.sweethome3d.model.HomeRecorder; import com.eteks.sweethome3d.model.RecorderException; import com.eteks.sweethome3d.model.Wall; /** * Tests {@link HomeFileRecorder} class. * @author Emmanuel Puybaret */ public class HomeFileRecorderTest extends TestCase { public void testWriteReadHome() throws RecorderException { // 1. Create an empty home Home home1 = new Home(); // Add to home a wall and a piece of furniture Wall wall = new Wall(0, 10, 100, 80, 10, home1.getWallHeight()); home1.addWall(wall); FurnitureCatalog catalog = new DefaultFurnitureCatalog(); HomePieceOfFurniture piece = new HomePieceOfFurniture( catalog.getCategories().get(0).getFurniture().get(0)); home1.addPieceOfFurniture(piece); // 2. Record home in a file named test.sh3d in current directory HomeRecorder recorder = new HomeFileRecorder(); String testFile = new File("test.sh3d").getAbsolutePath(); recorder.writeHome(home1, testFile); // Check test.sh3d file exists assertTrue("File test.sh3d doesn't exist", recorder.exists(testFile)); // 3. Read test.sh3d file in a new home Home home2 = recorder.readHome(testFile); // Compare home content assertNotSame("Home not loaded", home1, home2); assertEquals("Home wall height", home1.getWallHeight(), home2.getWallHeight()); assertEquals("Home walls wrong count", home1.getWalls().size(), home2.getWalls().size()); assertEquals(wall, home2.getWalls().iterator().next()); assertEquals("Home furniture wrong count", home1.getFurniture().size(), home2.getFurniture().size()); assertEquals(piece, home2.getFurniture().get(0)); // Delete file if (!new File(testFile).delete()) { fail("Couldn't delete file " + testFile); } } /** * Asserts <code>wall1</code> and <code>wall2</code> are different walls * containing the same data. */ private void assertEquals(Wall wall1, Wall wall2) { assertNotSame("Wall not loaded", wall1, wall2); assertEquals("Different X start", wall1.getXStart(), wall2.getXStart()); assertEquals("Different Y start", wall1.getYStart(), wall2.getYStart()); assertEquals("Different X end", wall1.getXEnd(), wall2.getXEnd()); assertEquals("Different Y end", wall1.getYEnd(), wall2.getYEnd()); assertEquals("Different thickness", wall1.getThickness(), wall2.getThickness()); if (wall1.getWallAtStart() == null) { assertEquals("Different wall at start", wall2.getWallAtStart(), null); } else { assertFalse("Different wall at start", wall2.getWallAtStart() == null); assertNotSame("Wall at start not loaded", wall1.getWallAtStart(), wall2.getWallAtEnd()); } if (wall1.getWallAtEnd() == null) { assertEquals("Different wall at end", wall2.getWallAtEnd(), null); } else { assertFalse("Different wall at end", wall2.getWallAtEnd() == null); assertNotSame("Wall at end not loaded", wall1.getWallAtStart(), wall2.getWallAtEnd()); } } /** * Asserts <code>piece1</code> and <code>piece2</code> are different pieces * containing the same data. */ private void assertEquals(HomePieceOfFurniture piece1, HomePieceOfFurniture piece2) { assertNotSame("Piece not loaded", piece1, piece2); assertEquals("Different X", piece1.getX(), piece2.getX()); assertEquals("Different Y", piece1.getY(), piece2.getY()); assertEquals("Different color", piece1.getColor(), piece2.getColor()); assertEquals("Different width", piece1.getWidth(), piece2.getWidth()); assertEquals("Different height", piece1.getHeight(), piece2.getHeight()); assertEquals("Different depth", piece1.getDepth(), piece2.getDepth()); assertEquals("Different name", piece1.getName(), piece2.getName()); assertNotSame("Piece icon not loaded", piece1.getIcon(), piece2.getIcon()); assertContentEquals("Different icon content", piece1.getIcon(), piece2.getIcon()); assertNotSame("Piece model not loaded", piece1.getModel(), piece2.getModel()); assertContentEquals("Different model content", piece1.getModel(), piece2.getModel()); } /** * Asserts <code>content1</code> and <code>content2</code> are equals. */ private void assertContentEquals(String message, Content content1, Content content2) { InputStream stream1 = null; InputStream stream2 = null; try { stream1 = new BufferedInputStream(content1.openStream()); stream2 = new BufferedInputStream(content2.openStream()); for (int b; (b = stream1.read()) != -1; ) { assertEquals(message, b, stream2.read()); } assertEquals(message, -1, stream2.read()); } catch (IOException ex) { fail("Can't access to content"); } finally { try { stream1.close(); stream2.close(); } catch (IOException ex) { fail("Can't close content stream"); } } } }