11import org.junit.jupiter.api.Test
2+ import org.junit.jupiter.api.extension.ExtensionContext
3+ import org.junit.jupiter.params.ParameterizedTest
4+ import org.junit.jupiter.params.provider.Arguments
5+ import org.junit.jupiter.params.provider.ArgumentsProvider
26import java.awt.Toolkit
37import java.awt.datatransfer.StringSelection
48import java.io.File
59import java.util.*
10+ import java.util.stream.Stream
611import kotlin.time.ExperimentalTime
712import kotlin.time.measureTimedValue
813
@@ -42,9 +47,36 @@ abstract class Day {
4247 Toolkit .getDefaultToolkit().systemClipboard.setContents(StringSelection (data), null )
4348 }
4449
50+
4551 @Test
4652 fun part1 (): Unit = solve(" part1.txt" , null , ::part1)
4753
4854 @Test
4955 fun part2 (): Unit = solve(" part2.txt" , " part1.txt" , ::part2)
56+
57+ /* *
58+ * [Lines] provider for JUnit [ParameterizedTest].
59+ * It reads the file named `{test_method_name}.txt` placed in the same directory as the test class.
60+ *
61+ * Usage:
62+ * ```kotlin
63+ * @ParameterizedTest
64+ * @ArgumentsSource(LinesSource::class)
65+ * fun part1(input: Lines) {}
66+ * ```
67+ */
68+ class LinesSource : ArgumentsProvider {
69+ private fun Class <* >.readInput (inputFileName : String ) =
70+ this ::class .java.getResource(inputFileName)?.toURI()?.let (::File )?.takeIf { it.length() > 0 }
71+
72+ override fun provideArguments (context : ExtensionContext ): Stream <out Arguments > {
73+ val clazz = context.testClass.get()
74+ val method = context.testMethod.get()
75+ val input = clazz.readInput(" ${method.name} .txt" )
76+ ? : clazz.readInput(" ${method.name} .txt" .replace(" 2" , " 1" ))
77+ ? : error(" ${method.name} .txt not found" )
78+ return Stream .of(Arguments .of(input.readLines()))
79+ }
80+
81+ }
5082}
0 commit comments