import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeGreaterThan import io.kotest.matchers.shouldBe import io.kotest.matchers.types.instanceOf import prog8.code.StStaticVariable import prog8.code.SymbolTable import prog8.code.core.CbmPrgLauncherType import prog8.code.core.CompilationOptions import prog8.code.core.OutputType import prog8.code.core.ZeropageType import prog8.code.target.Cx16Target import prog8.intermediate.IRFileReader import prog8.intermediate.IRFileWriter import prog8.intermediate.IRProgram import kotlin.io.path.* class TestIRFileInOut: FunSpec({ test("test IR writer") { val st = SymbolTable() val target = Cx16Target() val tempdir = Path(System.getProperty("java.io.tmpdir")) val options = CompilationOptions( OutputType.RAW, CbmPrgLauncherType.NONE, ZeropageType.DONTUSE, emptyList(), floats = false, noSysInit = true, compTarget = target, loadAddress = target.machine.PROGRAM_LOAD_ADDRESS, outputDir = tempdir ) val program = IRProgram("unittest-irwriter", st, options, target) val writer = IRFileWriter(program) writer.writeFile() val generatedFile = tempdir.resolve("unittest-irwriter.p8ir") val lines = generatedFile.readLines() lines.first() shouldBe "" lines.last() shouldBe "" generatedFile.deleteExisting() lines.size shouldBeGreaterThan 20 } test("test IR reader") { val source=""" compTarget=virtual output=PRG launcher=BASIC zeropage=KERNALSAFE loadAddress=0 dontReinitGlobals=false evalStackBaseAddress=null uword sys.wait.jiffies=0 zp=DONTCARE &uword cx16.r0=65282 load.b r1,42 return uword sys.wait.jiffies loadm.w r0,sys.wait.jiffies syscall 13 return """ val tempfile = kotlin.io.path.createTempFile(suffix = ".p8ir") tempfile.writeText(source) val filepart = tempfile.name.dropLast(5) val reader = IRFileReader(tempfile.parent, filepart) val program = reader.readFile() tempfile.deleteExisting() program.name shouldBe "test-ir-reader" program.blocks.size shouldBe 2 program.st.lookup("sys.wait.jiffies") shouldBe instanceOf() } })