summaryrefslogtreecommitdiff
path: root/chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java')
-rw-r--r--chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java148
1 files changed, 148 insertions, 0 deletions
diff --git a/chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java b/chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java
new file mode 100644
index 00000000..2942cfee
--- /dev/null
+++ b/chapter29/src/test/java/com/seaofnodes/simple/Chapter16Test.java
@@ -0,0 +1,148 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.codegen.CodeGen;
+import org.junit.Ignore;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class Chapter16Test {
+
+ @Ignore
+ @Test
+ public void testJig() {
+ CodeGen code = new CodeGen(
+"""
+return 3.14;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return 3.14;", code.print());
+ assertEquals("3.14", Eval2.eval(code, 0));
+ }
+
+
+ @Test
+ public void testMulti0() {
+ CodeGen code = new CodeGen(
+"""
+int x, y;
+return x+y;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
+ }
+ @Test
+ public void testMulti1() {
+ CodeGen code = new CodeGen(
+"""
+int x=2, y=x+1;
+return x+y;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return 5;", code.print());
+ assertEquals("5", Eval2.eval(code, 0));
+ }
+
+
+ @Test
+ public void testConstruct0() {
+ CodeGen code = new CodeGen("""
+struct _X { int x=3; };
+_X z = new _X;
+return z.x;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return 3;", code.print());
+ assertEquals("3", Eval2.eval(code, 0));
+ }
+
+ @Test
+ public void testConstruct2() {
+ CodeGen code = new CodeGen("""
+struct _X { int x=3; new _X = { int xx -> x=xx; }; };
+_X z = new _X(4);
+return z.x;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return 4;", code.print());
+ assertEquals("4", Eval2.eval(code, 0));
+ }
+
+
+ @Test
+ public void testLinkedList1() {
+ CodeGen code = new CodeGen(
+"""
+struct _LLI { !_LLI? !next; int i; new _LLI = { !_LLI? !n, int ii -> next=n; i=ii; }; };
+!_LLI? !head = null;
+while( arg ) {
+ head = new _LLI(head,arg);
+ arg = arg-1;
+}
+if( !head ) return 0;
+_LLI? next = head.next;
+if( !next ) return 1;
+return next.i;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return Phi(Region,1,.i,0);", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
+ assertEquals("2", Eval2.eval(code, 3));
+ }
+
+ @Test
+ public void testLinkedList2() {
+ CodeGen code = new CodeGen(
+"""
+struct _LLI { !_LLI? !next; int i; new _LLI = { !_LLI? !n, int a ->
+ next=n;
+ int !tmp=a;
+ while( a > 10 ) {
+ tmp = tmp + a;
+ a = a - 1;
+ }
+ i=tmp;
+}; };
+!_LLI? !head = null;
+while( arg ) {
+ head = new _LLI(head,arg);
+ arg = arg-1;
+}
+if( !head ) return 0;
+_LLI? next = head.next;
+if( !next ) return 1;
+return next.i;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return Phi(Region,1,.i,0);", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
+ assertEquals("2", Eval2.eval(code, 11));
+ }
+
+ @Test
+ public void testSquare() {
+ CodeGen code = new CodeGen(
+"""
+struct _Square {
+ flt !side = arg;
+ // Newtons approximation to the square root, computed in a constructor.
+ // The actual allocation will copy in this result as the initial
+ // value for 'diag'.
+ flt !diag = arg*arg/2;
+ while( 1 ) {
+ flt next = (side/diag + diag)/2;
+ if( next == diag ) break;
+ diag = next;
+ }
+};
+return new _Square;
+""");
+ code.driver(CodeGen.Phase.FinalizeIR);
+ assertEquals("return Test._Square;", code.print());
+ assertEquals("Test._Square{side=3.0,diag=1.7320508075688772}", Eval2.eval(code, 3));
+ assertEquals("Test._Square{side=4.0,diag=2.0}", Eval2.eval(code, 4));
+ }
+}