summaryrefslogtreecommitdiff
path: root/src/test/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilderTest.java
blob: 9707ef3dfc1bf670c5aae596c733b156c1232f58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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() {
    AssemblyBuilder builder = new AssemblyBuilder();

    String result = builder.createAssembly(List.of());

    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 handlePrintGeneratesCorrectAssemblyForMutableVariable() {
    AssemblyBuilder builder = new AssemblyBuilder();
    builder.stringVariables.put("greeting", new AssemblyBuilder.StringVar("Hello", true));

    builder.handlePrint(new Call("skriv", List.of("greeting")));

    String result = builder.text.toString();
    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() {
    AssemblyBuilder builder = new AssemblyBuilder();
    builder.stringVariables.put("msg1", new AssemblyBuilder.StringVar("Hi", false));
    builder.stringVariables.put("msg2", new AssemblyBuilder.StringVar("World", false));

    builder.handlePrint(new Call("skriv", List.of("msg1")));
    builder.handlePrint(new Call("skriv", List.of("msg2")));

    String result = builder.text.toString();
    assertTrue(result.contains("lea rsi, msg1"));
    assertTrue(result.contains("lea rsi, msg2"));
    assertTrue(result.contains("mov rdx, 2"));
    assertTrue(result.contains("mov rdx, 5"));
  }
}