/****************************************************************************
* Copyright (c) 2004 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.tests.core.identity;

import java.io.ByteArrayOutputStream;
import java.io.NotSerializableException;
import java.io.ObjectOutputStream;

import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;

public class LongIDTest extends IDAbstractTestCase {

	/* (non-Javadoc)
	 * @see org.eclipse.ecf.tests.IDTestCase#createID()
	 */
	protected ID createID() throws IDCreateException {
		return createLongID(Long.MAX_VALUE);
	}

	protected ID createLongID(long val) throws IDCreateException {
		return IDFactory.getDefault().createLongID(val);
	}

	public void testCreate() throws Exception {
		final ID newID = createID();
		assertNotNull(newID);
	}

	public void testMinCreate() throws Exception {
		final ID newID = createLongID(Long.MIN_VALUE);
		assertNotNull(newID);
	}

	public void testMAXCreate() throws Exception {
		final ID newID = createLongID(Long.MAX_VALUE);
		assertNotNull(newID);
	}

	public void testZeroCreate() throws Exception {
		final ID id = createLongID(0);
		assertTrue(id.getName().equals(String.valueOf(0)));
	}

	public void testGetName() throws Exception {
		final ID id1 = createID();
		final ID id2 = createID();
		assertTrue(id1.getName().equals(id2.getName()));
	}

	public void testToExternalForm() throws Exception {
		final ID id = createID();
		assertNotNull(id.toExternalForm());
	}

	public void testToString() throws Exception {
		final ID id = createID();
		assertNotNull(id.toString());
	}

	public void testIsEqual() throws Exception {
		final ID id1 = createID();
		final ID id2 = createID();
		assertTrue(id1.equals(id2));
	}

	public void testHashCode() throws Exception {
		final ID id1 = createID();
		final ID id2 = createID();
		assertTrue(id1.hashCode() == id2.hashCode());
	}

	public void testCompareToEqual() throws Exception {
		final ID id1 = createID();
		final ID id2 = createID();
		assertTrue(id1.compareTo(id2) == 0);
		assertTrue(id2.compareTo(id1) == 0);
	}

	public void testCompareToNotEqual() throws Exception {
		final ID id1 = createLongID(0);
		final ID id2 = createLongID(1);
		assertTrue(id1.compareTo(id2) < 0);
		assertTrue(id2.compareTo(id1) > 0);
	}

	public void testGetNamespace() throws Exception {
		final ID id = createID();
		final Namespace ns = id.getNamespace();
		assertNotNull(ns);
	}

	public void testEqualNamespaces() throws Exception {
		final ID id1 = createID();
		final ID id2 = createID();
		final Namespace ns1 = id1.getNamespace();
		final Namespace ns2 = id2.getNamespace();
		assertTrue(ns1.equals(ns2));
		assertTrue(ns2.equals(ns2));
	}

	public void testSerializable() throws Exception {
		final ByteArrayOutputStream buf = new ByteArrayOutputStream();
		final ObjectOutputStream out = new ObjectOutputStream(buf);
		try {
			out.writeObject(createID());
		} catch (final NotSerializableException ex) {
			fail(ex.getLocalizedMessage());
		} finally {
			out.close();
		}
	}

	public void testCreateFromExternalForm() throws Exception {
		final ID id1 = createID();
		final String externalForm = id1.toExternalForm();
		final ID id2 = IDFactory.getDefault().createID(id1.getNamespace(), externalForm);
		assertTrue(id1.equals(id2));
	}
}
