package com.github.xbn.test.number;
import com.github.xbn.lang.IllegalArgumentStateException;
import com.github.xbn.number.BoundSide;
import com.github.xbn.number.IntBoundExclusive;
import com.github.xbn.number.IntBoundInclusive;
import com.github.xbn.number.IntInRange;
import com.github.xbn.number.OverlapRequired;
import org.junit.Test;
import static org.junit.Assert.*;
/*
java com.github.xbn.test.number.IntInRange_Unit
*/
public class IntInRange_Unit {
public static final void main(String[] as_clp) {
IntInRange_Unit unit = new IntInRange_Unit();
unit.test_basicIsIn();
unit.test_inverted();
unit.test_overlapHasBothBounds();
unit.test_overlapAtLeastOneBoundNull();
unit.test_getIntersection();
unit.test_getMerged();
}
@Test
public void test_basicIsIn() {
IntInRange iir = new IntInRange(1, 2);
assertEquals(false, iir.isIn(0));
assertEquals(true, iir.isIn(1));
assertEquals(true, iir.isIn(2));
assertEquals(false, iir.isIn(3));
}
@Test
public void test_inverted() {
IntInRange iir = new IntInRange(1, 2).getInvertedCopy();
assertEquals(true, iir.isIn(0));
assertEquals(false, iir.isIn(1));
assertEquals(false, iir.isIn(2));
assertEquals(true, iir.isIn(3));
}
@Test
public void test_overlapHasBothBounds() {
IntInRange iir = new IntInRange(1, 2);
assertTrue(iir.doesOverlap(iir));
assertTrue(iir.doesOverlap(new IntInRange(2, 4)));
assertTrue(iir.doesOverlap(new IntInRange(0, 2)));
assertTrue(iir.doesOverlap(new IntInRange(0, 3)));
assertFalse(iir.doesOverlap(new IntInRange(new IntBoundExclusive(2, null), new IntBoundInclusive(3, null))));
assertFalse(iir.doesOverlap(new IntInRange(3, 4)));
assertFalse(iir.doesOverlap(new IntInRange(-1, 0)));
iir = new IntInRange(1, 1);
IntInRange iir2 = new IntInRange(new IntBoundExclusive(1, null), new IntBoundInclusive(2, null));
assertFalse(iir.doesOverlap(iir2));
}
@Test
public void test_overlapAtLeastOneBoundNull() {
IntInRange iir = new IntInRange(new IntBoundInclusive(1, null), null);
assertTrue(new IntInRange(null, null).doesOverlap(new IntInRange(null, null)));
assertTrue(iir.doesOverlap(iir));
assertTrue(iir.doesOverlap(new IntInRange(2, 4)));
assertTrue(iir.doesOverlap(new IntInRange(0, 2)));
assertTrue(iir.doesOverlap(new IntInRange(0, 3)));
assertTrue(iir.doesOverlap(new IntInRange(new IntBoundExclusive(2, null), new IntBoundInclusive(3, null))));
assertTrue(iir.doesOverlap(new IntInRange(3, 4)));
assertFalse(iir.doesOverlap(new IntInRange(-1, 0)));
assertTrue(iir.doesOverlap(new IntInRange(null, new IntBoundInclusive(2, null))));
assertTrue(iir.doesOverlap(new IntInRange(null, new IntBoundInclusive(4, null))));
iir = new IntInRange(null, null);
IntInRange iir2 = new IntInRange(1, 2);
assertTrue(iir.doesOverlap(iir2));
assertTrue(iir2.doesOverlap(iir));
}
@Test
public void test_getIntersection() {
IntInRange iir1 = new IntInRange(null, null);
IntInRange iir2 = new IntInRange(null, null);
//System.out.println(iir1.getOverlapDebugging(iir2));
assertEquals(new IntInRange(null, null), iir1.getIntersection(iir2));
iir2 = new IntInRange(1, 2);
assertEquals(new IntInRange(1, 2), iir1.getIntersection(iir2));
assertEquals(new IntInRange(1, 2), iir2.getIntersection(iir1));
iir1 = new IntInRange(null, new IntBoundInclusive(1, null));
iir2 = new IntInRange(new IntBoundInclusive(0, null), null);
assertEquals(new IntInRange(0, 1), iir1.getIntersection(iir2));
assertEquals(new IntInRange(0, 1), iir2.getIntersection(iir1));
iir1 = new IntInRange(1, 1);
iir2 = new IntInRange(1, 1);
assertEquals(new IntInRange(1, 1), iir1.getIntersection(iir2));
assertEquals(new IntInRange(1, 1), iir2.getIntersection(iir1));
iir2 = new IntInRange(new IntBoundExclusive(1, null), new IntBoundInclusive(2, null));
try {
new IntInRange(1, 2).getIntersection(
new IntInRange(new IntBoundExclusive(1, null), new IntBoundInclusive(2, null)));
fail("Different min-bound inclusivities");
} catch(IllegalArgumentStateException x) {
assertTrue(true);
}
//[1, 1] does not overlap with [1-excl,2]
assertEquals(null, iir2.getIntersection(iir1));
iir1 = new IntInRange(new IntBoundExclusive(0, null), new IntBoundInclusive(1, null));
assertNull(iir1.getIntersection(iir2));
assertNull(iir2.getIntersection(iir1));
iir1 = new IntInRange(new IntBoundInclusive(1, null), new IntBoundExclusive(2, null));
iir2 = new IntInRange(new IntBoundInclusive(1, null), new IntBoundExclusive(3, null));
IntInRange iir3 = new IntInRange(new IntBoundInclusive(1, null), new IntBoundExclusive(2, null));
assertEquals(iir3, iir1.getIntersection(iir2));
assertEquals(iir3, iir2.getIntersection(iir1));
iir1 = new IntInRange(1, 2);
iir2 = new IntInRange(2, 3);
assertEquals(new IntInRange(2, 2), iir1.getIntersection(iir2));
assertEquals(new IntInRange(2, 2), iir2.getIntersection(iir1));
iir1 = new IntInRange(1, 2);
iir2 = new IntInRange(3, 4);
assertEquals(null, iir1.getIntersection(iir2));
assertEquals(null, iir2.getIntersection(iir1));
}
@Test
public void test_getMerged() {
IntInRange iir1 = new IntInRange(null, null);
IntInRange iir2 = new IntInRange(null, null);
assertEquals(new IntInRange(null, null), iir1.getMerged(iir2, OverlapRequired.YES));
iir2 = new IntInRange(1, 1);
assertEquals(new IntInRange(null, null), iir1.getMerged(iir2, OverlapRequired.YES));
assertEquals(new IntInRange(null, null), iir2.getMerged(iir1, OverlapRequired.YES));
iir1 = new IntInRange(1, 1);
assertEquals(new IntInRange(1, 1), iir1.getMerged(iir2, OverlapRequired.YES));
assertEquals(new IntInRange(1, 1), iir2.getMerged(iir1, OverlapRequired.YES));
iir2 = new IntInRange(new IntBoundExclusive(1, null), new IntBoundInclusive(2, null));
try {
assertEquals(new IntInRange(1, 2), iir1.getMerged(iir2, OverlapRequired.YES));
fail("Overlap required, and doesn't overlap");
} catch(IllegalArgumentStateException x) {
assertTrue(true);
}
try {
assertEquals(new IntInRange(1, 2), iir2.getMerged(iir1, OverlapRequired.YES));
fail("Min bounds different exclusivity");
} catch(IllegalArgumentStateException x) {
assertTrue(true);
}
iir1 = new IntInRange(new IntBoundExclusive(0, null), new IntBoundInclusive(1, null));
assertEquals(new IntInRange(new IntBoundExclusive(0, null), new IntBoundInclusive(2, null)), iir1.getMerged(iir2, OverlapRequired.NO));
assertEquals(new IntInRange(new IntBoundExclusive(0, null), new IntBoundInclusive(2, null)), iir2.getMerged(iir1, OverlapRequired.NO));
iir1 = new IntInRange(1, 2);
iir2 = new IntInRange(2, 3);
assertEquals(new IntInRange(1, 3), iir1.getMerged(iir2, OverlapRequired.YES));
assertEquals(new IntInRange(1, 3), iir2.getMerged(iir1, OverlapRequired.YES));
iir1 = new IntInRange(1, 2);
iir2 = new IntInRange(3, 4);
try {
iir1.getMerged(iir2, OverlapRequired.YES);
fail("No overlap");
} catch(IllegalArgumentException x) {
assertTrue(true);
}
assertEquals(new IntInRange(1, 4), iir1.getMerged(iir2, OverlapRequired.NO));
assertEquals(new IntInRange(1, 4), iir2.getMerged(iir1, OverlapRequired.NO));
}
}