// Path: game-common/src/main/java/com/game/common/model/Entity.java
// public abstract class Entity extends Observable {
// 
// 	public abstract Hash getID();
// 	public abstract Point getLocation();
// 	public abstract void setLocation(Point p);
// 
// }
// 
// Path: game-common/src/main/java/com/game/common/model/Hash.java
// public class Hash implements Comparable<Hash>, Serializable {
// 	private static final Logger log = LoggerFactory.getLogger(Hash.class);
// 	private static final long serialVersionUID = 1L;
// 
// 	public static final int LENGTH = 20; // in bytes
// 	public static final String ALGORITHM = "SHA-1";
// 
// 	protected static MessageDigest digest;
// 
// 	static {
// 		try {
// 			digest = MessageDigest.getInstance(ALGORITHM);
// 		}
// 		catch (NoSuchAlgorithmException e) {
// 			log.error("No such hashing algorithm: " + ALGORITHM);
// 			System.exit(1); // fatal error
// 		}
// 	}
// 
// 	public static Hash fromString(String hex) {
// 		Hash hash = new Hash();
// 		hash.setHex(hex);
// 
// 		return hash;
// 	}
// 
// 	public static Hash fromBytes(byte[] bytes) {
// 		Hash hash = new Hash();
// 		hash.setBytes(bytes);
// 
// 		return hash;
// 	}
// 
// 	protected String hex;
// 
// 	public Hash(String str) {
// 		try {
// 			digest.update(str.getBytes("UTF-8"));
// 		}
// 		catch (UnsupportedEncodingException e) { }
// 
// 		this.setBytes(digest.digest());
// 	}
// 
// 	private Hash() {
// 		hex = null;
// 	}
// 
// 	private void setHex(String hex) {
// 		this.hex = hex;
// 	}
// 
// 	private void setBytes(byte[] bytes) {
// 		Formatter foramtter = new Formatter();
// 
// 		for (byte b : bytes)
// 			foramtter.format("%02x", b);
// 
// 		this.hex = foramtter.toString();
// 	}
// 
// 	public byte[] getBytes() {
// 		byte[] bytes = new byte[LENGTH];
// 
// 		for (int i = 0;i < LENGTH;i++)
// 			bytes[i] = (byte) Short.parseShort(hex.substring(2 * i, 2 * (i + 1)), 16);
// 
// 		return bytes;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return hex;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return hex.hashCode();
// 	}
// 
// 	@Override
// 	public boolean equals(Object o) {
// 		if (!(o instanceof Hash))
// 			return false;
// 
// 		Hash h = (Hash) o;
// 		return hex.equals(h.hex);
// 	}
// 
// 	@Override
// 	public int compareTo(Hash h) {
// 		return hex.compareTo(h.hex);
// 	}
// }
// 
// Path: game-common/src/main/java/com/game/common/model/Point.java
// public class Point implements Serializable {
// 	private static final long serialVersionUID = 1L;
// 
// 	public static final Point ZERO = new Point(0, 0);
// 
// 	public int x;
// 	public int y;
// 
// 	@SuppressWarnings("unused")
// 	private Point() { } // For hibernate
// 
// 	public Point(int x, int y) {
// 		this.x = x;
// 		this.y = y;
// 	}
// 
// 	public void set(Point location) {
// 		this.x = location.x;
// 		this.y = location.y;
// 	}
// 
// 	public double distanceTo(Point p) {
// 		// Euclidean distance
// 		return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return x << 16 | y;
// 	}
// 
// 	@Override
// 	public boolean equals(Object o) {
// 		if (!(o instanceof Point))
// 			return false;
// 
// 		Point p = (Point) o;
// 		return x == p.x && y == p.y;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "(" + x + ", " + y + ")";
// 	}
// }


import junit.framework.TestCase;
import com.game.common.model.Entity;
import com.game.common.model.Hash;
import com.game.common.model.Point;
		list.add(te1);

		// We've added one entity so the size should be 1
		assertEquals(list.size(), 1);

		list.remove(te1.getID());

		// Now it's removed again the size should be back to 0
		assertEquals(list.size(), 0);
	}

	public void testGet() {
		EntityList<TestEntity> list = new EntityList<TestEntity>();
		TestEntity te1 = new TestEntity("hello");

		list.add(te1);

		// get() on a key which doesn't exist should return null
		assertNull(list.get(new Hash("good bye")));

		//get() on the key for te1 should find te1
		assertTrue(te1.equals(list.get(te1.getID())));
	}

	public void testRemove() {
		EntityList<TestEntity> list = new EntityList<TestEntity>();
		TestEntity te1 = new TestEntity("hello");
		TestEntity te2 = new TestEntity("good bye");

		// Add 2 entities
// Path: game-common/src/main/java/com/game/common/model/Entity.java
// public abstract class Entity extends Observable {
// 
// 	public abstract Hash getID();
// 	public abstract Point getLocation();
// 	public abstract void setLocation(Point p);
// 
// }
// 
// Path: game-common/src/main/java/com/game/common/model/Hash.java
// public class Hash implements Comparable<Hash>, Serializable {
// 	private static final Logger log = LoggerFactory.getLogger(Hash.class);
// 	private static final long serialVersionUID = 1L;
// 
// 	public static final int LENGTH = 20; // in bytes
// 	public static final String ALGORITHM = "SHA-1";
// 
// 	protected static MessageDigest digest;
// 
// 	static {
// 		try {
// 			digest = MessageDigest.getInstance(ALGORITHM);
// 		}
// 		catch (NoSuchAlgorithmException e) {
// 			log.error("No such hashing algorithm: " + ALGORITHM);
// 			System.exit(1); // fatal error
// 		}
// 	}
// 
// 	public static Hash fromString(String hex) {
// 		Hash hash = new Hash();
// 		hash.setHex(hex);
// 
// 		return hash;
// 	}
// 
// 	public static Hash fromBytes(byte[] bytes) {
// 		Hash hash = new Hash();
// 		hash.setBytes(bytes);
// 
// 		return hash;
// 	}
// 
// 	protected String hex;
// 
// 	public Hash(String str) {
// 		try {
// 			digest.update(str.getBytes("UTF-8"));
// 		}
// 		catch (UnsupportedEncodingException e) { }
// 
// 		this.setBytes(digest.digest());
// 	}
// 
// 	private Hash() {
// 		hex = null;
// 	}
// 
// 	private void setHex(String hex) {
// 		this.hex = hex;
// 	}
// 
// 	private void setBytes(byte[] bytes) {
// 		Formatter foramtter = new Formatter();
// 
// 		for (byte b : bytes)
// 			foramtter.format("%02x", b);
// 
// 		this.hex = foramtter.toString();
// 	}
// 
// 	public byte[] getBytes() {
// 		byte[] bytes = new byte[LENGTH];
// 
// 		for (int i = 0;i < LENGTH;i++)
// 			bytes[i] = (byte) Short.parseShort(hex.substring(2 * i, 2 * (i + 1)), 16);
// 
// 		return bytes;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return hex;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return hex.hashCode();
// 	}
// 
// 	@Override
// 	public boolean equals(Object o) {
// 		if (!(o instanceof Hash))
// 			return false;
// 
// 		Hash h = (Hash) o;
// 		return hex.equals(h.hex);
// 	}
// 
// 	@Override
// 	public int compareTo(Hash h) {
// 		return hex.compareTo(h.hex);
// 	}
// }
// 
// Path: game-common/src/main/java/com/game/common/model/Point.java
// public class Point implements Serializable {
// 	private static final long serialVersionUID = 1L;
// 
// 	public static final Point ZERO = new Point(0, 0);
// 
// 	public int x;
// 	public int y;
// 
// 	@SuppressWarnings("unused")
// 	private Point() { } // For hibernate
// 
// 	public Point(int x, int y) {
// 		this.x = x;
// 		this.y = y;
// 	}
// 
// 	public void set(Point location) {
// 		this.x = location.x;
// 		this.y = location.y;
// 	}
// 
// 	public double distanceTo(Point p) {
// 		// Euclidean distance
// 		return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return x << 16 | y;
// 	}
// 
// 	@Override
// 	public boolean equals(Object o) {
// 		if (!(o instanceof Point))
// 			return false;
// 
// 		Point p = (Point) o;
// 		return x == p.x && y == p.y;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "(" + x + ", " + y + ")";
// 	}
// }


// Path: game-common/src/test/java/com/game/common/util/EntityListTest.java
import junit.framework.TestCase;
import com.game.common.model.Entity;
import com.game.common.model.Hash;
import com.game.common.model.Point;

		list.add(te1);

		// We've added one entity so the size should be 1
		assertEquals(list.size(), 1);

		list.remove(te1.getID());

		// Now it's removed again the size should be back to 0
		assertEquals(list.size(), 0);
	}

	public void testGet() {
		EntityList<TestEntity> list = new EntityList<TestEntity>();
		TestEntity te1 = new TestEntity("hello");

		list.add(te1);

		// get() on a key which doesn't exist should return null
		assertNull(list.get(new Hash("good bye")));

		//get() on the key for te1 should find te1
		assertTrue(te1.equals(list.get(te1.getID())));
	}

	public void testRemove() {
		EntityList<TestEntity> list = new EntityList<TestEntity>();
		TestEntity te1 = new TestEntity("hello");
		TestEntity te2 = new TestEntity("good bye");

		// Add 2 entities
		list.add(te1);