package com.revolsys.collection.set; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import org.junit.Test; import com.revolsys.collection.range.AbstractRange; import com.revolsys.collection.range.IntRange; import com.revolsys.collection.range.RangeInvalidException; import com.revolsys.collection.range.RangeSet; import com.revolsys.collection.range.Ranges; public class RangeTest { private static void assertCharRange(final char from, final char to, final char... characters) { final AbstractRange<?> range = Ranges.newRange(from, to); final List<Object> list = new ArrayList<>(); for (final char character : characters) { list.add(character); } Assert.assertEquals(list.size(), range.size()); if (from == to) { Assert.assertEquals(Character.toString(from), range.toString()); } else { if (from <= to) { Assert.assertEquals(from + "~" + to, range.toString()); } else { Assert.assertEquals(to + "~" + from, range.toString()); } } Assert.assertEquals(list, range.toList()); int i = 0; for (final Object character : range) { final Object expectedValue = list.get(i); Assert.assertEquals("element " + i, character, expectedValue); i++; } } private static void assertRange(final int from, final int to, final int... numbers) { final IntRange range = new IntRange(from, to); final List<Integer> list = new ArrayList<>(); for (final int i : numbers) { list.add(i); } Assert.assertEquals(list.size(), range.size()); if (from == to) { Assert.assertEquals(Integer.toString(from), range.toString()); } else { if (from <= to) { Assert.assertEquals(from + "~" + to, range.toString()); } else { Assert.assertEquals(to + "~" + from, range.toString()); } } Assert.assertEquals(list, range.toList()); int i = 0; for (final int value : range) { final int expectedValue = list.get(i); if (value != expectedValue) { Assert.fail("range(" + i + ") " + value + "!=" + expectedValue); } i++; } } private static void assertRangeSetAdd(final RangeSet set, final Object value, final String expected) { set.add(value); Assert.assertEquals(expected, set.toString()); } private static void assertRangeSetAddRange(final RangeSet set, final int from, final int to, final String expected) { set.addRange(from, to); Assert.assertEquals(expected, set.toString()); } private static void assertRangeSetCreate(final String range, final String expected) { final RangeSet set = RangeSet.newRangeSet(range); Assert.assertEquals(expected, set.toString()); final RangeSet expectedSet = RangeSet.newRangeSet(expected); Assert.assertEquals(expectedSet, set); final int size = set.size(); final int expectedSize = expectedSet.size(); Assert.assertEquals(expectedSize, size); final List<Object> list = set.toList(); final List<Object> expectedList = expectedSet.toList(); Assert.assertEquals(expectedList, list); } private static void assertRangeSetException(final String range) { try { final RangeSet set = RangeSet.newRangeSet(range); Assert.fail("Range is not supposed to be valid " + range + ", created " + set); } catch (final RangeInvalidException e) { } } private static void assertRangeSetRemove(final RangeSet set, final int value, final String expected) { set.remove(value); Assert.assertEquals(expected, set.toString()); } private static void assertRangeSetRemoveRange(final RangeSet set, final int from, final int to, final String expected) { set.removeRange(from, to); Assert.assertEquals(expected, set.toString()); } @Test public void testCharRange() { Assert.assertEquals("A", Ranges.newRange('A').toString()); Assert.assertEquals("A~E", Ranges.newRange('A', 'E').toString()); Assert.assertEquals("A~E", Ranges.newRange('E', 'A').toString()); Assert.assertEquals("0~9", Ranges.newRange('0', '9').toString()); Assert.assertEquals("0~9", Ranges.newRange('9', '0').toString()); assertCharRange('A', 'A', 'A'); assertCharRange('Z', 'Z', 'Z'); assertCharRange('A', 'C', 'A', 'B', 'C'); assertCharRange('C', 'A', 'A', 'B', 'C'); assertCharRange('Z', 'X', 'X', 'Y', 'Z'); Assert.assertEquals("a", Ranges.newRange('a').toString()); Assert.assertEquals("a~e", Ranges.newRange('a', 'e').toString()); assertCharRange('a', 'a', 'a'); assertCharRange('z', 'z', 'z'); assertCharRange('a', 'c', 'a', 'b', 'c'); assertCharRange('c', 'a', 'a', 'b', 'c'); assertCharRange('a', 'c', 'a', 'b', 'c'); assertCharRange('z', 'x', 'x', 'y', 'z'); assertRangeSetException("a~Z"); assertRangeSetException("Z~a"); } @Test public void testCompare() { Assert.assertEquals(0, AbstractRange.compare((byte)0, 0)); Assert.assertEquals(-1, AbstractRange.compare((byte)0, 1)); Assert.assertEquals(1, AbstractRange.compare((byte)1, 0)); Assert.assertEquals(0, AbstractRange.compare(0, (byte)0)); Assert.assertEquals(-1, AbstractRange.compare(0, (byte)1)); Assert.assertEquals(1, AbstractRange.compare(1, (byte)0)); Assert.assertEquals(0, AbstractRange.compare((short)0, 0)); Assert.assertEquals(-1, AbstractRange.compare((short)0, 1)); Assert.assertEquals(1, AbstractRange.compare((short)1, 0)); Assert.assertEquals(0, AbstractRange.compare(0, (short)0)); Assert.assertEquals(-1, AbstractRange.compare(0, (short)1)); Assert.assertEquals(1, AbstractRange.compare(1, (short)0)); // int Assert.assertEquals(0, AbstractRange.compare(0, 0)); Assert.assertEquals(-1, AbstractRange.compare(0, 1)); Assert.assertEquals(1, AbstractRange.compare(1, 0)); Assert.assertEquals(0, AbstractRange.compare((long)0, 0)); Assert.assertEquals(-1, AbstractRange.compare((long)0, 1)); Assert.assertEquals(1, AbstractRange.compare((long)1, 0)); Assert.assertEquals(0, AbstractRange.compare(0, (long)0)); Assert.assertEquals(-1, AbstractRange.compare(0, (long)1)); Assert.assertEquals(1, AbstractRange.compare(1, (long)0)); Assert.assertEquals(0, AbstractRange.compare((float)0, 0)); Assert.assertEquals(-1, AbstractRange.compare((float)0, 1)); Assert.assertEquals(1, AbstractRange.compare((float)1, 0)); Assert.assertEquals(0, AbstractRange.compare(0, (float)0)); Assert.assertEquals(-1, AbstractRange.compare(0, (float)1)); Assert.assertEquals(1, AbstractRange.compare(1, (float)0)); Assert.assertEquals(0, AbstractRange.compare((double)0, 0)); Assert.assertEquals(-1, AbstractRange.compare((double)0, 1)); Assert.assertEquals(1, AbstractRange.compare((double)1, 0)); Assert.assertEquals(0, AbstractRange.compare(0, (double)0)); Assert.assertEquals(-1, AbstractRange.compare(0, (double)1)); Assert.assertEquals(1, AbstractRange.compare(1, (double)0)); Assert.assertEquals(0, AbstractRange.compare(0, "0")); Assert.assertEquals(-1, AbstractRange.compare(0, "1")); Assert.assertEquals(1, AbstractRange.compare(1, "0")); Assert.assertEquals(0, AbstractRange.compare("0", 0)); Assert.assertEquals(-1, AbstractRange.compare("0", 1)); Assert.assertEquals(1, AbstractRange.compare("1", 0)); Assert.assertEquals(0, AbstractRange.compare(0, '0')); Assert.assertEquals(-1, AbstractRange.compare(0, '1')); Assert.assertEquals(1, AbstractRange.compare(1, '0')); Assert.assertEquals(0, AbstractRange.compare('0', 0)); Assert.assertEquals(-1, AbstractRange.compare('0', 1)); Assert.assertEquals(1, AbstractRange.compare('1', 0)); } @Test public void testExpand() { final IntRange range1 = new IntRange(100, 110); Assert.assertEquals("Same", range1, range1.expand(range1)); final IntRange range2 = new IntRange(100, 105); final IntRange range3 = new IntRange(100, 115); Assert.assertEquals("From 2nd Subset", range1, range1.expand(range2)); Assert.assertEquals("From 2nd Subset Switched", range1, range2.expand(range1)); Assert.assertEquals("From 2nd Superset", range3, range1.expand(range3)); Assert.assertEquals("From 2nd Superset Switched", range3, range3.expand(range1)); final IntRange range4 = new IntRange(105, 110); final IntRange range5 = new IntRange(-5, 110); Assert.assertEquals("To 2nd Subset", range1, range1.expand(range4)); Assert.assertEquals("To 2nd Subset Switched", range1, range4.expand(range1)); Assert.assertEquals("To 2nd Superset", range5, range1.expand(range5)); Assert.assertEquals("To 2nd Superset Switched", range5, range5.expand(range1)); final IntRange range6 = new IntRange(101, 109); Assert.assertEquals("Subset Middle", range1, range1.expand(range6)); Assert.assertEquals("Subset Middle Switched", range1, range6.expand(range1)); final IntRange range7 = new IntRange(98, 101); Assert.assertEquals("Overlap From", new IntRange(98, 110), range1.expand(range7)); Assert.assertEquals("Overlap To", new IntRange(98, 110), range7.expand(range1)); final IntRange range8 = new IntRange(98, 99); Assert.assertEquals("Touching From", new IntRange(98, 110), range1.expand(range8)); Assert.assertEquals("Touching To", new IntRange(98, 110), range8.expand(range1)); final IntRange range9 = new IntRange(0, 98); Assert.assertNull("Disjoint Before ", range1.expand(range9)); Assert.assertNull("Disjoint After", range9.expand(range1)); } @Test public void testIntRange() { Assert.assertEquals("1", new IntRange(1).toString()); Assert.assertEquals("1~10", new IntRange(1, 10).toString()); Assert.assertEquals("-10~-1", new IntRange(-10, -1).toString()); assertRange(0, 0, 0); assertRange(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE); assertRange(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE); assertRange(0, 3, 0, 1, 2, 3); assertRange(3, 0, 0, 1, 2, 3); assertRange(-1, 1, -1, 0, 1); assertRange(1, -1, -1, 0, 1); } @Test public void testRangeSet() { final RangeSet rangeSet = new RangeSet(); assertRangeSetAdd(rangeSet, 1, "1"); assertRangeSetAdd(rangeSet, 1, "1"); assertRangeSetAdd(rangeSet, 2, "1~2"); assertRangeSetAdd(rangeSet, 3, "1~3"); assertRangeSetAdd(rangeSet, 0, "0~3"); assertRangeSetAdd(rangeSet, 9, "0~3,9"); assertRangeSetAdd(rangeSet, 8, "0~3,8~9"); assertRangeSetAdd(rangeSet, 5, "0~3,5,8~9"); assertRangeSetAdd(rangeSet, 6, "0~3,5~6,8~9"); assertRangeSetAdd(rangeSet, 3, "0~3,5~6,8~9"); assertRangeSetAdd(rangeSet, 4, "0~6,8~9"); assertRangeSetAdd(rangeSet, 7, "0~9"); assertRangeSetRemove(rangeSet, 0, "1~9"); assertRangeSetRemove(rangeSet, 1, "2~9"); assertRangeSetRemove(rangeSet, 0, "2~9"); assertRangeSetRemove(rangeSet, 1, "2~9"); assertRangeSetRemove(rangeSet, 9, "2~8"); assertRangeSetRemove(rangeSet, 9, "2~8"); assertRangeSetRemove(rangeSet, 5, "2~4,6~8"); assertRangeSetAddRange(rangeSet, 1, 2, "1~4,6~8"); assertRangeSetAddRange(rangeSet, 4, 5, "1~8"); assertRangeSetAddRange(rangeSet, 0, 9, "0~9"); assertRangeSetAddRange(rangeSet, -10, -2, "-10~-2,0~9"); assertRangeSetAddRange(rangeSet, 11, 20, "-10~-2,0~9,11~20"); // From < assertRangeSetRemoveRange(rangeSet, -12, -11, "-10~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -12, -10, "-9~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -12, -8, "-7~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -12, -2, "0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -1, 11, "12~20"); // Reset Range assertRangeSetAddRange(rangeSet, -10, -2, "-10~-2,12~20"); assertRangeSetAddRange(rangeSet, 0, 9, "-10~-2,0~9,12~20"); assertRangeSetAddRange(rangeSet, 11, 20, "-10~-2,0~9,11~20"); // From = assertRangeSetRemoveRange(rangeSet, -10, -10, "-9~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -9, -7, "-6~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -6, -2, "0~9,11~20"); assertRangeSetRemoveRange(rangeSet, 0, 11, "12~20"); // Reset Range assertRangeSetAddRange(rangeSet, -10, -2, "-10~-2,12~20"); assertRangeSetAddRange(rangeSet, 0, 9, "-10~-2,0~9,12~20"); assertRangeSetAddRange(rangeSet, 11, 20, "-10~-2,0~9,11~20"); // From > assertRangeSetRemoveRange(rangeSet, -9, -9, "-10,-8~-2,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -4, -2, "-10,-8~-5,0~9,11~20"); assertRangeSetRemoveRange(rangeSet, -7, 0, "-10,-8,1~9,11~20"); assertRangeSetRemoveRange(rangeSet, 9, 11, "-10,-8,1~8,12~20"); assertRangeSetRemoveRange(rangeSet, 9, 12, "-10,-8,1~8,13~20"); assertRangeSetRemoveRange(rangeSet, -10, 14, "15~20"); assertRangeSetCreate("1", "1"); assertRangeSetCreate("1~10", "1~10"); assertRangeSetCreate("1,2~11", "1~11"); assertRangeSetCreate("1~2,2~11", "1~11"); assertRangeSetCreate("1~2,3~5,6~7", "1~7"); assertRangeSetCreate("1~2,6~7,3~5,0~9", "0~9"); final RangeSet rangeSet2 = new RangeSet(); assertRangeSetAdd(rangeSet2, 1, "1"); assertRangeSetAdd(rangeSet2, "1", "1"); assertRangeSetAdd(rangeSet2, "a", "1,a"); assertRangeSetAdd(rangeSet2, "a", "1,a"); assertRangeSetAdd(rangeSet2, "e", "1,a,e"); assertRangeSetAdd(rangeSet2, "b", "1,a~b,e"); assertRangeSetAdd(rangeSet2, "A", "1,A,a~b,e"); assertRangeSetAdd(rangeSet2, "C", "1,A,C,a~b,e"); assertRangeSetAdd(rangeSet2, "B", "1,A~C,a~b,e"); assertRangeSetCreate("A,B", "A~B"); assertRangeSetCreate("1,B", "1,B"); assertRangeSetCreate("01,B", "1,B"); assertRangeSetCreate("A~D+01~10", "A~D+01~10"); } }