summaryrefslogtreecommitdiff
path: root/chapter17/src/test/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-11-07 14:17:20 -0800
committerCliff Click <cliffc@acm.org>2024-11-23 09:03:20 -0800
commit59a06668f3975c90459409e25e884b4b594cbe3b (patch)
treee53eac8d61685807275d2f861c7df672e3bc1032 /chapter17/src/test/java/com/seaofnodes
parent59fb2c02e08b9bf577f2dedfabd290cb6e00e016 (diff)
downloadSimple-59a06668f3975c90459409e25e884b4b594cbe3b.tar.gz
Simple-59a06668f3975c90459409e25e884b4b594cbe3b.zip
Allow post ++, --
Fix eval auto-string result. Fix tests hacked because of this. Turn on BrainFuck in ch15,16,17, also disabled because of this. Use new features in BrainFuck. Fix bug not lifting forward refs; add a toString to Vars. Fix some missing addDeps. Remove large complex not-productive peep. Upcast after "while" tests. Improves a bunch of tests. Remove dead getBlockStart.
Diffstat (limited to 'chapter17/src/test/java/com/seaofnodes')
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java27
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter06Test.java6
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter07Test.java8
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter08Test.java10
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter09Test.java4
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter10Test.java6
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java4
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter14Test.java2
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter15Test.java2
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java55
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/TypeTest.java2
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java2
12 files changed, 88 insertions, 40 deletions
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
index f7c66bda..0a48d2e7 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
@@ -12,7 +12,6 @@ import static org.junit.Assert.fail;
public class BrainFuckTest {
- @Ignore
@Test
public void testBrainfuck() {
var program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.".getBytes(StandardCharsets.UTF_8);
@@ -32,9 +31,9 @@ u8[] output = new u8[0];
while (pc < program#) {
int command = program[pc];
if (command == 62) {
- d = d + 1;
+ d++;
} else if (command == 60) {
- d = d - 1;
+ d--;
} else if (command == 43) {
data[d] = data[d] + 1;
} else if (command == 45) {
@@ -43,10 +42,8 @@ while (pc < program#) {
u8[] old = output;
output = new u8[output# + 1];
int i = 0;
- while (i < old#) {
- output[i] = old[i];
- i = i + 1;
- }
+ while (i < old#)
+ output[i] = old[i++];
output[i] = data[d];
} else if (command == 44) {
data[d] = 42;
@@ -54,24 +51,24 @@ while (pc < program#) {
if (data[d] == 0) {
int d = 1;
while (d > 0) {
- pc = pc + 1;
+ pc++;
command = program[pc];
- if (command == 91) d = d + 1;
- if (command == 93) d = d - 1;
+ if (command == 91) d++;
+ if (command == 93) d--;
}
}
} else if (command == 93) {
- if (data[d] != 0) {
+ if (data[d]) {
int d = 1;
while (d > 0) {
- pc = pc - 1;
+ pc--;
command = program[pc];
- if (command == 93) d = d + 1;
- if (command == 91) d = d - 1;
+ if (command == 93) d++;
+ if (command == 91) d--;
}
}
}
- pc = pc + 1;
+ pc++;
}
return output;
""");
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter06Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter06Test.java
index ff1f3251..6308bdea 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter06Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter06Test.java
@@ -84,7 +84,7 @@ else
b=5;
return b;""", TypeInteger.BOT);
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region38,2,5);", stop.toString());
+ assertEquals("return Phi(Region36,2,5);", stop.toString());
}
@Test
@@ -200,7 +200,7 @@ if( arg ) {
return a+b;
""");
StopNode ret = parser.parse().iterate();
- assertEquals("return Phi(Region35,4,1);", ret.toString());
+ assertEquals("return Phi(Region32,4,1);", ret.toString());
}
@@ -251,7 +251,7 @@ if( arg ) {
return a+b+c;
""");
StopNode ret = parser.parse().iterate();
- assertEquals("return (Phi(Region48,Phi(Region29,2,3),0)+Phi(Region,3,1));", ret.toString());
+ assertEquals("return (Phi(Region45,Phi(Region29,2,3),0)+Phi(Region,3,1));", ret.toString());
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter07Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter07Test.java
index b54c24a3..80cb15d4 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter07Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter07Test.java
@@ -36,7 +36,7 @@ if(arg){}else{
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region31,1,Phi(Loop18,1,(Phi_a+1)));", stop.toString());
+ assertEquals("return Phi(Region32,1,Phi(Loop18,1,(Phi_a+1)));", stop.toString());
}
@Test
@@ -56,7 +56,7 @@ while(i < arg) {
return sum;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop12,0,Phi(Loop26,Phi_sum,(Phi_sum+Phi(Loop,0,(Phi_j+1)))));", stop.toString());
+ assertEquals("return Phi(Loop12,0,Phi(Loop27,Phi_sum,(Phi_sum+Phi(Loop,0,(Phi_j+1)))));", stop.toString());
}
@Test
@@ -73,7 +73,7 @@ return b;
""");
Node._disablePeephole = true;
StopNode stop = parser.parse();
- assertEquals("return Phi(Loop12,2,Phi(Region34,Phi_b,4));", stop.toString());
+ assertEquals("return Phi(Loop12,2,Phi(Region35,Phi_b,4));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
Node._disablePeephole = false;
}
@@ -93,7 +93,7 @@ while(a < 10) {
return b;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop12,2,(Phi(Region34,Phi_b,4)+1));", stop.toString());
+ assertEquals("return Phi(Loop12,2,(Phi(Region35,Phi_b,4)+1));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter08Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter08Test.java
index c199b78c..5372388b 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter08Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter08Test.java
@@ -23,7 +23,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region45,Phi(Region32,Phi(Loop10,arg,(Phi_arg+1)),Add),Add);", stop.toString());
+ assertEquals("return Phi(Region46,Phi(Region33,Phi(Loop10,arg,(Phi_arg+1)),Add),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
Assert.assertEquals(5L, Evaluator.evaluate(stop, 1));
Assert.assertEquals(10L, Evaluator.evaluate(stop, 6));
@@ -46,7 +46,7 @@ while(arg < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,1,Phi(Region52,Phi_a,(Phi_a+1)));", stop.toString());
+ assertEquals("return Phi(Loop11,1,Phi(Region53,Phi_a,(Phi_a+1)));", stop.toString());
assertTrue(stop.ret().ctrl() instanceof CProjNode);
}
@@ -65,7 +65,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region43,Phi(Loop10,arg,(Phi_arg+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region44,Phi(Loop10,arg,(Phi_arg+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
@@ -81,7 +81,7 @@ while(arg < 10) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region32,Phi(Loop10,arg,(Phi_arg+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region33,Phi(Loop10,arg,(Phi_arg+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
@@ -185,7 +185,7 @@ while(arg < 10) {
return a;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region35,Phi(Loop11,1,(Phi_a+1)),Add);", stop.toString());
+ assertEquals("return Phi(Region36,Phi(Loop11,1,(Phi_a+1)),Add);", stop.toString());
assertTrue(stop.ret().ctrl() instanceof RegionNode);
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter09Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter09Test.java
index b1d9d6e5..04ab8001 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter09Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter09Test.java
@@ -115,7 +115,7 @@ while (arg) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop18,arg,(Phi_arg+1));", stop.toString());
+ assertEquals("return 0;", stop.toString());
}
@Test
@@ -283,7 +283,7 @@ return v1+v0;
public void testFuzz8() {
Parser parser = new Parser("while(arg) arg = arg - 1; return arg;");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop10,arg,(Phi_arg-1));", stop.toString());
+ assertEquals("return 0;", stop.toString());
}
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter10Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter10Test.java
index 2a33031d..0bf921f6 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter10Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter10Test.java
@@ -245,7 +245,7 @@ while(arg) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop16,s0,Phi(Region43,s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop16,s0,Phi(Region45,s0,Phi_ret));", stop.toString());
}
@Test
@@ -263,7 +263,7 @@ while(arg) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop20,s0,Phi(Region44,s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop20,s0,Phi(Region46,s0,Phi_ret));", stop.toString());
}
@@ -280,7 +280,7 @@ while(arg < 10) {
return ret;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop16,s0,Phi(Region41,s0,Phi_ret));", stop.toString());
+ assertEquals("return Phi(Loop16,s0,Phi(Region42,s0,Phi_ret));", stop.toString());
}
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index d6b7bb00..44814d53 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -324,7 +324,7 @@ while( prime <= arg ) {
return primeCount;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("Stop[ return 0; return Phi(Loop23,1,Phi(Region100,Phi_primeCount,Phi(Region93,(Phi_primeCount+1),Phi_primeCount))); ]", stop.toString());
+ assertEquals("Stop[ return 0; return Phi(Loop23,1,Phi(Region102,Phi_primeCount,Phi(Region95,(Phi_primeCount+1),Phi_primeCount))); ]", stop.toString());
assertEquals(0L, Evaluator.evaluate(stop, 1)); // No primes 1 or below
assertEquals(1L, Evaluator.evaluate(stop, 2)); // 2
assertEquals(2L, Evaluator.evaluate(stop, 3)); // 2, 3
@@ -476,7 +476,7 @@ while(arg) {
return arg;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop20,arg,Phi(Region48,.f,0));", stop.toString());
+ assertEquals("return 0;", stop.toString());
}
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter14Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter14Test.java
index 7d7bb25a..e72b0c76 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter14Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter14Test.java
@@ -59,7 +59,7 @@ while( b ) b = b + 456;// Truncate
return b;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop11,123,((Phi_b+456)&255));", stop.toString());
+ assertEquals("return 0;", stop.toString());
}
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index d2d60b34..8161862f 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -50,7 +50,7 @@ return output;
""");
StopNode stop = parser.parse().iterate();
assertEquals("return [u8];", stop.toString());
- assertEquals("Obj<[u8]>{#=1,[]=[1]}", Evaluator.evaluate(stop, 0).toString());
+ assertEquals("\u0001", Evaluator.evaluate(stop, 0).toString());
}
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index 790f9531..91c275ce 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -10,12 +10,63 @@ public class Chapter17Test {
@Test
public void testJig() {
- Parser parser = new Parser(
-"""
+ Parser parser = new Parser("""
return 3.14;
""");
StopNode stop = parser.parse().iterate();
assertEquals("return 3.14;", stop.toString());
assertEquals(3.14, Evaluator.evaluate(stop, 0));
}
+
+ @Test
+ public void testInc0() {
+ Parser parser = new Parser("""
+return arg++;
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return arg;", stop.toString());
+ assertEquals(0L, Evaluator.evaluate(stop, 0));
+ }
+
+ @Test
+ public void testInc1() {
+ Parser parser = new Parser("""
+return arg+++arg++;
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return ((arg*2)+1);", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ }
+
+ @Test
+ public void testInc2() {
+ Parser parser = new Parser("""
+// -(arg--)-(arg--)
+return -arg---arg--;
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return (-((arg*2)+-1));", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ }
+
+
+ @Test
+ public void testLinkedList2() {
+ Parser parser = new Parser("""
+struct LLI { LLI? next; int i; };
+LLI? head = null;
+while( arg-- )
+ head = new LLI { next=head; i=arg; };
+int sum=0;
+while( head ) {
+ sum = sum + head.i;
+ head = head.next;
+}
+return sum;
+""");
+ StopNode stop = parser.parse().iterate();
+ assertEquals("return Phi(Loop35,0,(Phi_sum+.i));", stop.toString());
+ assertEquals(45L, Evaluator.evaluate(stop, 10));
+ }
+
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/TypeTest.java b/chapter17/src/test/java/com/seaofnodes/simple/TypeTest.java
index 6f7409cd..03b0e31d 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/TypeTest.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/TypeTest.java
@@ -79,7 +79,7 @@ public class TypeTest {
// Test theoretical properties.
// This is a symmetric complete bounded (ranked) lattice.
- // Also the meet is commutative and associative.
+ // Also, the meet is commutative and associative.
// The lattice has a dual (symmetric), and join is ~(~x meet ~y).
// See https://en.wikipedia.org/wiki/Lattice_(order).
@Test
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter17/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index 28896283..c215de00 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -100,7 +100,7 @@ public class Evaluator {
}
@Override
public String toString() {
- if (struct._name.equals("u8[]")) {
+ if (struct._name.equals("[u8]")) {
var sb = new StringBuilder();
for (int i=struct._fields.length-1; i<fields.length; i++) {
var v = fields[i];