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

VersionRangeTest.prototype.testBasicVersionRange = function() {
	var versionRange = new orion.VersionRange(orion.Version.EMPTY_VERSION, true, orion.Version.MAX_VERSION, true);
	assertEquals(orion.Version.EMPTY_VERSION, versionRange.getMinimum());
	assertTrue(versionRange.getIncludeMinimum());
	assertEquals(orion.Version.MAX_VERSION, versionRange.getMaximum());
	assertTrue(versionRange.getIncludeMaximum());
};

VersionRangeTest.prototype.testEmptyVersionRange = function() {
	var versionRange = new orion.VersionRange(null, true, null, true);
	assertEquals(orion.VersionRange.EMPTY_RANGE, versionRange);
};

VersionRangeTest.prototype.testParseBasicVersionRange = function() {
	var versionRange = orion.VersionRange.parseVersionRange("0.0.0");
	assertEquals(orion.Version.EMPTY_VERSION, versionRange.getMinimum());
	assertTrue(versionRange.getIncludeMinimum());
	assertEquals(orion.Version.MAX_VERSION, versionRange.getMaximum());
	assertTrue(versionRange.getIncludeMaximum());
};

VersionRangeTest.prototype.testIncludeMinMax = function() {
	var versionRange1 = new orion.VersionRange(null, true, null, false);
	assertTrue(versionRange1.getIncludeMinimum());
	assertFalse(versionRange1.getIncludeMaximum());
	
	var versionRange2 = new orion.VersionRange(null, false, null, true);
	assertFalse(versionRange2.getIncludeMinimum());
	assertTrue(versionRange2.getIncludeMaximum());
};

VersionRangeTest.prototype.testIsIncluded = function() {
	var versionRange1 = new orion.VersionRange(null, true, null, false);
	assertTrue(versionRange1.isIncluded(orion.Version.EMPTY_VERSION));
	assertFalse(versionRange1.isIncluded(orion.Version.MAX_VERSION));
	
	var versionRange2 = new orion.VersionRange(null, false, null, true);
	assertFalse(versionRange2.isIncluded(orion.Version.EMPTY_VERSION));
	assertTrue(versionRange2.isIncluded(orion.Version.MAX_VERSION));
};

VersionRangeTest.prototype.testToString = function() {
	var versionRange1 = new orion.VersionRange(new orion.Version(1,0,0), true, null, true);
	assertEquals("1.0.0", versionRange1.toString());

	var versionRange2 = new orion.VersionRange(new orion.Version(1,0,0), true, null, false);
	assertEquals("[1.0.0," + orion.Version.MAX_VERSION.toString() + ")", versionRange2.toString());
	
	var versionRange2 = new orion.VersionRange(new orion.Version(1,0,0), false, null, true);
	assertEquals("(1.0.0," + orion.Version.MAX_VERSION.toString() + "]", versionRange2.toString());
};
