Skip to content

Commit f1772ea

Browse files
committed
Rename test utility parameterizedTest -> runTestCases
1 parent dc3a16d commit f1772ea

File tree

6 files changed

+47
-46
lines changed

6 files changed

+47
-46
lines changed

src/commonTest/kotlin/dev/hermannm/devlog/LogFieldTest.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package dev.hermannm.devlog
33
import dev.hermannm.devlog.testutils.Event
44
import dev.hermannm.devlog.testutils.EventType
55
import dev.hermannm.devlog.testutils.captureLogOutput
6-
import dev.hermannm.devlog.testutils.parameterizedTest
6+
import dev.hermannm.devlog.testutils.runTestCases
77
import io.kotest.assertions.withClue
88
import io.kotest.matchers.booleans.shouldBeFalse
99
import io.kotest.matchers.booleans.shouldBeTrue
@@ -24,8 +24,8 @@ private val log = getLogger()
2424
* - The [LogBuilder.field] method, which constructs the field in-place on the log event
2525
*
2626
* We want to test both of these, with a variety of different inputs. To do this systematically, we
27-
* make each log field test a parameterized test (see [parameterizedTest]), so every test runs with
28-
* both ways of creating log fields.
27+
* make each log field test a parameterized test (see [runTestCases]), so every test runs with both
28+
* ways of creating log fields.
2929
*/
3030
internal enum class LogFieldTestCase {
3131
LOGBUILDER_METHOD,
@@ -86,7 +86,7 @@ internal enum class RawJsonTestCase {
8686
internal class LogFieldTest {
8787
@Test
8888
fun `basic log field test`() {
89-
parameterizedTest(LogFieldTestCase.entries) { test ->
89+
runTestCases(LogFieldTestCase.entries) { test ->
9090
val output = captureLogOutput {
9191
log.info {
9292
test.addField(this, "key", "value")
@@ -104,7 +104,7 @@ internal class LogFieldTest {
104104

105105
@Test
106106
fun `log field with Serializable object`() {
107-
parameterizedTest(LogFieldTestCase.entries) { test ->
107+
runTestCases(LogFieldTestCase.entries) { test ->
108108
val event = Event(id = 1000, type = EventType.ORDER_PLACED)
109109

110110
val output = captureLogOutput {
@@ -124,7 +124,7 @@ internal class LogFieldTest {
124124

125125
@Test
126126
fun `multiple log fields`() {
127-
parameterizedTest(LogFieldTestCase.entries) { test ->
127+
runTestCases(LogFieldTestCase.entries) { test ->
128128
val output = captureLogOutput {
129129
log.info {
130130
test.addField(this, "first", true)
@@ -144,7 +144,7 @@ internal class LogFieldTest {
144144

145145
@Test
146146
fun `explicit serializer`() {
147-
parameterizedTest(LogFieldTestCase.entries) { test ->
147+
runTestCases(LogFieldTestCase.entries) { test ->
148148
val prefixSerializer =
149149
object : SerializationStrategy<String> {
150150
override val descriptor = String.serializer().descriptor
@@ -177,7 +177,7 @@ internal class LogFieldTest {
177177
*/
178178
@Test
179179
fun `explicit serializer with nullable value`() {
180-
parameterizedTest(LogFieldTestCase.entries) { test ->
180+
runTestCases(LogFieldTestCase.entries) { test ->
181181
val event: Event? = null
182182

183183
val output = captureLogOutput {
@@ -197,7 +197,7 @@ internal class LogFieldTest {
197197

198198
@Test
199199
fun `explicit serializer falls back to toString on exception`() {
200-
parameterizedTest(LogFieldTestCase.entries) { test ->
200+
runTestCases(LogFieldTestCase.entries) { test ->
201201
val alwaysFailingSerializer =
202202
object : SerializationStrategy<Event> {
203203
override val descriptor = Event.serializer().descriptor
@@ -231,7 +231,7 @@ internal class LogFieldTest {
231231
*/
232232
@Test
233233
fun `explicit serializer with nullable value does not call serializer`() {
234-
parameterizedTest(LogFieldTestCase.entries) { test ->
234+
runTestCases(LogFieldTestCase.entries) { test ->
235235
val alwaysFailingSerializer =
236236
object : SerializationStrategy<String> {
237237
override val descriptor = String.serializer().descriptor
@@ -269,7 +269,7 @@ internal class LogFieldTest {
269269
*/
270270
@Test
271271
fun `custom serializer without reified type parameter`() {
272-
parameterizedTest(LogFieldTestCase.entries) { test ->
272+
runTestCases(LogFieldTestCase.entries) { test ->
273273
fun <T> genericLogFunction(obj: T, serializer: SerializationStrategy<T>) {
274274
log.info {
275275
test.addFieldWithSerializer(this, "object", obj, serializer)
@@ -291,7 +291,7 @@ internal class LogFieldTest {
291291

292292
@Test
293293
fun `non-serializable object falls back to toString`() {
294-
parameterizedTest(LogFieldTestCase.entries) { test ->
294+
runTestCases(LogFieldTestCase.entries) { test ->
295295
data class NonSerializableEvent(val id: Long, val type: String)
296296

297297
val event = NonSerializableEvent(id = 1000, type = "ORDER_UPDATED")
@@ -313,7 +313,7 @@ internal class LogFieldTest {
313313

314314
@Test
315315
fun `duplicate field keys only includes the first field`() {
316-
parameterizedTest(LogFieldTestCase.entries) { test ->
316+
runTestCases(LogFieldTestCase.entries) { test ->
317317
val output = captureLogOutput {
318318
log.info {
319319
test.addField(this, "duplicateKey", "value1")
@@ -333,7 +333,7 @@ internal class LogFieldTest {
333333

334334
@Test
335335
fun `null field value is allowed`() {
336-
parameterizedTest(LogFieldTestCase.entries) { test ->
336+
runTestCases(LogFieldTestCase.entries) { test ->
337337
val nullValue: String? = null
338338

339339
val output = captureLogOutput {
@@ -353,7 +353,7 @@ internal class LogFieldTest {
353353

354354
@Test
355355
fun `raw JSON field works for valid JSON`() {
356-
parameterizedTest(RawJsonTestCase.entries) { test ->
356+
runTestCases(RawJsonTestCase.entries) { test ->
357357
val eventJson = """{"id":1000,"type":"ORDER_UPDATED"}"""
358358

359359
// The above JSON should work both for validJson = true and validJson = false
@@ -378,7 +378,7 @@ internal class LogFieldTest {
378378

379379
@Test
380380
fun `raw JSON field escapes invalid JSON by default`() {
381-
parameterizedTest(RawJsonTestCase.entries) { test ->
381+
runTestCases(RawJsonTestCase.entries) { test ->
382382
val invalidJson = """{"id":1"""
383383

384384
val output = captureLogOutput {
@@ -403,7 +403,7 @@ internal class LogFieldTest {
403403
*/
404404
@Test
405405
fun `raw JSON field does not escape invalid JSON when validJson is set to true`() {
406-
parameterizedTest(RawJsonTestCase.entries) { test ->
406+
runTestCases(RawJsonTestCase.entries) { test ->
407407
val invalidJson = """{"id":1"""
408408

409409
val output = captureLogOutput {
@@ -423,7 +423,7 @@ internal class LogFieldTest {
423423

424424
@Test
425425
fun `raw JSON field re-encodes JSON when it contains newlines`() {
426-
parameterizedTest(RawJsonTestCase.entries) { test ->
426+
runTestCases(RawJsonTestCase.entries) { test ->
427427
val jsonWithNewlines =
428428
"""
429429
{
@@ -486,7 +486,7 @@ internal class LogFieldTest {
486486

487487
@Test
488488
fun `validateRawJson accepts valid JSON`() {
489-
parameterizedTest(validJsonTestCases) { validJson ->
489+
runTestCases(validJsonTestCases) { validJson ->
490490
val isValid: Boolean =
491491
validateRawJson(
492492
validJson,
@@ -514,7 +514,7 @@ internal class LogFieldTest {
514514

515515
@Test
516516
fun `validateRawJson rejects invalid JSON`() {
517-
parameterizedTest(invalidJsonTestCases) { invalidJson ->
517+
runTestCases(invalidJsonTestCases) { invalidJson ->
518518
val isValid: Boolean =
519519
validateRawJson(
520520
invalidJson,

src/commonTest/kotlin/dev/hermannm/devlog/LoggerTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import dev.hermannm.devlog.testutils.Event
66
import dev.hermannm.devlog.testutils.EventType
77
import dev.hermannm.devlog.testutils.TestCase
88
import dev.hermannm.devlog.testutils.loggerInOtherFile
9-
import dev.hermannm.devlog.testutils.parameterizedTest
9+
import dev.hermannm.devlog.testutils.runTestCases
1010
import io.kotest.matchers.booleans.shouldBeFalse
1111
import io.kotest.matchers.booleans.shouldBeTrue
1212
import io.kotest.matchers.nulls.shouldNotBeNull
@@ -83,7 +83,7 @@ internal class LoggerTest {
8383

8484
@Test
8585
fun `info log`() {
86-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
86+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
8787
test.verifyLogOutput(expectedLogLevel = LogLevel.INFO) {
8888
test.logger.info(cause = TestInput.CAUSE) {
8989
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -96,7 +96,7 @@ internal class LoggerTest {
9696

9797
@Test
9898
fun `warn log`() {
99-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
99+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
100100
test.verifyLogOutput(expectedLogLevel = LogLevel.WARN) {
101101
test.logger.warn(cause = TestInput.CAUSE) {
102102
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -109,7 +109,7 @@ internal class LoggerTest {
109109

110110
@Test
111111
fun `error log`() {
112-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
112+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
113113
test.verifyLogOutput(expectedLogLevel = LogLevel.ERROR) {
114114
test.logger.error(cause = TestInput.CAUSE) {
115115
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -122,7 +122,7 @@ internal class LoggerTest {
122122

123123
@Test
124124
fun `debug log`() {
125-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
125+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
126126
test.verifyLogOutput(expectedLogLevel = LogLevel.DEBUG) {
127127
test.logger.debug(cause = TestInput.CAUSE) {
128128
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -135,7 +135,7 @@ internal class LoggerTest {
135135

136136
@Test
137137
fun `trace log`() {
138-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
138+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
139139
test.verifyLogOutput(expectedLogLevel = LogLevel.TRACE) {
140140
test.logger.trace(cause = TestInput.CAUSE) {
141141
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -148,7 +148,7 @@ internal class LoggerTest {
148148

149149
@Test
150150
fun `info log using 'at' method`() {
151-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
151+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
152152
test.verifyLogOutput(expectedLogLevel = LogLevel.INFO) {
153153
test.logger.at(LogLevel.INFO, cause = TestInput.CAUSE) {
154154
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -161,7 +161,7 @@ internal class LoggerTest {
161161

162162
@Test
163163
fun `warn log using 'at' method`() {
164-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
164+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
165165
test.verifyLogOutput(expectedLogLevel = LogLevel.WARN) {
166166
test.logger.at(LogLevel.WARN, cause = TestInput.CAUSE) {
167167
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -174,7 +174,7 @@ internal class LoggerTest {
174174

175175
@Test
176176
fun `error log using 'at' method`() {
177-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
177+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
178178
test.verifyLogOutput(expectedLogLevel = LogLevel.ERROR) {
179179
test.logger.at(LogLevel.ERROR, cause = TestInput.CAUSE) {
180180
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -187,7 +187,7 @@ internal class LoggerTest {
187187

188188
@Test
189189
fun `debug log using 'at' method`() {
190-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
190+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
191191
test.verifyLogOutput(expectedLogLevel = LogLevel.DEBUG) {
192192
test.logger.at(LogLevel.DEBUG, cause = TestInput.CAUSE) {
193193
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -200,7 +200,7 @@ internal class LoggerTest {
200200

201201
@Test
202202
fun `trace log using 'at' method`() {
203-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
203+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
204204
test.verifyLogOutput(expectedLogLevel = LogLevel.TRACE) {
205205
test.logger.at(LogLevel.TRACE, cause = TestInput.CAUSE) {
206206
field(TestInput.FIELD_KEY_1, TestInput.FIELD_VALUE_1)
@@ -217,7 +217,7 @@ internal class LoggerTest {
217217
*/
218218
@Test
219219
fun `log with no fields or exceptions`() {
220-
parameterizedTest(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
220+
runTestCases(loggerTestCases, afterEach = ::resetLoggerTest) { test ->
221221
val updatedTest =
222222
test.copy(
223223
expectedMessage = "Test",

src/commonTest/kotlin/dev/hermannm/devlog/testutils/ParameterizedTest.kt renamed to src/commonTest/kotlin/dev/hermannm/devlog/testutils/TestCases.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import io.kotest.assertions.withClue
99
* If a test case implements [TestCase], then [TestCase.name] will be used - otherwise, the
1010
* `toString` representation of the test case is used.
1111
*/
12-
internal inline fun <TestCaseT> parameterizedTest(
12+
internal inline fun <TestCaseT> runTestCases(
1313
testCases: Iterable<TestCaseT>,
14-
beforeEach: () -> Unit = {},
15-
afterEach: () -> Unit = {},
16-
test: (TestCaseT) -> Unit
14+
// `crossinline` to prevent early returns, which would cancel later test cases
15+
crossinline beforeEach: () -> Unit = {},
16+
crossinline afterEach: () -> Unit = {},
17+
crossinline test: (TestCaseT) -> Unit
1718
) {
1819
for ((index, testCase) in testCases.withIndex()) {
1920
beforeEach()
@@ -33,8 +34,8 @@ internal inline fun <TestCaseT> parameterizedTest(
3334
}
3435

3536
/**
36-
* When passed to [parameterizedTest], [name] will be used instead of `toString` to print failing
37-
* test cases.
37+
* When passed to [runTestCases], [name] will be used instead of `toString` to print failing test
38+
* cases.
3839
*/
3940
internal interface TestCase {
4041
val name: String

src/jvmTest/kotlin/dev/hermannm/devlog/LogFieldTest.jvm.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dev.hermannm.devlog
22

33
import com.fasterxml.jackson.databind.ObjectMapper
44
import dev.hermannm.devlog.testutils.captureLogOutput
5-
import dev.hermannm.devlog.testutils.parameterizedTest
5+
import dev.hermannm.devlog.testutils.runTestCases
66
import io.kotest.matchers.shouldBe
77
import io.kotest.matchers.string.shouldContain
88
import io.kotest.matchers.types.shouldBeInstanceOf
@@ -18,7 +18,7 @@ private val log = getLogger()
1818
internal class LogFieldJvmTest {
1919
@Test
2020
fun `special-case types`() {
21-
parameterizedTest(LogFieldTestCase.entries) { test ->
21+
runTestCases(LogFieldTestCase.entries) { test ->
2222
val output = captureLogOutput {
2323
log.info {
2424
test.addField(this, "instant", Instant.parse("2024-12-09T16:38:23Z"))

src/jvmTest/kotlin/dev/hermannm/devlog/LoggerTest.jvm.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import ch.qos.logback.core.read.ListAppender
88
import dev.hermannm.devlog.testutils.EventAwareSlf4jLogger
99
import dev.hermannm.devlog.testutils.LocationAwareSlf4jLogger
1010
import dev.hermannm.devlog.testutils.PlainSlf4jLogger
11-
import dev.hermannm.devlog.testutils.parameterizedTest
11+
import dev.hermannm.devlog.testutils.runTestCases
1212
import io.kotest.matchers.collections.shouldContainExactly
1313
import io.kotest.matchers.collections.shouldHaveSize
1414
import io.kotest.matchers.collections.shouldNotBeEmpty
@@ -124,7 +124,7 @@ internal class LoggerJvmTest {
124124

125125
@Test
126126
fun `log has expected file location`() {
127-
parameterizedTest(loggerTestCases, afterEach = ::reset) { test ->
127+
runTestCases(loggerTestCases, afterEach = ::reset) { test ->
128128
test.logger.info { "Test" }
129129

130130
logAppender.list shouldHaveSize 1

src/jvmTest/kotlin/dev/hermannm/devlog/LoggingContextTest.jvm.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import dev.hermannm.devlog.testutils.TestCase
66
import dev.hermannm.devlog.testutils.captureLogOutput
77
import dev.hermannm.devlog.testutils.loggingContextShouldBeEmpty
88
import dev.hermannm.devlog.testutils.loggingContextShouldContainExactly
9-
import dev.hermannm.devlog.testutils.parameterizedTest
9+
import dev.hermannm.devlog.testutils.runTestCases
1010
import io.kotest.matchers.booleans.shouldBeTrue
1111
import io.kotest.matchers.maps.shouldContainExactly
1212
import java.util.concurrent.Callable
@@ -74,7 +74,7 @@ internal class LoggingContextJvmTest {
7474
/**
7575
* [inheritLoggingContext] wraps an [ExecutorService], forwarding calls to the wrapped executor.
7676
* We want to verify that all these methods forward appropriately, so we make a test case for each
77-
* executor method, and run [parameterizedTest] in our executor tests to run each test on every
77+
* executor method, and run [runTestCases] in our executor tests to run each test on every
7878
* executor method.
7979
*/
8080
class ExecutorTestCase(
@@ -115,7 +115,7 @@ internal class LoggingContextJvmTest {
115115

116116
@Test
117117
fun `ExecutorService with inheritLoggingContext allows passing logging context between threads`() {
118-
parameterizedTest(executorTestCases) { test ->
118+
runTestCases(executorTestCases) { test ->
119119
val executor = Executors.newSingleThreadExecutor().inheritLoggingContext()
120120
val lock = ReentrantLock()
121121
val latch = CountDownLatch(1) // Used to wait for the child thread to complete its log
@@ -149,7 +149,7 @@ internal class LoggingContextJvmTest {
149149
*/
150150
@Test
151151
fun `ExecutorService with inheritLoggingContext works when there are no fields in the context`() {
152-
parameterizedTest(executorTestCases) { test ->
152+
runTestCases(executorTestCases) { test ->
153153
val executor = Executors.newSingleThreadExecutor().inheritLoggingContext()
154154

155155
// Verify that there are no fields in parent thread context

0 commit comments

Comments
 (0)