prog8/compiler/test/TestCompilerOnExamples.kt

170 lines
4.8 KiB
Kotlin
Raw Normal View History

package prog8tests
import io.kotest.core.spec.style.FunSpec
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
2022-03-11 19:35:25 +00:00
import prog8.code.target.C64Target
import prog8.code.target.Cx16Target
2021-11-30 00:40:21 +00:00
import prog8.compiler.CompilationResult
import prog8.compiler.CompilerArguments
import prog8.compiler.compileProgram
2022-06-26 16:51:03 +00:00
import prog8tests.helpers.assumeDirectory
import prog8tests.helpers.cartesianProduct
import prog8tests.helpers.outputDir
import prog8tests.helpers.workingDir
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,
optimizeFloatExpressions = true,
2022-01-01 15:35:36 +00:00
dontReinitGlobals = false,
2021-11-30 00:40:21 +00:00
writeAssembly = true,
slowCodegenWarnings = false,
quietAssembler = true,
asmListfile = false,
experimentalCodegen = false,
2021-11-30 00:40:21 +00:00
compilationTarget = target.name,
evalStackBaseAddress = null,
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)
if (target is Cx16Target) {
2022-06-26 16:51:03 +00:00
searchIn.add(0, assumeDirectory(examplesDir, "cx16"))
}
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",
"bdmusic",
"bdmusic-irq",
"charset",
"cube3d-sprites",
"plasma",
"sprites",
2022-08-14 08:46:34 +00:00
"starfield",
"turtle-gfx",
"wizzine",
),
listOf(false, true)
)
onlyC64.forEach {
val (source, optimize) = it
val target = C64Target()
val (displayName, filepath) = prepareTestFiles(source, optimize, target)
test(displayName) {
2022-03-07 20:41:12 +00:00
compileTheThing(filepath, optimize, target) shouldNotBe null
}
}
})
class TestCompilerOnExamplesCx16: FunSpec({
2022-06-26 16:51:03 +00:00
val onlyCx16 = cartesianProduct(
listOf(
"vtui/testvtui",
"amiga",
2022-07-09 13:40:56 +00:00
"bdmusic",
"bobs",
"circles",
"cobramk3-gfx",
"colorbars",
"datetime",
"highresbitmap",
"kefrenbars",
2022-07-09 13:40:56 +00:00
"mandelbrot",
"mandelbrot-gfx-colors",
"multipalette",
"rasterbars",
"sincos",
"tehtriz",
"testgfx2",
),
listOf(false, true)
)
onlyCx16.forEach {
val (source, optimize) = it
val target = Cx16Target()
val (displayName, filepath) = prepareTestFiles(source, optimize, target)
test(displayName) {
2022-03-07 20:41:12 +00:00
compileTheThing(filepath, optimize, target) shouldNotBe null
}
}
})
class TestCompilerOnExamplesBothC64andCx16: FunSpec({
2022-06-26 16:51:03 +00:00
val bothCx16AndC64 = cartesianProduct(
listOf(
"animals",
"balls",
"bsieve",
"cube3d",
"cube3d-float",
"cube3d-gfx",
"cxlogo",
"dirlist",
"fibonacci",
"line-circle-gfx",
"line-circle-txt",
2022-07-09 13:40:56 +00:00
"maze",
"mandelbrot",
"mandelbrot-gfx",
"numbergame",
"primes",
"rasterbars",
"screencodes",
"sorting",
"swirl",
"swirl-float",
"tehtriz",
"textelite",
),
listOf(false, true)
)
bothCx16AndC64.forEach {
val (source, optimize) = it
val c64target = C64Target()
val cx16target = Cx16Target()
val (displayNameC64, filepathC64) = prepareTestFiles(source, optimize, c64target)
val (displayNameCx16, filepathCx16) = prepareTestFiles(source, optimize, cx16target)
test(displayNameC64) {
2022-03-07 20:41:12 +00:00
compileTheThing(filepathC64, optimize, c64target) shouldNotBe null
}
test(displayNameCx16) {
2022-03-07 20:41:12 +00:00
compileTheThing(filepathCx16, optimize, cx16target) shouldNotBe null
}
}
})