summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-09-12 11:13:31 -0700
committerCliff Click <cliffc@acm.org>2024-10-23 17:51:09 -0700
commit67dc6202dee2ce983778ba3143cc3f00196aeb7c (patch)
treee1622c3cd33e3761b1fb5aa55de51765c93f3de3 /src/test/java/com/seaofnodes/simple/BrainFuckTest.java
parentcb6d02efd0eca71076e458b890571385f0bf64a4 (diff)
downloadSimple-linear-chapter15.tar.gz
Simple-linear-chapter15.zip
Chapter 15: Arrayslinear-chapter15
Co-authored-by: XmiliaH <xmilia.hermit@gmail.com> Co-authored-by: Thalia Archibald <thalia@archibald.dev> Co-authored-by: Robert Obkircher <robert.obkircher@gmail.com>
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/BrainFuckTest.java')
-rw-r--r--src/test/java/com/seaofnodes/simple/BrainFuckTest.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
new file mode 100644
index 00000000..f7c66bda
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
@@ -0,0 +1,81 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.evaluator.Evaluator;
+import com.seaofnodes.simple.node.StopNode;
+import org.junit.Test;
+import org.junit.Ignore;
+
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class BrainFuckTest {
+
+ @Ignore
+ @Test
+ public void testBrainfuck() {
+ var program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.".getBytes(StandardCharsets.UTF_8);
+ var encoded = new StringBuilder("u8[] program = new u8[").append(program.length).append("];");
+ for (int i = 0; i < program.length; i++) {
+ int value = program[i] & 0xFF;
+ encoded.append("program[").append(i).append("] = ").append(value).append(";");
+ }
+
+ Parser parser = new Parser(
+ encoded + """
+int pc = 0;
+int d = 0;
+u8[] data = new u8[100];
+u8[] output = new u8[0];
+
+while (pc < program#) {
+ int command = program[pc];
+ if (command == 62) {
+ d = d + 1;
+ } else if (command == 60) {
+ d = d - 1;
+ } else if (command == 43) {
+ data[d] = data[d] + 1;
+ } else if (command == 45) {
+ data[d] = data[d] - 1;
+ } else if (command == 46) {
+ u8[] old = output;
+ output = new u8[output# + 1];
+ int i = 0;
+ while (i < old#) {
+ output[i] = old[i];
+ i = i + 1;
+ }
+ output[i] = data[d];
+ } else if (command == 44) {
+ data[d] = 42;
+ } else if (command == 91) {
+ if (data[d] == 0) {
+ int d = 1;
+ while (d > 0) {
+ pc = pc + 1;
+ command = program[pc];
+ if (command == 91) d = d + 1;
+ if (command == 93) d = d - 1;
+ }
+ }
+ } else if (command == 93) {
+ if (data[d] != 0) {
+ int d = 1;
+ while (d > 0) {
+ pc = pc - 1;
+ command = program[pc];
+ if (command == 93) d = d + 1;
+ if (command == 91) d = d - 1;
+ }
+ }
+ }
+ pc = pc + 1;
+}
+return output;
+ """);
+ StopNode stop = parser.parse(false).iterate(false);
+ assertEquals("Hello World!\n", Evaluator.evaluate(stop, 0, 10000).toString());
+ }
+}