/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.util;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;
import javax.measure.quantity.Length;
import org.junit.*;
import static org.junit.Assert.*;
/**
* Tests the {@link MeasurementRange}.
*
* @since 2.4
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux
*/
public final class MeasurementRangeTest {
/**
* Tests unit conversions.
*/
@Test
public void testConversion() {
final MeasurementRange<Float> range = MeasurementRange.create(1000f, 2000f, SI.METER);
assertSame(range, range.convertTo(SI.METER));
final Unit<Length> KILOMETER = SI.KILO(SI.METER);
assertEquals(MeasurementRange.create(1f, 2f, KILOMETER), range.convertTo(KILOMETER));
}
/**
* Tests the bounds values of a range of integers.
*/
@Test
public void testIntegerBounds() {
final NumberRange<Integer> range = NumberRange.create(10, 20);
assertEquals(10, range.getMinimum( ), 0);
assertEquals(10, range.getMinimum(true ), 0);
assertEquals( 9, range.getMinimum(false), 0);
assertEquals(20, range.getMaximum( ), 0);
assertEquals(20, range.getMaximum(true ), 0);
assertEquals(21, range.getMaximum(false), 0);
}
/**
* Tests union and intersection without units and type change.
*/
@Test
public void testIntegerIntersect() {
NumberRange<Integer> r1 = NumberRange.create(10, 20);
NumberRange<Integer> r2 = NumberRange.create(15, 30);
assertTrue (r1.equals(r1));
assertTrue (r2.equals(r2));
assertFalse(r1.equals(r2));
assertEquals(Integer.class, r1.getElementClass());
assertEquals(Integer.class, r2.getElementClass());
assertEquals(NumberRange.create(10, 30), r1.union(r2));
assertEquals(NumberRange.create(15, 20), r1.intersect(r2));
}
/**
* Tests union and intersection with type change.
*/
@Test
public void testDoubleIntersect() {
NumberRange<Double> r1 = NumberRange.create(10.0, 20.0);
NumberRange<Double> r2 = NumberRange.create(15.0, 30.0);
assertEquals(Double.class, r1.getElementClass());
assertEquals(Double.class, r2.getElementClass());
assertEquals(NumberRange.create(10.0, 30.0), r1.union(r2));
assertEquals(NumberRange.create(15.0, 20.0), r1.intersect(r2));
}
/**
* Tests union and intersection with type change.
*/
@Test
public void testIntegerDoubleIntersect() {
NumberRange<Integer> r1 = NumberRange.create(10, 20);
NumberRange<Double> r2 = NumberRange.create(15.0, 30.0);
assertEquals(Integer.class, r1.getElementClass());
assertEquals(Double .class, r2.getElementClass());
assertEquals(NumberRange.create(10.0, 30.0), r1.union(r2));
assertEquals(NumberRange.create(15, 20), r1.intersect(r2));
r2 = NumberRange.create(15.5, 30.0);
assertEquals(NumberRange.create(15.5f, 20.0f), r1.intersect(r2));
}
/**
* Tests union and intersection with type change.
*/
@Test
public void testDoubleIntegerIntersect() {
NumberRange<Double> r1 = NumberRange.create(10.0, 20.0);
NumberRange<Integer> r2 = NumberRange.create(15, 30);
assertEquals(Double .class, r1.getElementClass());
assertEquals(Integer.class, r2.getElementClass());
assertEquals(NumberRange.create(10.0, 30.0), r1.union(r2));
assertEquals(NumberRange.create(15, 20), r1.intersect(r2));
r1 = NumberRange.create(10.0, 20.5);
assertEquals(NumberRange.create(15.0f, 20.5f), r1.intersect(r2));
}
/**
* Tests union and intersection involving a unit conversion.
*/
@Test
public void testIntersectWithConversion() {
final Unit<Length> KILOMETER = SI.KILO(SI.METER);
NumberRange<Float> r1 = MeasurementRange.create(1000f, 2000f, SI.METER);
NumberRange<Float> r2 = MeasurementRange.create(1.5f, 3f, KILOMETER);
assertEquals(Float.class, r1.getElementClass());
assertEquals(Float.class, r2.getElementClass());
assertEquals(MeasurementRange.create(1000f, 3000f, SI.METER ), r1.union (r2));
assertEquals(MeasurementRange.create(1f, 3f, KILOMETER), r2.union (r1));
assertEquals(MeasurementRange.create(1500f, 2000f, SI.METER ), r1.intersect(r2));
assertEquals(MeasurementRange.create(1.5f, 2f, KILOMETER), r2.intersect(r1));
}
/**
* Tests {@link MeasurementRange#toString()} method.
*/
@Test
public void testToString() {
final MeasurementRange<Float> range = MeasurementRange.create(10f, 20f, SI.KILO(SI.METER));
assertEquals("[10.0, 20.0] km", range.toString());
}
}