diff --git a/2021/src/test/kotlin/BaseDayTest.kt b/2021/src/test/kotlin/BaseDayTest.kt new file mode 100644 index 0000000..472d7af --- /dev/null +++ b/2021/src/test/kotlin/BaseDayTest.kt @@ -0,0 +1,65 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.factory.findDayDefinition +import be.vandewalleh.aoc.utils.factory.registerExampleLoader +import io.micronaut.context.BeanContext +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.AfterAll +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +abstract class BaseDayTest(day: Int) { + + abstract val example: String + + abstract val part1Example: Any + abstract val part2Example: Any + + abstract val part1Answer: Any + abstract val part2Answer: Any + + private val ctx = lazy { + BeanContext.run() + } + + val instance: Any by lazy { ctx.value.getBean(ctx.value.findDayDefinition(day)) } + + + private val exampleCtx = lazy { + BeanContext.build() + .apply { registerExampleLoader(example) } + .start() + } + + val exampleInstance: Any by lazy { exampleCtx.value.getBean(exampleCtx.value.findDayDefinition(day)) } + + @AfterAll + fun `after all`() { + arrayOf(ctx, exampleCtx).filter { it.isInitialized() }.forEach { it.value.stop() } + } + + private fun BeanContext.run(instance: Any, method: String) = + findExecutionHandle(instance, method).get().invoke() + + @Test + fun `part1 example result`() { + Assertions.assertThat(ctx.value.run(exampleInstance, "part1")).isEqualTo(part1Example) + } + + @Test + fun `part1 result`() { + Assertions.assertThat(ctx.value.run(instance, "part1")).isEqualTo(part1Answer) + } + + @Test + fun `part2 example result`() { + Assertions.assertThat(ctx.value.run(exampleInstance, "part2")).isEqualTo(part2Example) + } + + @Test + fun `part2 result`() { + Assertions.assertThat(ctx.value.run(instance, "part2")).isEqualTo(part2Answer) + } + +} diff --git a/2021/src/test/kotlin/Day01Test.kt b/2021/src/test/kotlin/Day01Test.kt new file mode 100644 index 0000000..9340260 --- /dev/null +++ b/2021/src/test/kotlin/Day01Test.kt @@ -0,0 +1,22 @@ +package be.vandewalleh.aoc.days + +class Day01Test : BaseDayTest(1) { + override val example = """ + 199 + 200 + 208 + 210 + 200 + 207 + 240 + 269 + 260 + 263 + """.trimIndent() + + override val part1Example = 7 + override val part2Example = 5 + + override val part1Answer = 1559 + override val part2Answer = 1600 +} diff --git a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt index 87da20d..6515f0d 100644 --- a/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt +++ b/utils/src/main/kotlin/be/vandewalleh/aoc/utils/factory/DayFactory.kt @@ -15,7 +15,7 @@ fun BeanContext.findDayDefinition(day: Int): BeanDefinition<*>? = allBeanDefinit inline fun createDay() = createDay(T::class.java) // A custom resourceLoader that returns a string should be more appropriate but ¯\_(ツ)_/¯ -private fun BeanContext.registerExampleLoader(example: String) { +fun BeanContext.registerExampleLoader(example: String) { registerSingleton(TempFileResourceLoader(File.createTempFile("aoc-example", ".txt").apply { writeText(example) }))