var VersionTest = TestCase.create("VersionTest");

VersionTest.prototype.testBasicVersion = function() {
	var version = new orion.Version(1, 0, 0);
	assertEquals(1, version.getMajor());
	assertEquals(0, version.getMinor());
	assertEquals(0, version.getMicro());
	assertEquals("", version.getQualifier());
	assertEquals("1.0.0", version.toString());
};
VersionTest.prototype.testQualifiedBasicVersion = function() {
	var version = new orion.Version(1, 0, 0, "qualifier");
	assertEquals(1, version.getMajor());
	assertEquals(0, version.getMinor());
	assertEquals(0, version.getMicro());
	assertEquals("qualifier", version.getQualifier());
	assertEquals("1.0.0.qualifier", version.toString());
};
VersionTest.prototype.testEmptyVersion = function() {
	var version = new orion.Version(0, 0, 0);
	assertEquals(orion.Version.EMPTY_VERSION, version);
	assertEquals("0.0.0", version.toString());
};
VersionTest.prototype.testMaxVersion = function() {
	var version = new orion.Version(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, "extra");
	assertEquals(orion.Version.MAX_VERSION, version);
};

VersionTest.prototype.testParseEmptyVersion = function() {
	var version = orion.Version.parseVersion("");
	assertEquals(orion.Version.EMPTY_VERSION, version);
};
VersionTest.prototype.testParseBasicVersion = function() {
	var version = orion.Version.parseVersion("1.0.0");
	assertEquals(1, version.getMajor());
	assertEquals(0, version.getMinor());
	assertEquals(0, version.getMicro());
	assertEquals("", version.getQualifier());
	assertEquals("1.0.0", version.toString());
};
VersionTest.prototype.testParseQualifiedBasicVersion = function() {
	var version = orion.Version.parseVersion("1.0.0.qualifier");
	assertEquals(1, version.getMajor());
	assertEquals(0, version.getMinor());
	assertEquals(0, version.getMicro());
	assertEquals("qualifier", version.getQualifier());
	assertEquals("1.0.0.qualifier", version.toString());
};
VersionTest.prototype.testCompareVersion = function() {
	var version = orion.Version.parseVersion("1.0.0");
	assertTrue(0 === version.compareTo(version));
	assertTrue(0 < version.compareTo(orion.Version.EMPTY_VERSION));
	assertTrue(0 > orion.Version.EMPTY_VERSION.compareTo(version));
};
VersionTest.prototype.testBadMajor = function() {
	try {
		var version = new orion.Version("x", 0, 0);
	} catch (e) {
		return;
	}
	fail();
};
VersionTest.prototype.testBadMinor = function() {
	try {
		var version = new orion.Version(0, "x", 0);
	} catch (e) {
		return;
	}
	fail();
};
VersionTest.prototype.testBadMicro = function() {
	try {
		var version = new orion.Version(0, 0, "x");
	} catch (e) {
		return;
	}
	fail();
}
VersionTest.prototype.testBadQualifier = function() {
	try {
		var version = new orion.Version(0, 0, 0, 7);
	} catch (e) {
		return;
	}
	fail();
};
