@Override public IntegerRange getFromString(String representation) { String[] rangeParts = representation.split(","); IntegerRange range = new IntegerRange(); for (String rangePart : rangeParts) { if (!rangePart.isEmpty()) { String[] parts = rangePart.split("\\.\\."); if (parts.length == 2) { range.addNumbers(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); } else if (parts.length == 1) { int number = Integer.parseInt(parts[0]); range.addNumbers(number, number); } else { throw new IllegalArgumentException("Unable to parse the range correctly: " + representation); } } } return range; } }
@Test public void testNoRange() { IntegerRange range = new IntegerRange(); validateRange(range); }
private void validateRange(IntegerRange range, Integer... numbers) { Iterator<Integer> iterator = range.iterator(); for (Integer number : numbers) { assertTrue(iterator.hasNext()); assertEquals(number, iterator.next()); } assertFalse(iterator.hasNext()); } }
@Test public void testEmptyRange() { IntegerRange range = new IntegerRange(); String rangeStr = handler.getAsString(range); assertEquals("", rangeStr); validateRange(handler.getFromString(rangeStr)); }
private void validateRange(IntegerRange range, Integer...numbers) { Iterator<Integer> iterator = range.iterator(); for (Integer number : numbers) { assertTrue(iterator.hasNext()); assertEquals(number, iterator.next()); } assertFalse(iterator.hasNext()); } }
@Test(expected = IllegalArgumentException.class) public void testIncorrectRange() { IntegerRange range = new IntegerRange(); range.addNumbers(3, 2); }
@Test public void testTwoRangesOneWithinAnother() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 6); range.addNumbers(3, 5); validateRange(range, 1, 2, 3, 4, 5, 6); }
@Test public void testTwoRanges() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 3); range.addNumbers(5, 6); validateRange(range, 1, 2, 3, 5, 6); }
@Test public void testTwoRangesAddedInReverseOrder() { IntegerRange range = new IntegerRange(); range.addNumbers(5, 6); range.addNumbers(1, 3); validateRange(range, 1, 2, 3, 5, 6); }
@Test public void testTwoRangesOverlapping() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 4); range.addNumbers(3, 6); validateRange(range, 1, 2, 3, 4, 5, 6); }
@Test public void testTwoRangesAtTheMaxInt() { IntegerRange range = new IntegerRange(); range.addNumbers(Integer.MAX_VALUE - 3, Integer.MAX_VALUE); range.addNumbers(Integer.MAX_VALUE - 1, Integer.MAX_VALUE); validateRange(range, Integer.MAX_VALUE - 3, Integer.MAX_VALUE - 2, Integer.MAX_VALUE - 1, Integer.MAX_VALUE); }
@Test public void testSimpleRange() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 3); validateRange(range, 1, 2, 3); }
@Test public void testOneNumberRange() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 1); validateRange(range, 1); }
@Test public void testTwoRangesMerged() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 5); range.addNumbers(3, 6); String rangeStr = handler.getAsString(range); assertEquals("1..6", rangeStr); validateRange(handler.getFromString(rangeStr), 1, 2, 3, 4, 5, 6); }
@Test public void testTwoRanges() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 3); range.addNumbers(5, 6); String rangeStr = handler.getAsString(range); assertEquals("1..3,5..6", rangeStr); validateRange(handler.getFromString(rangeStr), 1, 2, 3, 5, 6); }
@Test public void testSingleRange() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 1); String rangeStr = handler.getAsString(range); assertEquals("1", rangeStr); validateRange(handler.getFromString(rangeStr), 1); }
@Test public void testSimpleRange() { IntegerRange range = new IntegerRange(); range.addNumbers(1, 3); String rangeStr = handler.getAsString(range); assertEquals("1..3", rangeStr); validateRange(handler.getFromString(rangeStr), 1, 2, 3); }