Skip to content

Commit e6de1c9

Browse files
committed
Fix javac version parsing for version strings without minorv and add tests
1 parent b689dfb commit e6de1c9

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

src/main/kotlin/com/tschuchort/compiletesting/JavacUtils.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package com.tschuchort.compiletesting
22

33
import okio.Buffer
44
import java.io.*
5-
import java.lang.IllegalArgumentException
65
import java.net.URI
76
import java.nio.charset.Charset
87
import javax.tools.JavaCompiler
98
import javax.tools.JavaFileObject
109
import javax.tools.SimpleJavaFileObject
10+
import kotlin.IllegalArgumentException
1111

1212
/**
1313
* A [JavaFileObject] created from a source [File].
@@ -81,12 +81,22 @@ internal fun getJavacVersionString(javacCommand: String): String {
8181
}
8282

8383
internal fun isJavac9OrLater(javacVersionString: String): Boolean {
84-
val (majorv, minorv, patchv, otherv) = Regex("([0-9]*)\\.([0-9]*)\\.([0-9]*)(.*)")
85-
.matchEntire(javacVersionString)?.destructured
86-
?: throw IllegalArgumentException("Could not parse javac version string: '$javacVersionString'")
84+
try {
85+
val (majorv, minorv, patchv, otherv) = Regex("([0-9]*)(?:\\.([0-9]*))?(?:\\.([0-9]*))?(.*)")
86+
.matchEntire(javacVersionString)?.destructured
87+
?: throw IllegalArgumentException("Could not match version regex")
8788

88-
return (majorv.toInt() == 1 && minorv.toInt() >= 9) // old versioning scheme: 1.8.x
89-
|| (majorv.toInt() >= 9) // new versioning scheme: 10.x.x
89+
check(majorv.isNotBlank()) { "Major version can not be blank" }
90+
91+
if (majorv.toInt() == 1)
92+
check(minorv.isNotBlank()) { "Minor version can not be blank if major version is 1" }
93+
94+
return (majorv.toInt() == 1 && minorv.toInt() >= 9) // old versioning scheme: 1.8.x
95+
|| (majorv.toInt() >= 9) // new versioning scheme: 10.x.x
96+
}
97+
catch (t: Throwable) {
98+
throw IllegalArgumentException("Could not parse javac version string: '$javacVersionString'", t)
99+
}
90100
}
91101

92102
/** Finds the tools.jar given a path to a JDK 8 or earlier */
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.tschuchort.compiletesting
2+
3+
import org.junit.Assert.assertFalse
4+
import org.junit.Assert.assertTrue
5+
import org.junit.Test
6+
7+
class JavacUtilsTest {
8+
9+
@Test
10+
fun `Old version scheme less than 9 is parsed correctly`() {
11+
assertFalse(isJavac9OrLater("1.8.0"))
12+
}
13+
14+
@Test
15+
fun `Old version scheme greater equal 9 is parsed correctly`() {
16+
assertTrue(isJavac9OrLater("1.9.1"))
17+
assertTrue(isJavac9OrLater("1.11.0"))
18+
}
19+
20+
@Test
21+
fun `New version scheme less than 9 is parsed correctly`() {
22+
assertFalse(isJavac9OrLater("8.1.0.1"))
23+
assertFalse(isJavac9OrLater("8.1.0"))
24+
assertFalse(isJavac9OrLater("8.1"))
25+
assertFalse(isJavac9OrLater("8"))
26+
}
27+
28+
@Test
29+
fun `New version scheme greater equal 9 is parsed correctly`() {
30+
assertTrue(isJavac9OrLater("9.0.0.1"))
31+
assertTrue(isJavac9OrLater("9.0.0"))
32+
assertTrue(isJavac9OrLater("9.1.0"))
33+
assertTrue(isJavac9OrLater("9.1"))
34+
assertTrue(isJavac9OrLater("9"))
35+
assertTrue(isJavac9OrLater("12"))
36+
}
37+
38+
@Test
39+
fun `Old version scheme with extra info is parsed correctly`() {
40+
assertTrue(isJavac9OrLater("1.11.0-bla"))
41+
}
42+
}

0 commit comments

Comments
 (0)