package org.fishwife.jrugged.interval;
import static org.junit.Assert.*;
import java.util.Random;
import org.junit.Test;
public class TestDiscreteInterval {
private Random random = new Random();
@Test
public void canCreate() {
new DiscreteInterval(1, 3);
}
@Test
public void allowsMinGreaterThanMax() {
new DiscreteInterval(3, 1);
}
@Test
public void canGetMinimum() {
assertEquals(1, (new DiscreteInterval(1, 3)).getMin());
}
@Test
public void canGetMaximum() {
assertEquals(3, (new DiscreteInterval(1, 3)).getMax());
}
@Test
public void canAdd() {
DiscreteInterval i1 = new DiscreteInterval(1, 3);
DiscreteInterval i2 = new DiscreteInterval(2, 4);
DiscreteInterval out = i1.plus(i2);
assertEquals(1 + 2, out.getMin());
assertEquals(3 + 4, out.getMax());
}
@Test
public void addCanHandleWraparoundAddition() {
long x = Long.MAX_VALUE - 5;
DiscreteInterval i1 = new DiscreteInterval(x-1,x);
DiscreteInterval out = i1.plus(new DiscreteInterval(10,10));
assertEquals(Long.MIN_VALUE + 3, out.getMin());
assertEquals(Long.MIN_VALUE + 4, out.getMax());
}
@Test
public void addCanHandleAdditionOfStraddlingInterval() {
DiscreteInterval i1 = new DiscreteInterval(Long.MAX_VALUE,Long.MIN_VALUE);
DiscreteInterval out = i1.plus(new DiscreteInterval(10,10));
assertEquals(Long.MIN_VALUE + 9, out.getMin());
assertEquals(Long.MIN_VALUE + 10, out.getMax());
}
@Test
public void canNegate() {
DiscreteInterval i = new DiscreteInterval(1, 3);
DiscreteInterval out = i.negate();
assertEquals(-3, out.getMin());
assertEquals(-1, out.getMax());
}
@Test
public void sizeOfConstantIntervalIsOne() {
DiscreteInterval i = new DiscreteInterval(1,1);
assertEquals(1, i.size());
}
@Test
public void sizeOfWiderIntervalReturnsDifferencePlusOne() {
DiscreteInterval i = new DiscreteInterval(1,3);
assertEquals(3, i.size());
}
@Test
public void negationOfPositiveIntervalMaintainsSize() {
DiscreteInterval i = new DiscreteInterval(1, 3);
assertEquals(i.size(), i.negate().size());
}
@Test
public void negationOfStraddlingIntervalMaintainsSize() {
DiscreteInterval i = new DiscreteInterval(Long.MAX_VALUE, Long.MIN_VALUE);
assertEquals(i.size(), i.negate().size());
}
@Test
public void negationOfNegativeIntervalMaintainsSize() {
DiscreteInterval i = new DiscreteInterval(-3, -1);
assertEquals(i.size(), i.negate().size());
}
@Test
public void canSubtract() {
DiscreteInterval i1 = new DiscreteInterval(1, 3);
DiscreteInterval i2 = new DiscreteInterval(2, 4);
DiscreteInterval out = i2.minus(i1);
assertEquals(-1, out.getMin());
assertEquals(3, out.getMax());
}
@Test
public void subtractionIsAddingNegative() {
DiscreteInterval i1 = new DiscreteInterval(random.nextInt(1000), random.nextInt(1000));
DiscreteInterval i2 = new DiscreteInterval(random.nextInt(1000), random.nextInt(1000));
DiscreteInterval sub = i1.minus(i2);
DiscreteInterval sub2 = i1.plus(i2.negate());
assertEquals(sub.getMin(), sub2.getMin());
assertEquals(sub.getMax(), sub2.getMax());
}
@Test
public void doesNotContainNonOverlappingInterval() {
DiscreteInterval i1 = new DiscreteInterval(1,3);
assertFalse(i1.contains(new DiscreteInterval(5,6)));
}
@Test
public void doesNotContainPartiallyHigherInterval() {
DiscreteInterval i1 = new DiscreteInterval(1,3);
assertFalse(i1.contains(new DiscreteInterval(2,4)));
}
@Test
public void doesNotContainPartiallyLowerInterval() {
DiscreteInterval i1 = new DiscreteInterval(1,3);
assertFalse(i1.contains(new DiscreteInterval(0,2)));
}
@Test
public void containsFullySurroundedInterval() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertTrue(i1.contains(new DiscreteInterval(3,4)));
}
@Test
public void containsIntervalWithMatchingMinimum() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertTrue(i1.contains(new DiscreteInterval(1,4)));
}
@Test
public void containsIntervalWithMatchingMaximum() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertTrue(i1.contains(new DiscreteInterval(3,6)));
}
@Test
public void containsItself() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertTrue(i1.contains(i1));
}
@Test
public void canGenerateStringRep() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertEquals("[1,6]", i1.toString());
}
@Test
public void intervalsWithSameBoundsAreEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(1,6);
assertEquals(i1, i2);
}
@Test
public void intervalsWithDifferentBoundsAreNotEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(2,3);
assertFalse(i1.equals(i2));
}
@Test
public void intervalsWithDifferentMinimumsAreNotEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(2,6);
assertFalse(i1.equals(i2));
}
@Test
public void intervalsWithDifferentMaximumsAreNotEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(1,5);
assertFalse(i1.equals(i2));
}
@Test
public void intervalIsEqualToItself() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertTrue(i1.equals(i1));
}
@Test
public void intervalIsNotEqualToNull() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertFalse(i1.equals(null));
}
@Test
public void intervalIsNotEqualToNonIntervals() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
assertFalse(i1.equals(new Object()));
}
@Test
public void hashCodesOfEqualIntervalsAreEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(1,6);
assertEquals(i1.hashCode(), i2.hashCode());
}
@Test
public void hashCodesOfUnequalIntervalsAreEqual() {
DiscreteInterval i1 = new DiscreteInterval(1,6);
DiscreteInterval i2 = new DiscreteInterval(2,3);
assertFalse(i1.hashCode() == i2.hashCode());
}
}