summaryrefslogtreecommitdiff
path: root/src/test/java/no
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/no')
-rw-r--r--src/test/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneratorTest.java7
-rw-r--r--src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java78
2 files changed, 47 insertions, 38 deletions
diff --git a/src/test/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneratorTest.java b/src/test/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneratorTest.java
index 232b8f3..844782f 100644
--- a/src/test/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneratorTest.java
+++ b/src/test/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneratorTest.java
@@ -3,6 +3,9 @@ package no.eliashaugsbakk.kompilator.IRGeneration;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
+import no.eliashaugsbakk.kompilator.IRGeneration.Instructions.Alloc;
+import no.eliashaugsbakk.kompilator.IRGeneration.Instructions.Call;
+import no.eliashaugsbakk.kompilator.IRGeneration.Instructions.Instruction;
import no.eliashaugsbakk.kompilator.parsing.AST;
import no.eliashaugsbakk.kompilator.parsing.node.Program;
import no.eliashaugsbakk.kompilator.parsing.node.expression.FunctionCall;
@@ -15,7 +18,7 @@ class IRGeneratorTest {
@Test
void singlePrintStatementGeneratesCorrectIR() {
AST ast = buildAST("skriv", "hello");
- List<Instr> ir = new IRGenerator(ast).generate();
+ List<Instruction> ir = new IRGenerator(ast).generate();
assertEquals(2, ir.size());
assertEquals(new Alloc("t0", "string", false, "hello"), ir.get(0));
@@ -28,7 +31,7 @@ class IRGeneratorTest {
program.addStatement(buildStatement("skriv", "hello"));
program.addStatement(buildStatement("skriv", "world"));
- List<Instr> ir = new IRGenerator(new AST(program)).generate();
+ List<Instruction> ir = new IRGenerator(new AST(program)).generate();
assertEquals(4, ir.size());
assertEquals(new Alloc("t0", "string", false, "hello"), ir.get(0));
diff --git a/src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java b/src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java
index 4c124fc..9707ef3 100644
--- a/src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java
+++ b/src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java
@@ -1,65 +1,71 @@
package no.eliashaugsbakk.kompilator.asmGeneration;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
import java.util.List;
+import no.eliashaugsbakk.kompilator.IRGeneration.Instructions.Call;
import org.junit.jupiter.api.Test;
class AssemblyBuilderTest {
@Test
void boilerplateGetsGenerated() {
- // Setup
AssemblyBuilder builder = new AssemblyBuilder();
- // Act
-
- // Assert
String result = builder.createAssembly(List.of());
- assert result.contains("""
- .intel_syntax noprefix
- .global _start
- .text
- _start:
- """);
-
- assert result.contains("""
- mov rax, 60
- xor rdi, rdi
- syscall
- """);
- assert result.contains(".data");
+
+ assertTrue(result.contains(".intel_syntax noprefix\n.global _start"));
+ assertTrue(result.contains("mov rax, 60\nxor rdi, rdi\nsyscall"));
+ assertTrue(result.contains(".data"));
+ }
+
+ @Test
+ void handlePrintGeneratesCorrectAssemblyForImmutableVariable() {
+ AssemblyBuilder builder = new AssemblyBuilder();
+ builder.stringVariables.put("greeting", new AssemblyBuilder.StringVar("Hello", false));
+
+ builder.handlePrint(new Call("skriv", List.of("greeting")));
+
+ String result = builder.text.toString();
+ assertTrue(result.contains("lea rsi, greeting"));
+ assertTrue(result.contains("mov rdx, 5"));
}
@Test
- void handlePrintGeneratesCorrectAssemblyForSingleStatement() {
- // Setup
+ void handlePrintGeneratesCorrectAssemblyForMutableVariable() {
AssemblyBuilder builder = new AssemblyBuilder();
- builder.stringVariables.put("greeting", "Hello");
+ builder.stringVariables.put("greeting", new AssemblyBuilder.StringVar("Hello", true));
- // Act
- builder.handlePrint("skriv(greeting)");
+ builder.handlePrint(new Call("skriv", List.of("greeting")));
- // Assert
String result = builder.text.toString();
- assert result.contains("lea rsi, greeting");
- assert result.contains("mov rdx, 5"); // "Hello"
+ assertTrue(result.contains("mov rsi, [rip + greeting]"));
+ assertTrue(result.contains("mov rdx, 5"));
+ }
+
+ @Test
+ void handlePrintCorrectlyCountsNewlineAsOneByte() {
+ AssemblyBuilder builder = new AssemblyBuilder();
+ builder.stringVariables.put("msg", new AssemblyBuilder.StringVar("Hello\n", false));
+
+ builder.handlePrint(new Call("skriv", List.of("msg")));
+
+ assertTrue(builder.text.toString().contains("mov rdx, 6"));
}
@Test
void handlePrintWorksCorrectlyWithMultiplePrintStatements() {
- // Setup
AssemblyBuilder builder = new AssemblyBuilder();
- builder.stringVariables.put("msg1", "Hi");
- builder.stringVariables.put("msg2", "World");
+ builder.stringVariables.put("msg1", new AssemblyBuilder.StringVar("Hi", false));
+ builder.stringVariables.put("msg2", new AssemblyBuilder.StringVar("World", false));
- // Act
- builder.handlePrint("skriv(msg1)");
- builder.handlePrint("skriv(msg2)");
+ builder.handlePrint(new Call("skriv", List.of("msg1")));
+ builder.handlePrint(new Call("skriv", List.of("msg2")));
- // Assert
String result = builder.text.toString();
- assert (result).contains("lea rsi, msg1");
- assert (result).contains("lea rsi, msg2");
- assert (result).contains("mov rdx, 2"); // "Hi"
- assert (result).contains("mov rdx, 5"); // "World"
+ assertTrue(result.contains("lea rsi, msg1"));
+ assertTrue(result.contains("lea rsi, msg2"));
+ assertTrue(result.contains("mov rdx, 2"));
+ assertTrue(result.contains("mov rdx, 5"));
}
}