/*******************************************************************************
 * Copyright (c) 2005, 2007 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.utility.tests.internal;

import junit.framework.TestCase;
import org.eclipse.jpt.utility.internal.Range;

public class RangeTests extends TestCase {

	public RangeTests(String name) {
		super(name);
	}

	public void testIncludes() {
		Range range = new Range(5, 17);
		assertFalse(range.includes(-55));
		assertFalse(range.includes(0));
		assertFalse(range.includes(4));
		assertTrue(range.includes(5));
		assertTrue(range.includes(6));
		assertTrue(range.includes(16));
		assertTrue(range.includes(17));
		assertFalse(range.includes(18));
		assertFalse(range.includes(200));
	}

	public void testEquals() {
		Range range1 = new Range(5, 17);
		Range range2 = new Range(5, 17);
		assertNotSame(range1, range2);
		assertEquals(range1, range1);
		assertEquals(range1, range2);
		assertEquals(range2, range1);
		assertEquals(range1.hashCode(), range2.hashCode());

		range2 = new Range(17, 5);
		assertFalse(range1.equals(range2));
		assertFalse(range2.equals(range1));
		// although they are unequal, they can have the same hash code
		assertEquals(range1.hashCode(), range2.hashCode());

		range2 = new Range(5, 15);
		assertFalse(range1.equals(range2));
		assertFalse(range2.equals(range1));
	}

	public void testClone() {
		Range range1 = new Range(5, 17);
		Range range2 = range1.clone();
		assertNotSame(range1, range2);
		assertEquals(range1, range1);
		assertEquals(range1, range2);
		assertEquals(range2, range1);
		assertEquals(range1.hashCode(), range2.hashCode());
	}

	public void testSerialization() throws Exception {
		Range range1 = new Range(5, 17);
		Range range2 = TestTools.serialize(range1);
		assertNotSame(range1, range2);
		assertEquals(range1, range1);
		assertEquals(range1, range2);
		assertEquals(range2, range1);
		assertEquals(range1.hashCode(), range2.hashCode());
	}

}
