Skip to content

Commit ef5677f

Browse files
committed
Use parameterized tests for json data
1 parent 48f3d4e commit ef5677f

File tree

2 files changed

+112
-122
lines changed

2 files changed

+112
-122
lines changed

pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<com.github.spotbugs.version>4.8.3</com.github.spotbugs.version>
7676
<!-- Dependency versions -->
7777
<junit.version>5.12.0</junit.version>
78+
<maven-surefire-junit5-tree-reporter.version>1.4.0</maven-surefire-junit5-tree-reporter.version>
7879
</properties>
7980

8081
<scm>
@@ -144,6 +145,11 @@
144145
<artifactId>junit-jupiter-api</artifactId>
145146
<scope>test</scope>
146147
</dependency>
148+
<dependency>
149+
<groupId>org.junit.jupiter</groupId>
150+
<artifactId>junit-jupiter-params</artifactId>
151+
<scope>test</scope>
152+
</dependency>
147153
</dependencies>
148154

149155
<build>
@@ -158,6 +164,8 @@
158164
<groupId>org.apache.maven.plugins</groupId>
159165
<artifactId>maven-compiler-plugin</artifactId>
160166
<version>${maven.compiler.plugin.version}</version>
167+
<dependencies>
168+
</dependencies>
161169
</plugin>
162170
<plugin>
163171
<groupId>org.apache.maven.plugins</groupId>
@@ -382,6 +390,22 @@
382390
</configuration>
383391
</execution>
384392
</executions>
393+
<dependencies>
394+
<dependency>
395+
<groupId>me.fabriciorby</groupId>
396+
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
397+
<version>${maven-surefire-junit5-tree-reporter.version}</version>
398+
</dependency>
399+
</dependencies>
400+
<configuration>
401+
<reportFormat>plain</reportFormat>
402+
<consoleOutputReporter>
403+
<disable>true</disable>
404+
</consoleOutputReporter>
405+
<statelessTestsetInfoReporter
406+
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
407+
</statelessTestsetInfoReporter>
408+
</configuration>
385409
</plugin>
386410
</plugins>
387411
</build>

src/test/java/com/github/packageurl/PackageURLTest.java

Lines changed: 88 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,23 @@
3030

3131
import java.io.IOException;
3232
import java.io.InputStream;
33-
import java.util.HashMap;
33+
import java.util.Collections;
3434
import java.util.Locale;
3535
import java.util.Map;
3636
import java.util.TreeMap;
37+
import java.util.stream.IntStream;
38+
import java.util.stream.Stream;
39+
3740
import org.json.JSONArray;
3841
import org.json.JSONObject;
3942
import org.json.JSONTokener;
4043
import org.junit.jupiter.api.AfterAll;
4144
import org.junit.jupiter.api.BeforeAll;
45+
import org.junit.jupiter.api.DisplayName;
4246
import org.junit.jupiter.api.Test;
47+
import org.junit.jupiter.params.ParameterizedTest;
48+
import org.junit.jupiter.params.provider.Arguments;
49+
import org.junit.jupiter.params.provider.MethodSource;
4350

4451
/**
4552
* Test cases for PackageURL parsing
@@ -50,25 +57,28 @@
5057
* @author Steve Springett
5158
*/
5259
class PackageURLTest {
53-
54-
private static JSONArray json = new JSONArray();
55-
56-
private static Locale defaultLocale;
60+
private static final Locale DEFAULT_LOCALE = Locale.getDefault();
5761

5862
@BeforeAll
59-
static void setup() throws IOException {
60-
try (InputStream is = PackageURLTest.class.getResourceAsStream("/test-suite-data.json")) {
61-
assertNotNull(is);
62-
json = new JSONArray(new JSONTokener(is));
63-
}
64-
65-
defaultLocale = Locale.getDefault();
63+
static void setup() {
6664
Locale.setDefault(new Locale("tr"));
6765
}
6866

6967
@AfterAll
7068
static void resetLocale() {
71-
Locale.setDefault(defaultLocale);
69+
Locale.setDefault(DEFAULT_LOCALE);
70+
}
71+
72+
private static Stream<Arguments> getTestData() throws IOException {
73+
return getTestDataFromFile("test-suite-data.json");
74+
}
75+
76+
private static Stream<Arguments> getTestDataFromFile(String name) throws IOException {
77+
try (InputStream is = PackageURLTest.class.getResourceAsStream("/" + name)) {
78+
assertNotNull(is);
79+
JSONArray jsonArray = new JSONArray(new JSONTokener(is));
80+
return IntStream.range(0, jsonArray.length()).mapToObj(jsonArray::getJSONObject).map(PackageURLTest::createTestDefinition);
81+
}
7282
}
7383

7484
@Test
@@ -83,131 +93,87 @@ void validPercentEncoding() throws MalformedPackageURLException {
8393
@SuppressWarnings("deprecation")
8494
@Test
8595
void invalidPercentEncoding() throws MalformedPackageURLException {
86-
assertThrows(MalformedPackageURLException.class, () -> new PackageURL("pkg:maven/com.google.summit/summit-ast@2.2.0%"));
87-
assertThrows(MalformedPackageURLException.class, () -> new PackageURL("pkg:maven/com.google.summit/summit-ast@2.2.0%0"));
96+
assertThrowsExactly(MalformedPackageURLException.class, () -> new PackageURL("pkg:maven/com.google.summit/summit-ast@2.2.0%"));
97+
assertThrowsExactly(MalformedPackageURLException.class, () -> new PackageURL("pkg:maven/com.google.summit/summit-ast@2.2.0%0"));
8898
PackageURL purl = new PackageURL("pkg:maven/com.google.summit/summit-ast@2.2.0");
89-
Throwable t1 = assertThrows(ValidationException.class, () -> purl.uriDecode("%"));
99+
Throwable t1 = assertThrowsExactly(ValidationException.class, () -> purl.uriDecode("%"));
90100
assertEquals("Incomplete percent encoding at offset 0 with value '%'", t1.getMessage());
91-
Throwable t2 = assertThrows(ValidationException.class, () -> purl.uriDecode("a%0"));
101+
Throwable t2 = assertThrowsExactly(ValidationException.class, () -> purl.uriDecode("a%0"));
92102
assertEquals("Incomplete percent encoding at offset 1 with value '%0'", t2.getMessage());
93-
Throwable t3 = assertThrows(ValidationException.class, () -> purl.uriDecode("aaaa%%0A"));
103+
Throwable t3 = assertThrowsExactly(ValidationException.class, () -> purl.uriDecode("aaaa%%0A"));
94104
assertEquals("Invalid percent encoding char 1 at offset 5 with value '%'", t3.getMessage());
95-
Throwable t4 = assertThrows(ValidationException.class, () -> purl.uriDecode("%0G"));
105+
Throwable t4 = assertThrowsExactly(ValidationException.class, () -> purl.uriDecode("%0G"));
96106
assertEquals("Invalid percent encoding char 2 at offset 2 with value 'G'", t4.getMessage());
97107
}
98108

99-
@Test
100-
void constructorParsing() throws Exception {
101-
for (int i = 0; i < json.length(); i++) {
102-
JSONObject testDefinition = json.getJSONObject(i);
103-
104-
final String purlString = testDefinition.getString("purl");
105-
final String cpurlString = testDefinition.optString("canonical_purl");
106-
final boolean invalid = testDefinition.getBoolean("is_invalid");
107-
108-
System.out.println("Running test on: " + purlString);
109-
110-
final String type = testDefinition.optString("type", null);
111-
final String namespace = testDefinition.optString("namespace", null);
112-
final String name = testDefinition.optString("name", null);
113-
final String version = testDefinition.optString("version", null);
114-
final JSONObject qualifiers = testDefinition.optJSONObject("qualifiers");
115-
final String subpath = testDefinition.optString("subpath", null);
116-
117-
if (invalid) {
118-
try {
119-
PackageURL purl = new PackageURL(purlString);
120-
fail("Invalid purl should have caused an exception: " + purl);
121-
} catch (MalformedPackageURLException e) {
122-
assertNotNull(e.getMessage());
123-
}
124-
continue;
125-
}
126-
127-
PackageURL purl = new PackageURL(purlString);
128-
129-
assertEquals("pkg", purl.getScheme());
130-
assertEquals(type, purl.getType());
131-
assertEquals(namespace, purl.getNamespace());
132-
assertEquals(name, purl.getName());
133-
assertEquals(version, purl.getVersion());
134-
assertEquals(subpath, purl.getSubpath());
135-
assertNotNull(purl.getQualifiers());
136-
assertEquals(qualifiers != null ? qualifiers.length() : 0, purl.getQualifiers().size(), "qualifier count");
137-
if (qualifiers != null){
138-
qualifiers.keySet().forEach(key -> {
139-
String value = qualifiers.getString(key);
140-
assertTrue(purl.getQualifiers().containsKey(key));
141-
assertEquals(value, purl.getQualifiers().get(key));
142-
});
143-
}
144-
assertEquals(cpurlString, purl.canonicalize());
145-
}
109+
private static Arguments createTestDefinition(JSONObject testDefinition) {
110+
JSONObject jsonQualifiers = testDefinition.optJSONObject("qualifiers");
111+
Map<String, Object> qualifiers = (jsonQualifiers != null && !jsonQualifiers.isEmpty()) ? jsonQualifiers.toMap() : Collections.emptyMap();
112+
return Arguments.of(
113+
testDefinition.getString("description"),
114+
testDefinition.getString("purl"),
115+
testDefinition.optString("canonical_purl"),
116+
testDefinition.optString("type"),
117+
testDefinition.optString("namespace", null),
118+
testDefinition.optString("name", null),
119+
testDefinition.optString("version", null),
120+
qualifiers,
121+
testDefinition.optString("subpath", null),
122+
testDefinition.getBoolean("is_invalid"));
146123
}
147124

148-
@Test
149-
@SuppressWarnings("unchecked")
150-
void constructorParameters() throws MalformedPackageURLException {
151-
for (int i = 0; i < json.length(); i++) {
152-
JSONObject testDefinition = json.getJSONObject(i);
153-
154-
final String purlString = testDefinition.getString("purl");
155-
final String cpurlString = testDefinition.optString("canonical_purl");
156-
final boolean invalid = testDefinition.getBoolean("is_invalid");
157-
158-
System.out.println("Running test on: " + purlString);
159-
160-
final String type = testDefinition.optString("type", null);
161-
final String namespace = testDefinition.optString("namespace", null);
162-
final String name = testDefinition.optString("name", null);
163-
final String version = testDefinition.optString("version", null);
164-
final JSONObject qualifiers = testDefinition.optJSONObject("qualifiers");
165-
final String subpath = testDefinition.optString("subpath", null);
166-
167-
Map<String, String> map = null;
168-
Map<String, String> hashMap = null;
169-
if (qualifiers != null) {
170-
map = qualifiers.toMap().entrySet().stream().collect(
171-
TreeMap::new,
172-
(qmap, entry) -> qmap.put(entry.getKey(), (String) entry.getValue()),
173-
TreeMap::putAll
174-
);
175-
hashMap = new HashMap<>(map);
125+
@DisplayName("Test constructor parsing")
126+
@ParameterizedTest(name = "{0}: ''{1}''")
127+
@MethodSource("getTestData")
128+
void constructorParsing(String description, String purlString, String cpurlString, String type, String namespace, String name, String version, Map<String, String> qualifiers, String subpath, boolean invalid) throws Exception {
129+
if (invalid) {
130+
try {
131+
PackageURL purl = new PackageURL(purlString);
132+
fail("Invalid purl should have caused an exception: " + purl);
133+
} catch (MalformedPackageURLException e) {
134+
assertNotNull(e.getMessage());
176135
}
177136

137+
return;
138+
}
178139

140+
PackageURL purl = new PackageURL(purlString);
179141

180-
if (invalid) {
181-
try {
182-
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
183-
fail("Invalid package url components should have caused an exception: " + purl);
184-
} catch (NullPointerException | MalformedPackageURLException e) {
185-
assertNotNull(e.getMessage());
186-
}
187-
continue;
188-
}
142+
assertEquals("pkg", purl.getScheme());
143+
assertEquals(type, purl.getType());
144+
assertEquals(namespace, purl.getNamespace());
145+
assertEquals(name, purl.getName());
146+
assertEquals(version, purl.getVersion());
147+
assertEquals(qualifiers, purl.getQualifiers());
148+
assertEquals(subpath, purl.getSubpath());
149+
assertEquals(cpurlString, purl.canonicalize());
150+
}
189151

190-
PackageURL purl = new PackageURL(type, namespace, name, version, map, subpath);
191-
192-
assertEquals(cpurlString, purl.canonicalize());
193-
assertEquals("pkg", purl.getScheme());
194-
assertEquals(type, purl.getType());
195-
assertEquals(namespace, purl.getNamespace());
196-
assertEquals(name, purl.getName());
197-
assertEquals(version, purl.getVersion());
198-
assertEquals(subpath, purl.getSubpath());
199-
assertNotNull(purl.getQualifiers());
200-
assertEquals(qualifiers != null ? qualifiers.length() : 0, purl.getQualifiers().size(), "qualifier count");
201-
if (qualifiers != null) {
202-
qualifiers.keySet().forEach(key -> {
203-
String value = qualifiers.getString(key);
204-
assertTrue(purl.getQualifiers().containsKey(key));
205-
assertEquals(value, purl.getQualifiers().get(key));
206-
});
207-
PackageURL purl2 = new PackageURL(type, namespace, name, version, hashMap, subpath);
208-
assertEquals(purl.getQualifiers(), purl2.getQualifiers());
152+
@DisplayName("Test constructor parameters")
153+
@ParameterizedTest(name = "{0}: ({3}, {4}, {5}, {6}, {7}, {8})")
154+
@MethodSource("getTestData")
155+
void constructorParameters(String description, String purlString, String cpurlString, String type, String namespace, String name, String version, Map<String, String> qualifiers, String subpath, boolean invalid) throws MalformedPackageURLException {
156+
if (invalid) {
157+
try {
158+
PackageURL purl = new PackageURL(type, namespace, name, version, qualifiers, subpath);
159+
fail("Invalid package url components should have caused an exception: " + purl);
160+
} catch (NullPointerException | MalformedPackageURLException e) {
161+
assertNotNull(e.getMessage());
209162
}
163+
164+
return;
210165
}
166+
167+
PackageURL purl = new PackageURL(type, namespace, name, version, qualifiers, subpath);
168+
169+
assertEquals(cpurlString, purl.canonicalize());
170+
assertEquals("pkg", purl.getScheme());
171+
assertEquals(type, purl.getType());
172+
assertEquals(namespace, purl.getNamespace());
173+
assertEquals(name, purl.getName());
174+
assertEquals(version, purl.getVersion());
175+
assertEquals(qualifiers, purl.getQualifiers());
176+
assertEquals(subpath, purl.getSubpath());
211177
}
212178

213179
@Test

0 commit comments

Comments
 (0)