Skip to content

Commit 3ba921c

Browse files
committed
CatalogUtils.parseCatalogNumbers(): implement parsing of a range of numbers.
Required for #694
1 parent 43dc133 commit 3ba921c

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

src/main/java/ru/mystamps/web/util/CatalogUtils.java

+29-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Set;
2626
import java.util.TreeSet;
27+
import java.util.stream.IntStream;
2728

2829
import org.apache.commons.lang3.StringUtils;
2930
import org.apache.commons.lang3.Validate;
@@ -117,9 +118,34 @@ public static Set<String> parseCatalogNumbers(String catalogNumbers) {
117118
for (String number : catalogNumbers.split(",")) {
118119
Validate.validState(!number.trim().isEmpty(), "Catalog number must be non empty");
119120

120-
// TODO: parse range of numbers
121-
122-
result.add(number);
121+
String[] range = StringUtils.split(number, '-');
122+
switch (range.length) {
123+
case 1:
124+
result.add(number);
125+
break;
126+
case 2:
127+
try {
128+
Integer begin = Integer.valueOf(range[0]);
129+
Integer end = Integer.valueOf(range[1]);
130+
Validate.isTrue(begin < end, "Range must be in an ascending order");
131+
132+
// [ 1,2 ] => [ 1,2] => [ "1","2" ]
133+
IntStream.rangeClosed(begin, end)
134+
.mapToObj(String::valueOf)
135+
.forEach(result::add);
136+
137+
} catch (NumberFormatException ex) {
138+
throw new IllegalArgumentException(
139+
"Unexpected a non-numeric range found",
140+
ex
141+
);
142+
}
143+
break;
144+
default:
145+
throw new IllegalArgumentException(
146+
"Unexpected number of separators found: expected to have only one"
147+
);
148+
}
123149
}
124150

125151
return result;

src/test/groovy/ru/mystamps/web/util/CatalogUtilsTest.groovy

+27
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package ru.mystamps.web.util
1919

2020
import spock.lang.Specification
21+
import spock.lang.Unroll
2122

2223
@SuppressWarnings(['ClassJavadoc', 'MethodName', 'NoDef', 'NoTabCharacter', 'TrailingWhitespace'])
2324
class CatalogUtilsTest extends Specification {
@@ -178,4 +179,30 @@ class CatalogUtilsTest extends Specification {
178179
thrown IllegalStateException
179180
}
180181

182+
def 'parseCatalogNumbers() should return two elements for a range with two numbers'() {
183+
when:
184+
Set<String> numbers = CatalogUtils.parseCatalogNumbers('1-2')
185+
then:
186+
numbers == [ '1', '2' ] as Set
187+
}
188+
189+
@Unroll
190+
def 'parseCatalogNumbers() should throw exception for an invalid value (#numbers)'(
191+
String numbers, String message) {
192+
193+
when:
194+
CatalogUtils.parseCatalogNumbers(numbers)
195+
then:
196+
IllegalArgumentException ex = thrown()
197+
ex.message == message
198+
where:
199+
numbers | message
200+
'1-2-3' | 'Unexpected number of separators found: expected to have only one'
201+
'1-z' | 'Unexpected a non-numeric range found'
202+
'z-2' | 'Unexpected a non-numeric range found'
203+
' 1 - 2 ' | 'Unexpected a non-numeric range found'
204+
'1-1' | 'Range must be in an ascending order'
205+
'2-1' | 'Range must be in an ascending order'
206+
}
207+
181208
}

0 commit comments

Comments
 (0)