Author: scolebourne
Date: Wed May 25 15:43:35 2011
New Revision: 1127565

URL: http://svn.apache.org/viewvc?rev=1127565&view=rev
Log:
Refactor Range with lots of new methods

Modified:
    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java
    
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RangeTest.java

Modified: 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java?rev=1127565&r1=1127564&r2=1127565&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java 
(original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/Range.java 
Wed May 25 15:43:35 2011
@@ -18,21 +18,23 @@ package org.apache.commons.lang3;
 
 import java.io.Serializable;
 import java.util.Comparator;
+import java.util.Formattable;
 
 /**
- * <p>{@code Range} represents an immutable range of comparables of the same 
type.</p>
- * <p>The objects need to either be implementations of {@code 
java.lang.Comparable}
- * or you need to supply a {@code java.util.Comparator}. </p>
+ * <p>An immutable range of objects from a minimum to maximum point 
inclusive.</p>
+ * 
+ * <p>The objects need to either be implementations of {@code Comparable}
+ * or you need to supply a {@code Comparator}. </p>
  *
- * <p>#ThreadSafe# if the comparables are thread-safe</p>
+ * <p>#ThreadSafe# if the objects and comparator are thread-safe</p>
+ * 
  * @since 3.0
  * @version $Id$
  */
 public final class Range<T> implements Serializable {
 
     /**
-     * Required for serialization support.
-     *
+     * Serialization version.
      * @see java.io.Serializable
      */
     private static final long serialVersionUID = 1L;
@@ -41,124 +43,123 @@ public final class Range<T> implements S
      * The ordering scheme used in this range.
      */
     private final Comparator<T> comparator;
-
     /**
      * The minimum value in this range (inclusive).
      */
     private final T minimum;
-
     /**
      * The maximum value in this range (inclusive).
      */
     private final T maximum;
-
     /**
      * Cached output hashCode (class is immutable).
      */
-    private transient int hashCode = 0;
-
+    private transient int hashCode;
     /**
      * Cached output toString (class is immutable).
      */
-    private transient String toString = null;
+    private transient String toString;
 
     /**
-     * <p>Constructs a new {@code Range} using the specified
-     * element as both the minimum and maximum in this range.</p>
-     * <p>The range uses the natural ordering of the elements to
-     * determine where values lie in the range.</p>
-     *
-     * @param <T> the type of this {@code Range}
-     * @param element  the value to use for this range, must not be {@code 
null}
-     * @return the new range object
-     * @throws IllegalArgumentException if the value is {@code null}
-     * @throws ClassCastException if the value is not Comparable
+     * <p>Obtains a range using the specified element as both the minimum
+     * and maximum in this range.</p>
+     * 
+     * <p>The range uses the natural ordering of the elements to determine 
where
+     * values lie in the range.</p>
+     *
+     * @param <T> the type of the elements in this range
+     * @param element  the value to use for this range, not null
+     * @return the range object, not null
+     * @throws IllegalArgumentException if the element is null
+     * @throws ClassCastException if the element is not {@code Comparable}
      */
     public static <T extends Comparable<T>> Range<T> is(T element) {
-        return new Range<T>(element, element, 
ComparableComparator.<T>getInstance());
+        return between(element, element, null);
     }
 
     /**
-     * <p>Constructs a new {@code Range} with the specified
-     * minimum and maximum values (both inclusive).</p>
-     * <p>The range uses the natural ordering of the elements to
-     * determine where values lie in the range.</p>
+     * <p>Obtains a range using the specified element as both the minimum
+     * and maximum in this range.</p>
+     * 
+     * <p>The range uses the specified {@code Comparator} to determine where
+     * values lie in the range.</p>
      *
-     * <p>The arguments may be passed in the order (min,max) or (max,min). The
-     * getMinimum and getMaximum methods will return the correct values.</p>
-     *
-     * @param <T> the type of this {@code Range}
-     * @param element1  first value that defines the edge of the range, 
inclusive
-     * @param element2  second value that defines the edge of the range, 
inclusive
-     * @return the new range object
-     * @throws IllegalArgumentException if either value is {@code null}
-     * @throws ClassCastException if either value is not Comparable
+     * @param <T> the type of the elements in this range
+     * @param element  the value to use for this range, must not be {@code 
null}
+     * @param comparator  the comparator to be used, null for natural ordering
+     * @return the range object, not null
+     * @throws IllegalArgumentException if the element is null
+     * @throws ClassCastException if using natural ordering and the elements 
are not {@code Comparable}
      */
-    public static <T extends Comparable<T>> Range<T> between(T element1, T 
element2) {
-        return new Range<T>( element1, element2, 
ComparableComparator.<T>getInstance());
+    public static <T> Range<T> is(T element, Comparator<T> comparator) {
+        return between(element, element, comparator);
     }
 
     /**
-     * <p>Constructs a new {@code Range} using the specified
-     * element as both the minimum and maximum in this range.</p>
-     * <p>The range uses the passed in {@code Comparator} to
-     * determine where values lie in the range.</p>
+     * <p>Obtains a range with the specified minimum and maximum values (both 
inclusive).</p>
+     * 
+     * <p>The range uses the natural ordering of the elements to determine 
where
+     * values lie in the range.</p>
      *
-     * @param <T> the type of this {@code Range}
-     * @param element  the value to use for this range, must not be {@code 
null}
-     * @param c comparator to be used
-     * @return the new range object
-     * @throws IllegalArgumentException if the value is {@code null}
+     * <p>The arguments may be passed in the order (min,max) or (max,min).
+     * The getMinimum and getMaximum methods will return the correct 
values.</p>
+     *
+     * @param <T> the type of the elements in this range
+     * @param fromInclusive  the first value that defines the edge of the 
range, inclusive
+     * @param toInclusive  the second value that defines the edge of the 
range, inclusive
+     * @return the range object, not null
+     * @throws IllegalArgumentException if either element is null
+     * @throws ClassCastException if the elements are not {@code Comparable}
      */
-    public static <T> Range<T> is(T element, Comparator<T> c) {
-        return new Range<T>(element, element, c);
+    public static <T extends Comparable<T>> Range<T> between(T fromInclusive, 
T toInclusive) {
+        return between(fromInclusive, toInclusive, null);
     }
 
     /**
-     * <p>Constructs a new {@code Range} with the specified
-     * minimum and maximum values (both inclusive).</p>
-     * <p>The range uses the passed in {@code Comparator} to
-     * determine where values lie in the range.</p>
+     * <p>Obtains a range with the specified minimum and maximum values (both 
inclusive).</p>
+     * 
+     * <p>The range uses the specified {@code Comparator} to determine where
+     * values lie in the range.</p>
      *
-     * <p>The arguments may be passed in the order (min,max) or (max,min). The
-     * getMinimum and getMaximum methods will return the correct values.</p>
+     * <p>The arguments may be passed in the order (min,max) or (max,min).
+     * The getMinimum and getMaximum methods will return the correct 
values.</p>
      *
-     * @param <T> the type of this {@code Range}
-     * @param element1  first value that defines the edge of the range, 
inclusive
-     * @param element2  second value that defines the edge of the range, 
inclusive
-     * @param c comparator to be used
-     * @return the new range object
-     * @throws IllegalArgumentException if either value is {@code null}
+     * @param <T> the type of the elements in this range
+     * @param fromInclusive  the first value that defines the edge of the 
range, inclusive
+     * @param toInclusive  the second value that defines the edge of the 
range, inclusive
+     * @param comparator  the comparator to be used, null for natural ordering
+     * @return the range object, not null
+     * @throws IllegalArgumentException if either element is null
+     * @throws ClassCastException if using natural ordering and the elements 
are not {@code Comparable}
      */
-    public static <T> Range<T> between(T element1, T element2, Comparator<T> 
c) {
-        return new Range<T>(element1, element2, c);
+    public static <T> Range<T> between(T fromInclusive, T toInclusive, 
Comparator<T> comparator) {
+        return new Range<T>(fromInclusive, toInclusive, comparator);
     }
 
     /**
-     * Creates a new instance of {@code Range}.
+     * Creates an instance.
      *
-     * @param element1 the first element
-     * @param element2 the second element
-     * @param c the comparator to be used
+     * @param element1  the first element, not null
+     * @param element2  the second element, not null
+     * @param comparator  the comparator to be used, null for natural ordering
      */
-    private Range(T element1, T element2, Comparator<T> c) {
-        if(element1 == null || element2 == null) {
+    @SuppressWarnings("unchecked")
+    private Range(T element1, T element2, Comparator<T> comparator) {
+        if (element1 == null || element2 == null) {
             throw new IllegalArgumentException("Elements in a range must not 
be null: element1=" +
                                                element1 + ", element2=" + 
element2);
         }
-
-        if(c == null) {
-            throw new IllegalArgumentException("Comparator must not be null");
+        if (comparator == null) {
+            comparator = ComparableComparator.INSTANCE;
         }
-
-        if(c.compare(element1, element2) < 1) {
+        if (comparator.compare(element1, element2) < 1) {
             this.minimum = element1;
             this.maximum = element2;
         } else {
             this.minimum = element2;
             this.maximum = element1;
         }
-        this.comparator = c;
+        this.comparator = comparator;
     }
 
     // Accessors
@@ -167,108 +168,131 @@ public final class Range<T> implements S
     /**
      * <p>Gets the minimum value in this range.</p>
      *
-     * @return the minimum value in this range
+     * @return the minimum value in this range, not null
      */
     public T getMinimum() {
-        return this.minimum;
+        return minimum;
     }
 
     /**
      * <p>Gets the maximum value in this range.</p>
      *
-     * @return the maximum value in this range
+     * @return the maximum value in this range, not null
      */
     public T getMaximum() {
-        return this.maximum;
+        return maximum;
     }
 
     /**
-     * <p>Gets the comparator being used to determine if objects are within 
the range. </p>
+     * <p>Gets the comparator being used to determine if objects are within 
the range.</p>
+     * 
+     * <p>Natural ordering uses an internal comparator implementation, thus 
this
+     * method never returns null. See {@link #isNaturalOrdering()}.</p>
      *
-     * @return the comparator being used
+     * @return the comparator being used, not null
      */
     public Comparator<T> getComparator() {
-        return this.comparator;
+        return comparator;
     }
 
     /**
-     * <p>Whether or not the Range is using the default natural comparison 
method
-     * to compare elements. </p>
+     * <p>Whether or not the Range is using the natural ordering of the 
elements.</p>
+     * 
+     * <p>Natural ordering uses an internal comparator implementation, thus 
this
+     * method is the only way to check if a null comparator was specified.</p>
      *
-     * @return whether or not the default Comparator is in use
+     * @return true if using natural ordering
      */
-    public boolean isDefaultNaturalOrdering() {
-        return this.comparator == ComparableComparator.INSTANCE;
+    public boolean isNaturalOrdering() {
+        return comparator == ComparableComparator.INSTANCE;
     }
 
-    // Include tests
+    // Element tests
     //--------------------------------------------------------------------
 
     /**
-     * <p>Tests whether the specified element occurs within this range.</p>
-     *
-     * <p>{@code null} is handled and returns {@code false}.</p>
+     * <p>Checks whether the specified element occurs within this range.</p>
      *
-     * @param element  the element to test, may be {@code null}
-     * @return {@code true} if the specified element occurs within this range
+     * @param element  the element to check for, null returns false
+     * @return true if the specified element occurs within this range
      */
     public boolean contains(T element) {
-        if(element == null) {
+        if (element == null) {
             return false;
         }
-        return (comparator.compare(element, this.minimum) > -1) && 
(comparator.compare(element, this.maximum) < 1);
+        return (comparator.compare(element, minimum) > -1) && 
(comparator.compare(element, maximum) < 1);
     }
 
     /**
-     * <p>Tests whether the specified element occurs before this range.</p>
-     *
-     * <p>{@code null} is handled and returns {@code false}.</p>
+     * <p>Checks whether this range is after the specified element.</p>
      *
-     * @param element  the element to test, may be {@code null}
-     * @return {@code true} if the specified element occurs before this range
+     * @param element  the element to check for, null returns false
+     * @return true if this range is entirely after the specified element
      */
-    public boolean elementBefore(T element) {
+    public boolean isAfter(T element) {
         if (element == null) {
             return false;
         }
-
-        return this.comparator.compare(element, this.minimum) < 0;
+        return comparator.compare(element, minimum) < 0;
     }
 
     /**
-     * <p>Tests whether the specified element occurs after this range.</p>
+     * <p>Checks whether this range starts with the specified element.</p>
      *
-     * <p>{@code null} is handled and returns {@code false}.</p>
+     * @param element  the element to check for, null returns false
+     * @return true if the specified element occurs within this range
+     */
+    public boolean isStartedBy(T element) {
+        if (element == null) {
+            return false;
+        }
+        return comparator.compare(element, minimum) == 0;
+    }
+
+    /**
+     * <p>Checks whether this range starts with the specified element.</p>
      *
-     * @param element  the element to test, may be {@code null}
-     * @return {@code true} if the specified element occurs after this range
+     * @param element  the element to check for, null returns false
+     * @return true if the specified element occurs within this range
      */
-    public boolean elementAfter(T element) {
+    public boolean isEndedBy(T element) {
         if (element == null) {
             return false;
         }
+        return comparator.compare(element, maximum) == 0;
+    }
 
-        return this.comparator.compare(element, this.maximum) > 0;
+    /**
+     * <p>Checks whether this range is before the specified element.</p>
+     *
+     * @param element  the element to check for, null returns false
+     * @return true if this range is entirely before the specified element
+     */
+    public boolean isBefore(T element) {
+        if (element == null) {
+            return false;
+        }
+        return comparator.compare(element, maximum) > 0;
     }
 
     /**
-     * <p>Tests where the specified element occurs relative to this range.</p>
+     * <p>Checks where the specified element occurs relative to this range.</p>
+     * 
      * <p>The API is reminiscent of the Comparable interface returning {@code 
-1} if
      * the element is before the range, {@code 0} if contained within the 
range and
      * {@code 1} if the element is after the range. </p>
      *
-     * @param element  the element to test
+     * @param element  the element to check for, not null
      * @return -1, 0 or +1 depending on the element's location relative to the 
range
      */
     public int elementCompareTo(T element) {
-        if(element == null) {
+        if (element == null) {
             // Comparable API says throw NPE on null
             throw new NullPointerException("Element is null");
         }
-        if(elementBefore(element)) {
+        if (isAfter(element)) {
             return -1;
-        } else
-        if(elementAfter(element)) {
+        } else if (isBefore(element)) {
             return 1;
         } else {
             return 0;
@@ -279,40 +303,73 @@ public final class Range<T> implements S
     //--------------------------------------------------------------------
 
     /**
-     * <p>Tests whether the specified range occurs entirely within this 
range.</p>
+     * <p>Checks whether this range contains all the elements of the specified 
range.</p>
+     *
+     * <p>This method may fail if the ranges have two different comparators or 
element types.</p>
+     *
+     * @param otherRange  the range to check, null returns false
+     * @return true if this range contains the specified range
+     * @throws RuntimeException if ranges cannot be compared
+     */
+    public boolean containsRange(Range<T> otherRange) {
+        if (otherRange == null) {
+            return false;
+        }
+        return contains(otherRange.minimum)
+            && contains(otherRange.maximum);
+    }
+
+    /**
+     * <p>Checks whether this range is completely after the specified 
range.</p>
      *
-     * <p>{@code null} is handled and returns {@code false}.</p>
+     * <p>This method may fail if the ranges have two different comparators or 
element types.</p>
      *
-     * @param range  the range to test, may be {@code null}
-     * @return {@code true} if the specified range occurs entirely within
-     *  this range; otherwise, {@code false}
-     * @throws IllegalArgumentException if the {@code Range} cannot be compared
+     * @param otherRange  the range to check, null returns false
+     * @return true if this range is completely after the specified range
+     * @throws RuntimeException if ranges cannot be compared
      */
-    public boolean containsAll(Range<T> range) {
-        if (range == null) {
+    public boolean isAfterRange(Range<T> otherRange) {
+        if (otherRange == null) {
             return false;
         }
-        return contains(range.getMinimum())
-            && contains(range.getMaximum());
+        return isAfter(otherRange.maximum);
     }
 
     /**
-     * <p>Tests whether the specified range overlaps with this range.</p>
+     * <p>Checks whether this range is overlapped by the specified range.</p>
+     * 
+     * <p>Two ranges overlap if there is at least one element in common.</p>
      *
-     * <p>{@code null} is handled and returns {@code false}.</p>
+     * <p>This method may fail if the ranges have two different comparators or 
element types.</p>
      *
-     * @param range  the range to test, may be {@code null}
-     * @return {@code true} if the specified range overlaps with this
+     * @param otherRange  the range to test, null returns false
+     * @return true if the specified range overlaps with this
      *  range; otherwise, {@code false}
-     * @throws IllegalArgumentException if the {@code Range} cannot be compared
+     * @throws RuntimeException if ranges cannot be compared
      */
-    public boolean overlapsWith(Range<T> range) {
-        if (range == null) {
+    public boolean isOverlappedBy(Range<T> otherRange) {
+        if (otherRange == null) {
             return false;
         }
-        return range.contains(this.minimum)
-            || range.contains(this.maximum)
-            || contains(range.getMinimum());
+        return otherRange.contains(minimum)
+            || otherRange.contains(maximum)
+            || contains(otherRange.minimum);
+    }
+
+    /**
+     * <p>Checks whether this range is completely before the specified 
range.</p>
+     *
+     * <p>This method may fail if the ranges have two different comparators or 
element types.</p>
+     *
+     * @param otherRange  the range to check, null returns false
+     * @return true if this range is completely before the specified range
+     * @throws RuntimeException if ranges cannot be compared
+     */
+    public boolean isBeforeRange(Range<T> otherRange) {
+        if (otherRange == null) {
+            return false;
+        }
+        return isBefore(otherRange.minimum);
     }
 
     // Basics
@@ -321,10 +378,11 @@ public final class Range<T> implements S
     /**
      * <p>Compares this range to another object to test if they are equal.</p>.
      *
-     * <p>To be equal, the class, minimum and maximum must be equal.</p>
+     * <p>To be equal, the minimum and maximum values must be equal, which
+     * ignores any differences in the comparator.</p>
      *
      * @param obj the reference object with which to compare
-     * @return {@code true} if this object is equal
+     * @return true if this object is equal
      */
     @Override
     public boolean equals(Object obj) {
@@ -335,13 +393,13 @@ public final class Range<T> implements S
         } else {
             @SuppressWarnings("unchecked") // OK because we checked the class 
above
             Range<T> range = (Range<T>) obj;
-            return getMinimum().equals(range.getMinimum()) &&
-                   getMaximum().equals(range.getMaximum());
+            return minimum.equals(range.minimum) &&
+                   maximum.equals(range.maximum);
         }
     }
 
     /**
-     * <p>Gets a hashCode for the range.</p>
+     * <p>Gets a suitable hash code for the range.</p>
      *
      * @return a hash code value for this object
      */
@@ -351,8 +409,8 @@ public final class Range<T> implements S
         if (hashCode == 0) {
             result = 17;
             result = 37 * result + getClass().hashCode();
-            result = 37 * result + this.minimum.hashCode();
-            result = 37 * result + this.maximum.hashCode();
+            result = 37 * result + minimum.hashCode();
+            result = 37 * result + maximum.hashCode();
             hashCode = result;
         }
         return result;
@@ -361,7 +419,7 @@ public final class Range<T> implements S
     /**
      * <p>Gets the range as a {@code String}.</p>
      *
-     * <p>The format of the String is 'Range[<i>min</i>,<i>max</i>]'.</p>
+     * <p>The format of the String is '[<i>min</i>..<i>max</i>]'.</p>
      *
      * @return the {@code String} representation of this range
      */
@@ -370,10 +428,10 @@ public final class Range<T> implements S
         String result = toString;
         if (result == null) {
             StringBuilder buf = new StringBuilder(32);
-            buf.append("Range[");
-            buf.append(this.minimum);
-            buf.append(',');
-            buf.append(this.maximum);
+            buf.append('[');
+            buf.append(minimum);
+            buf.append("..");
+            buf.append(maximum);
             buf.append(']');
             result = buf.toString();
             toString = result;
@@ -381,54 +439,29 @@ public final class Range<T> implements S
         return result;
     }
 
-    // Taken from Commons Collections - documentation removed as not a public 
class
-    private static class ComparableComparator<E extends Comparable<? super E>> 
implements Comparator<E>, Serializable {
-
-        private static final long serialVersionUID = 1L;
-
-        @SuppressWarnings("rawtypes") // Comparator works for all types
-        public static final ComparableComparator<?> INSTANCE = new 
ComparableComparator();
-
-        /**
-         * Returns a comparator for the specified {@code Comparable} type.
-         *
-         * @param <E> the {@code Comparable} type
-         * @return the comparator for this type
-         */
-        @SuppressWarnings("unchecked") // OK to cast, because comparator works 
for all types
-        public static <E extends Comparable<? super E>> 
ComparableComparator<E> getInstance() {
-            return (ComparableComparator<E>) INSTANCE;
-        }
-
-        /**
-         * Creates a new instance of {@code ComparableComparator}.
-         */
-        public ComparableComparator() {
-            super();
-        }
-
-        /**
-         * Compares two objects.
-         *
-         * @param obj1 the first object
-         * @param obj2 the second object
-         * @return the result of the comparison
-         */
-        public int compare(E obj1, E obj2) {
-            return obj1.compareTo(obj2);
-        }
-
-        @Override
-        public int hashCode() {
-            return "ComparableComparator".hashCode();
-        }
-
-        @Override
-        public boolean equals(Object object) {
-            return (this == object) ||
-                   ((null != object) && 
(object.getClass().equals(this.getClass())));
+    /**
+     * <p>Formats the receiver using the given format.</p>
+     * 
+     * <p>This uses {@link Formattable} to perform the formatting. Three 
variables may
+     * be used to embed the minimum, maximum and comparator.
+     * Use {@code %1$s} for the minimum element, {@code %2$s} for the maximum 
element
+     * and {@code %3$s} for the comparator.
+     * The default format used by {@code toString()} is {@code 
[%1$s..%2$s]}.</p>
+     * 
+     * @param format  the format string, optionally containing {@code %1$s}, 
{@code %2$s} and  {@code %3$s}, not null
+     * @return the formatted string, not null
+     */
+    public String toString(String format) {
+        return String.format(format, minimum, maximum, comparator);
+    }
+
+    //-----------------------------------------------------------------------
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private enum ComparableComparator implements Comparator {
+        INSTANCE;
+        public int compare(Object obj1, Object obj2) {
+            return ((Comparable) obj1).compareTo(obj2);
         }
-
     }
 
 }

Modified: 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RangeTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RangeTest.java?rev=1127565&r1=1127564&r2=1127565&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RangeTest.java 
(original)
+++ 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/RangeTest.java 
Wed May 25 15:43:35 2011
@@ -53,8 +53,8 @@ public class RangeTest extends TestCase 
         doubleRange = Range.between((double) 10, (double) 20);
     }
 
-    // 
--------------------------------------------------------------------------
-
+    //-----------------------------------------------------------------------
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testComparableConstructors() {
         Comparable c = 
             new Comparable() { 
@@ -62,8 +62,10 @@ public class RangeTest extends TestCase 
                     return 1;
                 }
             };
-        Range.is(c);
-        Range.between(c, c);
+        Range r1 = Range.is(c);
+        Range r2 = Range.between(c, c);
+        assertEquals(true, r1.isNaturalOrdering());
+        assertEquals(true, r2.isNaturalOrdering());
     }
 
     public void testIsWithCompare(){
@@ -103,16 +105,14 @@ public class RangeTest extends TestCase 
         assertTrue("should contain -11",rb.contains(-11));
     }
 
-    // 
--------------------------------------------------------------------------
-
+    //-----------------------------------------------------------------------
     public void testRangeOfChars() {
         Range<Character> chars = Range.between('a', 'z');
         assertTrue(chars.contains('b'));
         assertFalse(chars.contains('B'));
     }
 
-    // 
--------------------------------------------------------------------------
-
+    //-----------------------------------------------------------------------
     public void testEqualsObject() {
         assertEquals(byteRange, byteRange);
         assertEquals(byteRange, byteRange2);
@@ -128,29 +128,32 @@ public class RangeTest extends TestCase 
     public void testHashCode() {
         assertEquals(byteRange.hashCode(), byteRange2.hashCode());
         assertFalse(byteRange.hashCode() == byteRange3.hashCode());
-
+        
         assertEquals(intRange.hashCode(), intRange.hashCode());
         assertTrue(intRange.hashCode() != 0);
     }
 
     public void testToString() {
         assertNotNull(byteRange.toString());
-
+        
         String str = intRange.toString();
-        assertEquals("Range[10,20]", str);
-//        assertSame(str, intRange.toString());  // no longer passes - does it 
matter?
-        assertEquals("Range[-20,-10]", Range.between(-20, -10).toString());
+        assertEquals("[10..20]", str);
+        assertEquals("[-20..-10]", Range.between(-20, -10).toString());
     }
 
-    // 
--------------------------------------------------------------------------
+    public void testToStringFormat() {
+        String str = intRange.toString("From %1$s to %2$s");
+        assertEquals("From 10 to 20", str);
+    }
 
+    //-----------------------------------------------------------------------
     public void testGetMinimum() {
         assertEquals(10, (int) intRange.getMinimum());
         assertEquals(10L, (long) longRange.getMinimum());
         assertEquals(10f, floatRange.getMinimum(), 0.00001f);
         assertEquals(10d, doubleRange.getMinimum(), 0.00001d);
     }
-    
+
     public void testGetMaximum() {
         assertEquals(20, (int) intRange.getMaximum());
         assertEquals(20L, (long) longRange.getMaximum());
@@ -168,24 +171,44 @@ public class RangeTest extends TestCase 
         assertFalse(intRange.contains(25));
     }
 
-    public void testElementBefore() {
-        assertFalse(intRange.elementBefore(null));
+    public void testIsAfter() {
+        assertFalse(intRange.isAfter(null));
+        
+        assertTrue(intRange.isAfter(5));
+        assertFalse(intRange.isAfter(10));
+        assertFalse(intRange.isAfter(15));
+        assertFalse(intRange.isAfter(20));
+        assertFalse(intRange.isAfter(25));
+    }
+
+    public void testIsStartedBy() {
+        assertFalse(intRange.isStartedBy(null));
+        
+        assertFalse(intRange.isStartedBy(5));
+        assertTrue(intRange.isStartedBy(10));
+        assertFalse(intRange.isStartedBy(15));
+        assertFalse(intRange.isStartedBy(20));
+        assertFalse(intRange.isStartedBy(25));
+    }
+
+    public void testIsEndedBy() {
+        assertFalse(intRange.isEndedBy(null));
         
-        assertTrue(intRange.elementBefore(5));
-        assertFalse(intRange.elementBefore(10));
-        assertFalse(intRange.elementBefore(15));
-        assertFalse(intRange.elementBefore(20));
-        assertFalse(intRange.elementBefore(25));
-    }
-
-    public void testElementAfter() {
-        assertFalse(intRange.elementAfter(null));
-        
-        assertFalse(intRange.elementAfter(5));
-        assertFalse(intRange.elementAfter(10));
-        assertFalse(intRange.elementAfter(15));
-        assertFalse(intRange.elementAfter(20));
-        assertTrue(intRange.elementAfter(25));
+        assertFalse(intRange.isEndedBy(5));
+        assertFalse(intRange.isEndedBy(10));
+        assertFalse(intRange.isEndedBy(15));
+        assertTrue(intRange.isEndedBy(20));
+        assertFalse(intRange.isEndedBy(25));
+    }
+
+    public void testIsBefore() {
+        assertFalse(intRange.isBefore(null));
+        
+        assertFalse(intRange.isBefore(5));
+        assertFalse(intRange.isBefore(10));
+        assertFalse(intRange.isBefore(15));
+        assertFalse(intRange.isBefore(20));
+        assertTrue(intRange.isBefore(25));
     }
 
     public void testElementCompareTo() {
@@ -203,72 +226,100 @@ public class RangeTest extends TestCase 
         assertEquals(1, intRange.elementCompareTo(25));
     }
 
-    // 
--------------------------------------------------------------------------
-
-    public void testContainsAll() {
+    //-----------------------------------------------------------------------
+    public void testContainsRange() {
 
         // null handling
-        assertFalse(intRange.containsAll(null));
+        assertFalse(intRange.containsRange(null));
 
         // easy inside range
-        assertTrue(intRange.containsAll(Range.between(12, 18)));
+        assertTrue(intRange.containsRange(Range.between(12, 18)));
 
         // outside range on each side
-        assertFalse(intRange.containsAll(Range.between(32, 45)));
-        assertFalse(intRange.containsAll(Range.between(2, 8)));
+        assertFalse(intRange.containsRange(Range.between(32, 45)));
+        assertFalse(intRange.containsRange(Range.between(2, 8)));
 
         // equals range
-        assertTrue(intRange.containsAll(Range.between(10, 20)));
+        assertTrue(intRange.containsRange(Range.between(10, 20)));
 
         // overlaps
-        assertFalse(intRange.containsAll(Range.between(9, 14)));
-        assertFalse(intRange.containsAll(Range.between(16, 21)));
+        assertFalse(intRange.containsRange(Range.between(9, 14)));
+        assertFalse(intRange.containsRange(Range.between(16, 21)));
 
         // touches lower boundary
-        assertTrue(intRange.containsAll(Range.between(10, 19)));
-        assertFalse(intRange.containsAll(Range.between(10, 21)));
+        assertTrue(intRange.containsRange(Range.between(10, 19)));
+        assertFalse(intRange.containsRange(Range.between(10, 21)));
 
         // touches upper boundary
-        assertTrue(intRange.containsAll(Range.between(11, 20)));
-        assertFalse(intRange.containsAll(Range.between(9, 20)));
+        assertTrue(intRange.containsRange(Range.between(11, 20)));
+        assertFalse(intRange.containsRange(Range.between(9, 20)));
         
         // negative
-        assertFalse(intRange.containsAll(Range.between(-11, -18)));
+        assertFalse(intRange.containsRange(Range.between(-11, -18)));
+    }
 
+    public void testIsAfterRange() {
+        assertFalse(intRange.isAfterRange(null));
+        
+        assertTrue(intRange.isAfterRange(Range.between(5, 9)));
+        
+        assertFalse(intRange.isAfterRange(Range.between(5, 10)));
+        assertFalse(intRange.isAfterRange(Range.between(5, 20)));
+        assertFalse(intRange.isAfterRange(Range.between(5, 25)));
+        assertFalse(intRange.isAfterRange(Range.between(15, 25)));
+        
+        assertFalse(intRange.isAfterRange(Range.between(21, 25)));
+        
+        assertFalse(intRange.isAfterRange(Range.between(10, 20)));
     }
 
-    public void testOverlapsWith() {
+    public void testIsOverlappedBy() {
 
         // null handling
-        assertFalse(intRange.overlapsWith(null));
+        assertFalse(intRange.isOverlappedBy(null));
 
         // easy inside range
-        assertTrue(intRange.overlapsWith(Range.between(12, 18)));
+        assertTrue(intRange.isOverlappedBy(Range.between(12, 18)));
 
         // outside range on each side
-        assertFalse(intRange.overlapsWith(Range.between(32, 45)));
-        assertFalse(intRange.overlapsWith(Range.between(2, 8)));
+        assertFalse(intRange.isOverlappedBy(Range.between(32, 45)));
+        assertFalse(intRange.isOverlappedBy(Range.between(2, 8)));
 
         // equals range
-        assertTrue(intRange.overlapsWith(Range.between(10, 20)));
+        assertTrue(intRange.isOverlappedBy(Range.between(10, 20)));
 
         // overlaps
-        assertTrue(intRange.overlapsWith(Range.between(9, 14)));
-        assertTrue(intRange.overlapsWith(Range.between(16, 21)));
+        assertTrue(intRange.isOverlappedBy(Range.between(9, 14)));
+        assertTrue(intRange.isOverlappedBy(Range.between(16, 21)));
 
         // touches lower boundary
-        assertTrue(intRange.overlapsWith(Range.between(10, 19)));
-        assertTrue(intRange.overlapsWith(Range.between(10, 21)));
+        assertTrue(intRange.isOverlappedBy(Range.between(10, 19)));
+        assertTrue(intRange.isOverlappedBy(Range.between(10, 21)));
 
         // touches upper boundary
-        assertTrue(intRange.overlapsWith(Range.between(11, 20)));
-        assertTrue(intRange.overlapsWith(Range.between(9, 20)));
+        assertTrue(intRange.isOverlappedBy(Range.between(11, 20)));
+        assertTrue(intRange.isOverlappedBy(Range.between(9, 20)));
         
         // negative
-        assertFalse(intRange.overlapsWith(Range.between(-11, -18)));
+        assertFalse(intRange.isOverlappedBy(Range.between(-11, -18)));
+    }
 
+    public void testIsBeforeRange() {
+        assertFalse(intRange.isBeforeRange(null));
+        
+        assertFalse(intRange.isBeforeRange(Range.between(5, 9)));
+        
+        assertFalse(intRange.isBeforeRange(Range.between(5, 10)));
+        assertFalse(intRange.isBeforeRange(Range.between(5, 20)));
+        assertFalse(intRange.isBeforeRange(Range.between(5, 25)));
+        assertFalse(intRange.isBeforeRange(Range.between(15, 25)));
+        
+        assertTrue(intRange.isBeforeRange(Range.between(21, 25)));
+        
+        assertFalse(intRange.isBeforeRange(Range.between(10, 20)));
     }
 
+    //-----------------------------------------------------------------------
     public void testSerializing() {
         SerializationUtils.clone(intRange);
     }


Reply via email to