Skip to content

Commit d4e666c

Browse files
authored
Merge pull request #83 from jsonschema2dataclass/test-split
Split test class to file to tests, generator and utility functions
2 parents 5dc3b36 + fc29fc8 commit d4e666c

File tree

3 files changed

+177
-165
lines changed

3 files changed

+177
-165
lines changed

src/test/groovy/com/github/eirnym/js2p/JavaTaskFunctionalTest.groovy

+13-165
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,47 @@
11
package com.github.eirnym.js2p
22

3-
import org.gradle.testkit.runner.BuildResult
4-
import org.gradle.testkit.runner.GradleRunner
53
import org.gradle.testkit.runner.TaskOutcome
6-
import org.junit.jupiter.api.BeforeEach
74
import org.junit.jupiter.api.DisplayName
85
import org.junit.jupiter.api.io.TempDir
96
import org.junit.jupiter.params.ParameterizedTest
107
import org.junit.jupiter.params.provider.Arguments
118
import org.junit.jupiter.params.provider.MethodSource
129
import org.junit.jupiter.params.provider.NullSource
1310

14-
import java.nio.file.Files
1511
import java.nio.file.Path
16-
import java.nio.file.Paths
1712
import java.util.stream.Stream
1813

1914
import static com.github.eirnym.js2p.JsonSchemaPlugin.DEFAULT_EXECUTION_NAME
20-
import static com.github.eirnym.js2p.JsonSchemaPlugin.TASK_NAME
2115
import static com.github.eirnym.js2p.JsonSchemaPlugin.TARGET_FOLDER_BASE
22-
import static com.github.eirnym.js2p.JsonSchemaPlugin.PLUGIN_ID
16+
17+
import static com.github.eirnym.js2p.TestCasesGenerator.*
18+
import static com.github.eirnym.js2p.TestUtils.*
2319

2420
import static org.junit.jupiter.api.Assertions.*
2521

2622
class JavaTaskFunctionalTest {
27-
private static final String COLON_TASK_NAME = ':' + TASK_NAME
2823
private static final String COLON_TASK_NAME0 = COLON_TASK_NAME + '0'
2924
private static final String COLON_TASK_NAME1 = COLON_TASK_NAME + '1'
3025

31-
private static final String TARGET_FOLDER_BASE_CUSTOM = TARGET_FOLDER_BASE + 's'
32-
33-
private static final String TARGET_FOLDER_CUSTOM = 'build/'+ TARGET_FOLDER_BASE_CUSTOM
34-
private static final String TARGET_FOLDER_DEFAULT = 'build/'+ TARGET_FOLDER_BASE
26+
private static final String TARGET_FOLDER_CUSTOM = 'build/' + TARGET_FOLDER_BASE_CUSTOM
27+
private static final String TARGET_FOLDER_DEFAULT = 'build/' + TARGET_FOLDER_BASE
3528
private static final String PACKAGE_EMPTY = ''
3629

3730
private static final String EXECUTION_NAME_COM = 'com'
3831
private static final String PACKAGE_COM_EXAMPLE = 'com/example'
3932

4033
private static final String EXECUTION_NAME_ORG = 'org'
4134
private static final String PACKAGE_ORG_EXAMPLE = 'org/example'
42-
private static final List<String> GRADLE_RELEASES = [
43-
'6.8.3', '6.8', '6.7.1', '6.6.1', '6.5.1', '6.4.1', '6.3', '6.2.2', '6.2.1', '6.1.1', '6.0.1', // 6.x
44-
]
4535

4636
@TempDir
4737
public Path testProjectDir
48-
private Path buildFile
49-
50-
@BeforeEach
51-
void setup() throws IOException {
52-
buildFile = testProjectDir.resolve("build.gradle")
53-
}
5438

5539
@ParameterizedTest(name = "{displayName} [{index}] {argumentsWithNames}")
5640
@NullSource
5741
@MethodSource('gradleReleases')
5842
@DisplayName("single execution, no extension")
5943
void withoutExtension(String gradleVersion) {
60-
createBuildFilesSingleNoExtension()
61-
copyAddressJSON()
44+
createBuildFilesSingleNoExtension(testProjectDir, true)
6245

6346
def result = executeRunner(gradleVersion, testProjectDir)
6447

@@ -75,8 +58,7 @@ class JavaTaskFunctionalTest {
7558
@MethodSource('gradleReleases')
7659
@DisplayName("single execution")
7760
void singleExtension(String gradleVersion) {
78-
createBuildFilesSingle()
79-
copyAddressJSON()
61+
createBuildFilesSingle(testProjectDir, true)
8062

8163
def result = executeRunner(gradleVersion, testProjectDir)
8264

@@ -92,8 +74,7 @@ class JavaTaskFunctionalTest {
9274
@MethodSource('gradleReleases')
9375
@DisplayName("single execution")
9476
void singleExtensionInherited(String gradleVersion) {
95-
createBuildFilesSingleSourceInherit()
96-
copyAddressJSON()
77+
createBuildFilesSingleSourceInherit(testProjectDir, true)
9778

9879
def result = executeRunner(gradleVersion, testProjectDir)
9980

@@ -110,8 +91,7 @@ class JavaTaskFunctionalTest {
11091
@MethodSource('gradleReleases')
11192
@DisplayName("single execution")
11293
void singleExtensionSimple(String gradleVersion) {
113-
createBuildFilesSingleSimple()
114-
copyAddressJSON()
94+
createBuildFilesSingleSimple(testProjectDir, true)
11595

11696
def result = executeRunner(gradleVersion, testProjectDir)
11797

@@ -129,9 +109,7 @@ class JavaTaskFunctionalTest {
129109
@MethodSource('gradleReleases')
130110
@DisplayName("multiple executions")
131111
void multipleExecutions(String gradleVersion) {
132-
createBuildFilesMultiple()
133-
134-
copyAddressJSON()
112+
createBuildFilesMultiple(testProjectDir, true)
135113

136114
def result = executeRunner(gradleVersion, testProjectDir, COLON_TASK_NAME)
137115
assertEquals(TaskOutcome.SUCCESS, result.task(COLON_TASK_NAME0).outcome)
@@ -154,8 +132,7 @@ class JavaTaskFunctionalTest {
154132
@MethodSource('gradleReleases')
155133
@DisplayName("compileJava task depends task even when project has no java code")
156134
void noJavaCode(String gradleVersion) {
157-
createBuildFilesSingle()
158-
copyAddressJSON()
135+
createBuildFilesSingle(testProjectDir, true)
159136

160137
def result = executeRunner(gradleVersion, testProjectDir, "compileJava")
161138

@@ -167,11 +144,9 @@ class JavaTaskFunctionalTest {
167144
@MethodSource('gradleReleases')
168145
@DisplayName('task is cache-able')
169146
void taskIsCachable(String gradleVersion) {
170-
createBuildFilesSingle()
171-
copyAddressJSON()
147+
createBuildFilesSingle(testProjectDir, true)
172148

173149
// Run our task twice to be sure that results has been cached
174-
175150
executeRunner(gradleVersion, testProjectDir)
176151
def result = executeRunner(gradleVersion, testProjectDir)
177152

@@ -183,140 +158,13 @@ class JavaTaskFunctionalTest {
183158
@MethodSource('gradleReleases')
184159
@DisplayName('task skips if no json file exists')
185160
void noJsonFiles(String gradleVersion) {
186-
createBuildFilesSingle()
161+
createBuildFilesSingle(testProjectDir, false)
187162

188163
def result = executeRunner(gradleVersion, testProjectDir)
189164

190165
assertEquals(TaskOutcome.NO_SOURCE, result.task(COLON_TASK_NAME0).outcome)
191166
}
192167

193-
private static final BUILD_FILE_HEADER = """|plugins {
194-
| id 'java'
195-
| id '${PLUGIN_ID}' version '1.2.3'
196-
|}
197-
|repositories {
198-
| mavenCentral()
199-
|}
200-
|dependencies {
201-
| implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.2'
202-
|}"""
203-
204-
private void createBuildFilesSingleSimple() {
205-
Files.write(buildFile, (BUILD_FILE_HEADER + """
206-
|jsonSchema2Pojo{
207-
| targetPackage = 'com.example'
208-
|}
209-
|""").stripMargin().bytes)
210-
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
211-
}
212-
213-
private void createBuildFilesSingleNoExtension() {
214-
Files.write(buildFile, BUILD_FILE_HEADER.stripMargin().bytes)
215-
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
216-
}
217-
218-
/**
219-
* Multiple executions
220-
*/
221-
private void createBuildFilesMultiple() {
222-
Files.write(buildFile, (BUILD_FILE_HEADER + """
223-
|jsonSchema2Pojo{
224-
| targetDirectoryPrefix = project.file("\${buildDir}/${TARGET_FOLDER_BASE_CUSTOM}")
225-
| executions {
226-
| com{
227-
| targetPackage = 'com.example'
228-
| }
229-
| org{
230-
| targetPackage = 'org.example'
231-
| }
232-
| }
233-
|}
234-
|""").stripMargin().bytes)
235-
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
236-
}
237-
238-
/**
239-
* Single with execution
240-
*/
241-
private void createBuildFilesSingle() {
242-
Files.write(buildFile, (BUILD_FILE_HEADER + '''
243-
|jsonSchema2Pojo{
244-
| executions {
245-
| com{
246-
| source.setFrom files("${project.rootDir}/src/main/resources/json")
247-
| targetPackage = 'com.example'
248-
| }
249-
| }
250-
|}
251-
|''').stripMargin().bytes)
252-
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
253-
}
254-
/**
255-
* Single with execution, inherited
256-
*/
257-
private void createBuildFilesSingleSourceInherit() {
258-
Files.write(buildFile, (BUILD_FILE_HEADER + '''
259-
|jsonSchema2Pojo{
260-
| source.setFrom files("${project.rootDir}/src/main/resources/json")
261-
| executions {
262-
| com{
263-
| targetPackage = 'com.example'
264-
| }
265-
| }
266-
|}
267-
|''').stripMargin().bytes)
268-
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
269-
}
270-
271-
private void copyAddressJSON() {
272-
Path jsonDir = testProjectDir.resolve('src/main/resources/json')
273-
new File(jsonDir.toString()).mkdirs()
274-
def addressJson = jsonDir.resolve("address.json")
275-
Files.copy(Paths.get("demo", "java", "src", "main", "resources", "json", "address.json"), addressJson)
276-
}
277-
278-
private static void assertExists(File file) {
279-
assertNotNull(file)
280-
assertTrue(file.exists())
281-
}
282-
283-
private static void addressJavaExists(Path testProjectDir, String targetDirectoryPrefix, String executionName, String subfolder) {
284-
def js2pDir = testProjectDir.resolve(targetDirectoryPrefix).resolve(executionName).resolve(subfolder)
285-
assertExists(js2pDir.toFile())
286-
assertExists(js2pDir.resolve("Address.java").toFile())
287-
}
288-
289-
private static BuildResult executeRunner(
290-
String gradleVersion, Path testProjectDir, String task = COLON_TASK_NAME, boolean shouldFail = false) {
291-
def arguments = GradleRunner.create()
292-
.withPluginClasspath()
293-
.withProjectDir(testProjectDir.toFile())
294-
.withArguments(task, '-S', '--info')
295-
296-
if (gradleVersion) {
297-
arguments.withGradleVersion(gradleVersion)
298-
}
299-
if (shouldFail) {
300-
return arguments.buildAndFail()
301-
}
302-
return arguments.build()
303-
}
304-
305-
static boolean gradleSupported(String gradleVersion, String javaSpecificationVersion) {
306-
def javaVersion = javaSpecificationVersion.toFloat()
307-
if (javaVersion <= 13) { // this includes java '1.8' :)
308-
return true
309-
}
310-
311-
def parts = gradleVersion.split(/\./)
312-
313-
switch ((int) javaVersion) {
314-
case 14: return parts[1].toInteger() >= 3
315-
case 15: return parts[1].toInteger() >= 6
316-
default: return false // no official information on Gradle compatibility with further versions of Java
317-
}
318-
}
319-
320168
static Stream<Arguments> gradleReleases() {
321169
String javaSpecificationVersion = System.getProperty('java.specification.version')
322170
return GRADLE_RELEASES.stream().filter { it -> gradleSupported(it, javaSpecificationVersion) }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.github.eirnym.js2p
2+
3+
import java.nio.file.Files
4+
import java.nio.file.Path
5+
import java.nio.file.Paths
6+
7+
import static com.github.eirnym.js2p.JsonSchemaPlugin.PLUGIN_ID
8+
import static com.github.eirnym.js2p.JsonSchemaPlugin.TARGET_FOLDER_BASE
9+
10+
class TestCasesGenerator {
11+
public static final String TARGET_FOLDER_BASE_CUSTOM = TARGET_FOLDER_BASE + 's'
12+
13+
public static final String BUILD_FILE_HEADER = """|plugins {
14+
| id 'java'
15+
| id '${PLUGIN_ID}' version '1.2.3'
16+
|}
17+
|repositories {
18+
| mavenCentral()
19+
|}
20+
|dependencies {
21+
| implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.2'
22+
|}
23+
"""
24+
25+
private static void writeBuildFiles(Path testProjectDir, boolean shouldCopyAddressJSON, String suffix) {
26+
Files.write(testProjectDir.resolve("build.gradle"), (BUILD_FILE_HEADER + suffix).stripMargin().bytes)
27+
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
28+
if (shouldCopyAddressJSON) {
29+
copyAddressJSON(testProjectDir)
30+
}
31+
}
32+
33+
static void createBuildFilesSingleSimple(Path testProjectDir, boolean shouldCopyAddressJSON) {
34+
writeBuildFiles(testProjectDir, shouldCopyAddressJSON, """
35+
|jsonSchema2Pojo{
36+
| targetPackage = 'com.example'
37+
|}
38+
|""")
39+
}
40+
41+
static void createBuildFilesSingleNoExtension(Path testProjectDir, boolean shouldCopyAddressJSON) {
42+
writeBuildFiles(testProjectDir, shouldCopyAddressJSON, '')
43+
}
44+
45+
/**
46+
* Multiple executions
47+
*/
48+
static void createBuildFilesMultiple(Path testProjectDir, boolean shouldCopyAddressJSON) {
49+
writeBuildFiles(testProjectDir, shouldCopyAddressJSON, """
50+
|jsonSchema2Pojo{
51+
| targetDirectoryPrefix = project.file("\${buildDir}/${TARGET_FOLDER_BASE_CUSTOM}")
52+
| executions {
53+
| com{
54+
| targetPackage = 'com.example'
55+
| }
56+
| org{
57+
| targetPackage = 'org.example'
58+
| }
59+
| }
60+
|}
61+
|""")
62+
}
63+
64+
/**
65+
* Single with execution
66+
*/
67+
static void createBuildFilesSingle(Path testProjectDir, boolean shouldCopyAddressJSON) {
68+
writeBuildFiles(testProjectDir, shouldCopyAddressJSON, '''
69+
|jsonSchema2Pojo{
70+
| executions {
71+
| com{
72+
| source.setFrom files("${project.rootDir}/src/main/resources/json")
73+
| targetPackage = 'com.example'
74+
| }
75+
| }
76+
|}
77+
|''')
78+
}
79+
/**
80+
* Single with execution, inherited
81+
*/
82+
static void createBuildFilesSingleSourceInherit(Path testProjectDir, boolean shouldCopyAddressJSON) {
83+
writeBuildFiles(testProjectDir, shouldCopyAddressJSON, '''
84+
|jsonSchema2Pojo{
85+
| source.setFrom files("${project.rootDir}/src/main/resources/json")
86+
| executions {
87+
| com{
88+
| targetPackage = 'com.example'
89+
| }
90+
| }
91+
|}
92+
|''')
93+
Files.write(testProjectDir.resolve('settings.gradle'), ''.bytes)
94+
}
95+
96+
private static void copyAddressJSON(testProjectDir) {
97+
Path jsonDir = testProjectDir.resolve('src/main/resources/json')
98+
new File(jsonDir.toString()).mkdirs()
99+
def addressJson = jsonDir.resolve("address.json")
100+
Files.copy(Paths.get("demo", "java", "src", "main", "resources", "json", "address.json"), addressJson)
101+
}
102+
}

0 commit comments

Comments
 (0)