範囲を扱うクラス(2)

先日のエントリ
範囲を扱うクラス - ttmmrr(@o_tmr)の日記
の続き。

実装側

// Range.java
public class Range<T extends Comparable<T>>{
  private static final Range.Comp DEFAULT = Range.Comp.EE;
  private final Range.Comp _comp;
  private final T _from;
  private final T _to;

  public Range(final Range.Comp comp, final T from, final T to){
    _comp = null != comp ? comp : DEFAULT;
    _from = from;
    _to = to;
  }

  public Range(final T from, final T to){
    this(DEFAULT, from, to);
  }

  public T getFrom() { return _from; }
  public T getTo() { return _to; }

  public boolean contains(final T value) {
    if (null == value) return false;
    return _comp.contains(this, value);
  }

  public static enum Comp {
    /** ●−● // from<=value<=to */
    EE {
      @Override
      public <T extends Comparable<T>> boolean contains(final Range<T> range, final T value) {
        return range.getFrom().compareTo(value) <= 0 && value.compareTo(range.getTo()) <= 0;
      }
    },
    /** ○−● // from <value<=to*/
    TE {
      @Override
      public <T extends Comparable<T>> boolean contains(final Range<T> range, final T value) {
        return range.getFrom().compareTo(value) <  0 && value.compareTo(range.getTo()) <= 0;
      }
    },
    /** ●−○ // from<=value< to*/
    ET {
      @Override
      public <T extends Comparable<T>> boolean contains(final Range<T> range, final T value) {
        return range.getFrom().compareTo(value) <= 0 && value.compareTo(range.getTo()) <  0;
      }
    },
    /** ○−○ // from< value< to*/
    TT {
      @Override
      public <T extends Comparable<T>> boolean contains(final Range<T> range, final T value) {
        return range.getFrom().compareTo(value) <  0 && value.compareTo(range.getTo()) <  0;
      }
    };
    protected abstract <T extends Comparable<T>> boolean contains(final Range<T> range, final T value);
  }
}

テスト(JUnit4)

// RangeTest.java
import static org.junit.Assert.assertEquals;

import org.junit.Test;


public class RangeTest {
  @Test
  public void containsデフォルト() {
    Integer f = 1;
    Integer t = 12;
    Range<Integer> r = new Range<Integer>(f, t);

    assertEquals(false, r.contains(0));
    //
    assertEquals(true, r.contains(1));
    assertEquals(true, r.contains(2));
    assertEquals(true, r.contains(11));
    assertEquals(true, r.contains(12));
    //
    assertEquals(false, r.contains(13));
    assertEquals(false, r.contains(null));
  }

  @Test
  public void containsEE() {
    Integer f = 1;
    Integer t = 12;
    Range<Integer> r = new Range<Integer>(Range.Comp.EE, f, t);

    assertEquals(false, r.contains(0));
    //
    assertEquals(true, r.contains(1));
    assertEquals(true, r.contains(2));
    assertEquals(true, r.contains(11));
    assertEquals(true, r.contains(12));
    //
    assertEquals(false, r.contains(13));
    assertEquals(false, r.contains(null));
  }

  @Test
  public void containsTE() {
    Integer f = 1;
    Integer t = 12;
    Range<Integer> r = new Range<Integer>(Range.Comp.TE, f, t);

    assertEquals(false, r.contains(0));
    assertEquals(false, r.contains(1));//★
    //
    assertEquals(true, r.contains(2));
    assertEquals(true, r.contains(11));
    assertEquals(true, r.contains(12));
    //
    assertEquals(false, r.contains(13));
    assertEquals(false, r.contains(null));
  }

  @Test
  public void containsET() {
    Integer f = 1;
    Integer t = 12;
    Range<Integer> r = new Range<Integer>(Range.Comp.ET, f, t);

    assertEquals(false, r.contains(0));
    //
    assertEquals(true, r.contains(1));
    assertEquals(true, r.contains(2));
    assertEquals(true, r.contains(11));
    //
    assertEquals(false, r.contains(12));//★
    assertEquals(false, r.contains(13));
    assertEquals(false, r.contains(null));
  }

  @Test
  public void containsTT() {
    Integer f = 1;
    Integer t = 12;
    Range<Integer> r = new Range<Integer>(Range.Comp.TT, f, t);

    assertEquals(false, r.contains(0));
    assertEquals(false, r.contains(1));//★
    //
    assertEquals(true, r.contains(2));
    assertEquals(true, r.contains(11));
    //
    assertEquals(false, r.contains(12));//★
    assertEquals(false, r.contains(13));
    assertEquals(false, r.contains(null));
  }
}