/*******************************************************************************
 * Copyright (c) 2009 Cloudsmith 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:
 *     Cloudsmith Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.equinox.p2.tests.omniVersion;

import org.eclipse.equinox.p2.metadata.Version;

/**
 * Tests versions specified with default OSGi version strings and tests OSGi compatibility
 * for versions specified using raw.
 *
 */
public class OSGiVersionTest extends VersionTesting {

	public void testBasicParsing() {

		// should parse without exception
		assertNotNull(Version.parseVersion("1"));
		assertNotNull(Version.parseVersion("1.0"));
		assertNotNull(Version.parseVersion("1.0.0"));
		assertNotNull(Version.parseVersion("1.0.0.9"));
		assertNotNull(Version.parseVersion("1.0.0.r12345"));
		assertNotNull(Version.parseVersion("1.0.0.r12345_hello"));
	}

	public void testOSGiStrings() {

		Version v = Version.parseVersion(null);
		assertEquals("0.0.0", v.toString());
		assertNotNull(v = Version.parseVersion(""));
		assertEquals("0.0.0", v.toString());
		assertNotNull(v = Version.parseVersion("1"));
		assertEquals("1.0.0", v.toString());
		assertNotNull(v = Version.parseVersion("1.0"));
		assertEquals("1.0.0", v.toString());
		assertNotNull(v = Version.parseVersion("1.0.0"));
		assertEquals("1.0.0", v.toString());
		assertNotNull(v = Version.parseVersion("1.0.0.9"));
		assertEquals("1.0.0.9", v.toString());
		assertNotNull(v = Version.parseVersion("1.0.0.r12345"));
		assertEquals("1.0.0.r12345", v.toString());
		assertNotNull(v = Version.parseVersion("1.0.0.r12345_hello"));
		assertEquals("1.0.0.r12345_hello", v.toString());
	}

	public void testSerialize() {

		Version v = null;
		assertNotNull(v = Version.parseVersion("1"));
		assertSerialized(v);
		assertNotNull(v = Version.parseVersion("1.0"));
		assertSerialized(v);
		assertNotNull(v = Version.parseVersion("1.0.0"));
		assertSerialized(v);
		assertNotNull(v = Version.parseVersion("1.0.0.9"));
		assertSerialized(v);
		assertNotNull(v = Version.parseVersion("1.0.0.r12345"));
		assertSerialized(v);
		assertNotNull(v = Version.parseVersion("1.0.0.r12345_hello"));
		assertSerialized(v);
	}

	public void testNegativeFirstValue() {
		try {
			Version.parseVersion("-1");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testPeriodInQualifier() {
		try {
			Version.parseVersion("1.0.0.sailor.moon");
			fail("Uncaught exception: period is not allowed in osgi qualifier");
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}

	}

	public void testNegativeSecondValue() {
		try {
			Version.parseVersion("1.-1");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testNegativeThirdValue() {
		try {
			Version.parseVersion("1.0.-1");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testEmptyFourthValue() {
		try {
			Version.parseVersion("1.0.0.");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testStringFirstValue() {
		try {
			Version.parseVersion("a");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testStringSecondValue() {
		try {
			Version.parseVersion("1.a");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testStringThirdValue() {
		try {
			Version.parseVersion("1.0.a");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testSinglePeriod() {
		try {
			Version.parseVersion(".");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testTwoPeriods() {
		try {
			Version.parseVersion("..");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}
	}

	public void testThreePeriods() {
		try {
			Version.parseVersion("...");
			fail();
		} catch (IllegalArgumentException e) {
			assertTrue(true);
		}

	}

	public void testEquality() {
		// should parse without exception
		Version v1 = Version.parseVersion("1");
		Version v2 = Version.parseVersion("1.0");
		Version v3 = Version.parseVersion("1.0.0");
		Version v4 = Version.parseVersion("1.0.0.9");
		Version v5 = Version.parseVersion("1.0.0.r12345");

		assertEquals(v1, v2);
		assertEquals(v1, v3);
		assertEquals(v2, v3);
		assertOrder(v3, v4); // i.e. not equal
		assertOrder(v4, v5); // i.e. not equal

	}

	public void testVersionCompare() {
		// should parse without exception
		Version v1 = Version.parseVersion("1");
		Version v2 = Version.parseVersion("1.0.1");
		Version v3 = Version.parseVersion("1.1");
		Version v4 = Version.parseVersion("1.1.1");
		Version v5 = Version.parseVersion("1.1.1.-");
		Version v6 = Version.parseVersion("1.2");
		Version v7 = Version.parseVersion("2");
		Version v8 = Version.parseVersion("10.0");

		assertOrder(v1, v2);
		assertOrder(v2, v3);
		assertOrder(v3, v4);
		assertOrder(v4, v5);
		assertOrder(v5, v6);
		assertOrder(v6, v7);
		assertOrder(v7, v8);

	}

	public void testCompatability() {
		Version v = Version.parseVersion("raw:1.2.3.'foo'");
		assertNotNull(v);
		assertTrue("a raw:1.2.3.'foo' compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2.3"));
		assertTrue("a raw:1.2.3 compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2.3p''"));
		assertFalse("a raw:1.2.3p'' not compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2.3.4"));
		assertFalse("a raw (4th is int) not compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2.3.'foo'.'bar'"));
		assertFalse("a raw (5 elements) not compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2"));
		assertFalse("a raw (only 2 elements) not compatible with OSGi", v.isOSGiCompatible());

		assertNotNull(v = Version.parseVersion("raw:1.2.3.' %@'"));
		assertFalse("a raw (illegal chars in qualifier) not compatible with OSGi", v.isOSGiCompatible());

	}

}
