prog8/compiler/test/TestCompilerOnExamples.kt

226 lines
6.4 KiB
Kotlin
Raw Normal View History

package prog8tests.compiler
import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
2022-03-07 20:41:12 +00:00
import io.kotest.matchers.shouldNotBe
2022-03-11 18:54:30 +00:00
import prog8.code.core.ICompilationTarget
import prog8.code.target.*
2021-11-30 00:40:21 +00:00
import prog8.compiler.CompilationResult
import prog8.compiler.CompilerArguments
import prog8.compiler.compileProgram
import prog8tests.helpers.*
import java.nio.file.Path
2021-10-10 22:22:04 +00:00
import kotlin.io.path.absolute
import kotlin.io.path.exists
/**
* ATTENTION: this is just kludge!
* They are not really unit tests, but rather tests of the whole process,
* from source file loading all the way through to running 64tass.
*/
2022-06-26 16:51:03 +00:00
private val examplesDir = assumeDirectory(workingDir, "../examples")
2022-03-07 20:41:12 +00:00
private fun compileTheThing(filepath: Path, optimize: Boolean, target: ICompilationTarget): CompilationResult? {
2021-11-30 00:40:21 +00:00
val args = CompilerArguments(
filepath,
optimize,
writeAssembly = true,
warnSymbolShadowing = false,
2021-11-30 00:40:21 +00:00
quietAssembler = true,
asmListfile = false,
includeSourcelines = false,
experimentalCodegen = false,
dumpVariables = false,
dumpSymbols = false,
2023-06-26 22:27:34 +00:00
varsHighBank = null,
varsGolden = false,
slabsHighBank = null,
slabsGolden = false,
2021-11-30 00:40:21 +00:00
compilationTarget = target.name,
2023-05-30 17:08:34 +00:00
splitWordArrays = false,
breakpointCpuInstruction = null,
printAst1 = false,
printAst2 = false,
symbolDefs = emptyMap(),
2022-06-26 16:51:03 +00:00
outputDir = outputDir
2021-11-30 00:40:21 +00:00
)
return compileProgram(args)
}
private fun prepareTestFiles(source: String, optimize: Boolean, target: ICompilationTarget): Pair<String, Path> {
val searchIn = mutableListOf(examplesDir)
when (target) {
2023-06-03 19:39:34 +00:00
is C64Target -> searchIn.add(0, assumeDirectory(examplesDir, "c64"))
is Cx16Target -> searchIn.add(0, assumeDirectory(examplesDir, "cx16"))
is VMTarget -> searchIn.add(0, assumeDirectory(examplesDir, "vm"))
is C128Target -> searchIn.add(0, assumeDirectory(examplesDir, "c128"))
is AtariTarget -> searchIn.add(0, assumeDirectory(examplesDir, "atari"))
}
val filepath = searchIn.asSequence()
.map { it.resolve("$source.p8") }
.map { it.normalize().absolute() }
2022-06-26 16:51:03 +00:00
.map { workingDir.relativize(it) }
.first { it.exists() }
val displayName = "${examplesDir.relativize(filepath.absolute())}: ${target.name}, optimize=$optimize"
return Pair(displayName, filepath)
}
class TestCompilerOnExamplesC64: FunSpec({
2022-06-26 16:51:03 +00:00
val onlyC64 = cartesianProduct(
listOf(
"balloonflight",
"banking",
"bdmusic",
"bdmusic-irq",
"charset",
2023-06-03 19:39:34 +00:00
"cube3d",
"cube3d-sprites",
"plasma",
2023-06-03 19:39:34 +00:00
"rasterbars",
"sprites",
2022-08-14 08:46:34 +00:00
"starfield",
2023-06-03 19:39:34 +00:00
"tehtriz",
"turtle-gfx",
"wizzine",
),
listOf(false, true)
)
val target = C64Target()
withData(
nameFn = { it.second.first },
onlyC64.map { it to prepareTestFiles(it.first, it.second, target) }
) { (params, prep) ->
val filepath = prep.second
val optimize = params.second
compileTheThing(filepath, optimize, target) shouldNotBe null
}
})
class TestCompilerOnExamplesCx16: FunSpec({
2022-06-26 16:51:03 +00:00
val onlyCx16 = cartesianProduct(
listOf(
2023-09-24 18:56:36 +00:00
"chunkedfile/demo",
"vtui/testvtui",
2023-06-03 19:39:34 +00:00
"pcmaudio/play-adpcm",
"pcmaudio/stream-wav",
"pcmaudio/stream-simple-aflow",
"pcmaudio/stream-simple-poll",
2024-04-16 20:11:26 +00:00
"pcmaudio/vumeter",
"sprites/dragon",
"sprites/dragons",
"zsmkit/demo1",
"zsmkit/demo2",
"banking/program",
"amiga",
"audioroutines",
"automatons",
2024-10-12 20:30:18 +00:00
"balloonflight",
2022-07-09 13:40:56 +00:00
"bdmusic",
"bobs",
2023-06-03 19:39:34 +00:00
"bubbleuniverse",
"charsets",
"circles",
"cobramk3-gfx",
"colorbars",
2022-11-14 16:55:55 +00:00
"cube3d",
2023-06-03 19:39:34 +00:00
"cxlogo",
2022-11-14 16:55:55 +00:00
"diskspeed",
"fileseek",
"kefrenbars",
2022-11-14 16:55:55 +00:00
"keyboardhandler",
"life",
2022-07-09 13:40:56 +00:00
"mandelbrot",
"multi-irq-old",
"multi-irq-new",
2023-09-04 21:54:13 +00:00
"plasma",
"rasterbars",
"showbmx",
2022-11-14 16:55:55 +00:00
"snow",
2023-06-18 10:49:22 +00:00
"spotlight",
"starszoom",
"tehtriz",
"test_gfx_lores",
"test_gfx_hires",
"testmonogfx",
),
listOf(false, true)
)
val target = Cx16Target()
withData(
nameFn = { it.second.first },
onlyCx16.map { it to prepareTestFiles(it.first, it.second, target) }
) { (params, prep) ->
val filepath = prep.second
val optimize = params.second
compileTheThing(filepath, optimize, target) shouldNotBe null
}
})
class TestCompilerOnExamplesBothC64andCx16: FunSpec({
2022-06-26 16:51:03 +00:00
val bothCx16AndC64 = cartesianProduct(
listOf(
"animals",
"balls",
"cube3d",
"cube3d-float",
"cube3d-gfx",
"dirlist",
"fibonacci",
"fractal-tree",
2022-07-09 13:40:56 +00:00
"maze",
"mandelbrot",
"mandelbrot-gfx",
"numbergame",
"primes",
"queens",
"screencodes",
"swirl",
"swirl-float",
"tehtriz",
"textelite",
),
listOf(false, true),
listOf(C64Target(), Cx16Target())
)
withData(
nameFn = { it.third.first },
bothCx16AndC64.map { Triple(it.second, it.third, prepareTestFiles(it.first, it.second, it.third)) }
) { params ->
val filepath = params.third.second
val optimize = params.first
compileTheThing(filepath, optimize, params.second) shouldNotBe null
}
})
class TestCompilerOnExamplesVirtual: FunSpec({
val onlyVirtual = cartesianProduct(
listOf(
"bouncegfx",
"bsieve",
"pixelshader",
2024-03-16 15:47:40 +00:00
"sincos"
),
listOf(false, true)
)
val target = VMTarget()
withData(
nameFn = { it.second.first },
onlyVirtual.map { it to prepareTestFiles(it.first, it.second, target) }
) { (params, prep) ->
val filepath = prep.second
val optimize = params.second
compileTheThing(filepath, optimize, target) shouldNotBe null
}
})