package org.jivesoftware.util;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;

import org.jivesoftware.util.Version.ReleaseStatus;
import org.junit.Test;

public class VersionTest {

	@Test
	public void testVersionWithInitializingConstructor() {
		Version test = new Version(3, 2, 1, ReleaseStatus.Beta, 4);
		
		assertEquals(3, test.getMajor());
		assertEquals(2, test.getMinor());
		assertEquals(1, test.getMicro());
		
		assertEquals(ReleaseStatus.Beta, test.getStatus());
		assertEquals(4, test.getStatusVersion());
		
		assertEquals("3.2.1 Beta 4", test.getVersionString());
	}

	@Test
	public void testVersionWithRegularStringConstructor() {
		Version test = new Version("1.2.3");
		
		assertEquals(1, test.getMajor());
		assertEquals(2, test.getMinor());
		assertEquals(3, test.getMicro());
		
		assertEquals(ReleaseStatus.Release, test.getStatus());
		assertEquals(-1, test.getStatusVersion());
		
		assertEquals("1.2.3", test.getVersionString());
	}

	@Test
	public void testVersionWithNullStringConstructor() {
		Version test = new Version(null);
		
		assertEquals(0, test.getMajor());
		assertEquals(0, test.getMinor());
		assertEquals(0, test.getMicro());
		
		assertEquals(ReleaseStatus.Release, test.getStatus());
		assertEquals(-1, test.getStatusVersion());
		
		assertEquals("0.0.0", test.getVersionString());
	}

	@Test
	public void testVersionComparisons() {
		
		Version test123 = new Version("1.2.3");
		Version test321 = new Version("3.2.1");
		Version test322 = new Version("3.2.2");
		Version test333 = new Version("3.3.3");
		Version test300 = new Version("3.0.0");
		Version test3100 = new Version("3.10.0");
		Version test29999 = new Version("2.99.99");
		
		assertEquals(-1, test123.compareTo(test321));
		assertEquals(0, test123.compareTo(test123));
		assertEquals(1, test321.compareTo(test123));
		
		assertTrue(test322.isNewerThan(test321));
		assertFalse(test322.isNewerThan(test333));
		assertFalse(test300.isNewerThan(test321));
		assertTrue(test3100.isNewerThan(test333));
		assertTrue(test3100.isNewerThan(test29999));
		assertTrue(test300.isNewerThan(test29999));
		
	}

}