import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.ints.shouldBeGreaterThan import io.kotest.matchers.shouldBe import prog8.code.StStaticVariable 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 prog8.intermediate.IRSymbolTable import kotlin.io.path.* class TestIRFileInOut: FunSpec({ test("test IR writer") { 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", IRSymbolTable(null), options, target) val writer = IRFileWriter(program, null) val generatedFile = writer.write() val lines = generatedFile.readLines() lines[0] shouldBe "" lines[1] 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=$0000 evalStackBaseAddress= uword sys.bssvar zp=DONTCARE uword sys.wait.jiffies=10 zp=DONTCARE ubyte[3] sys.emptystring=0,0,0 zp=DONTCARE @uword cx16.r0=65282 load.b r1,42 return uword sys.wait.jiffies loadm.w r0,sys.wait.jiffies return """ val tempfile = createTempFile(suffix = ".p8ir") tempfile.writeText(source) val program = IRFileReader().read(tempfile) tempfile.deleteExisting() program.name shouldBe "test-ir-reader" program.blocks.size shouldBe 2 program.st.allVariables().count() shouldBe 3 val var1 = program.st.lookup("sys.wait.jiffies") as StStaticVariable val var2 = program.st.lookup("sys.bssvar") as StStaticVariable val var3 = program.st.lookup("sys.emptystring") as StStaticVariable var1.uninitialized shouldBe false var2.uninitialized shouldBe true var3.uninitialized shouldBe true } })