summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/Chapter15Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/Chapter15Test.java')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter15Test.java163
1 files changed, 77 insertions, 86 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index 4e2682dc..86f5007d 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -1,42 +1,38 @@
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 static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
public class Chapter15Test {
@Test
public void testJig() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
return 3.14;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 3.14;", stop.toString());
- assertEquals(3.14, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 3.14;", code.print());
+ assertEquals("3.14", Eval2.eval(code, 0));
}
@Test
public void testCyclic() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct C { C? l; };
C !c = new C;
c.l = c;
return c;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return C;", stop.toString());
- assertEquals("Obj<C>@1{l=obj@1}", Evaluator.evaluate(stop, 0).toString());
+ code.parse().opto();
+ assertEquals("return C;", code.print());
+ assertEquals("C{l=$cyclic}", Eval2.eval(code, 0));
}
@Test
public void testSafetyCheck() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
u8[] old = new u8[0];
u8[] !output = new u8[1];
@@ -48,66 +44,66 @@ while (i < old#) {
output[i] = 1;
return output;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return [u8];", stop.toString());
- assertEquals("\u0001", Evaluator.evaluate(stop, 0).toString());
+ code.parse().opto();
+ assertEquals("return [u8];", code.print());
+ assertEquals("\u0001", Eval2.eval(code, 0));
}
@Test
public void testBasic1() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] is = new int[2];
return is[1];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
}
@Test
public void testBasic2() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] is = new int[2];
int[] is2 = new int[2];
return is[1];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
}
@Test
public void testBasic3() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] !a = new int[2];
a[0] = 1;
a[1] = 2;
return a[0];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test
public void testBasic4() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct A { int i; };
A?[] !a = new A?[2];
return a;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return [*A?];", stop.toString());
- assertEquals("Obj<[*A?]>{#=2,[]=[null,null]}", Evaluator.evaluate(stop, 0).toString());
+ code.parse().opto();
+ assertEquals("return [*A?];", code.print());
+ assertEquals("*A {int !i; }?[ null,null]", Eval2.eval(code, 0));
}
@Test
public void testBasic5() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct S { int x; flt y; };
// A new S
@@ -129,15 +125,15 @@ else {
}
return rez;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,1.2,Phi(Region,2.3,3.14));", stop.toString());
- assertEquals(3.14, Evaluator.evaluate(stop, 0));
- assertEquals(1.2 , Evaluator.evaluate(stop, 1));
+ code.parse().opto();
+ assertEquals("return Phi(Region,1.2,Phi(Region,2.3,.y));", code.print());
+ assertEquals("3.14", Eval2.eval(code, 0));
+ assertEquals("1.2", Eval2.eval(code, 1));
}
@Test
public void testBasic6() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct S { int x; flt y; };
// A new S
@@ -155,13 +151,13 @@ if( iss[arg] )
rez = iss[arg][2].y;
return rez;
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Might be null accessing 'y'",e.getMessage()); }
}
@Test
public void testTree() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
// Can we define a forward-reference array?
struct Tree { Tree?[]? _kids; };
@@ -170,25 +166,25 @@ root._kids = new Tree?[2]; // NO BANG SO ARRAY IS OF IMMUTABLE TREES????
root._kids[0] = new Tree;
return root;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Tree;", stop.toString());
- assertEquals("Obj<Tree>{_kids=Obj<[*Tree?]>{#=2,[]=[Obj<Tree>{_kids=null},null]}}", Evaluator.evaluate(stop, 0).toString());
+ code.parse().opto();
+ assertEquals("return Tree;", code.print());
+ assertEquals("Tree{_kids=*Tree?[ Tree{_kids=null},null]}", Eval2.eval(code, 0));
}
@Test
public void testNestedStructAddMemProj() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct S { int a; int[] b; };
return 0;
""");
- StopNode stop = parser.parse();
- assertEquals("return 0;", stop.toString());
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
}
@Test
public void testRollingSum() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] !ary = new int[arg];
// Fill [0,1,2,3,4,...]
@@ -205,14 +201,14 @@ while( i < ary# - 1 ) {
}
return ary[1] * 1000 + ary[3]; // 1 * 1000 + 6
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return (.[]+(.[]*1000));", stop.toString());
- assertEquals(1006L, Evaluator.evaluate(stop, 4));
+ code.parse().opto();
+ assertEquals("return (.[]+(.[]*1000));", code.print());
+ assertEquals("1006", Eval2.eval(code, 4));
}
@Test
public void sieveOEratosthenes() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] !ary = new int[arg], !primes = new int[arg];
int nprimes = 0, p=2;
@@ -246,19 +242,14 @@ while( j < nprimes ) {
}
return rez;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return [int];", stop.toString());
- Evaluator.Obj obj = (Evaluator.Obj)Evaluator.evaluate(stop, 20);
- assertEquals("[int] {int #; int ![]; }",obj.struct().toString());
- long nprimes = (Long)obj.fields()[0];
- long[] primes = new long[]{2,3,5,7,11,13,17,19};
- for( int i=0; i<nprimes; i++ )
- assertEquals(primes[i],(long)(Long)obj.fields()[i+1]);
+ code.parse().opto();
+ assertEquals("return [int];", code.print());
+ assertEquals("int[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
}
@Test
public void testNewNodeInit() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
struct S {int i; flt f;};
S !s1 = new S;
@@ -268,62 +259,62 @@ s2.f = 2.0;
if (arg) s1 = new S;
return s1.i + s1.f;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return ((flt).i+.f);", stop.toString());
- assertEquals(0.0, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return ((flt).i+.f);", code.print());
+ assertEquals("0.0", Eval2.eval(code, 0));
}
@Test
public void testBad0() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
return new flt;
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Cannot allocate a flt",e.getMessage()); }
}
@Test
public void testBad1() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int is = new int[2];
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Type *[int] is not of declared type int",e.getMessage()); }
}
@Test
public void testBad2() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] is = new int[3.14];
return is[1];
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Cannot allocate an array with length 3.14",e.getMessage()); }
}
@Test
public void testBad3() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
int[] is = new int[arg];
return is[1];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 4));
- try { Evaluator.evaluate(stop,0); }
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 4));
+ try { Eval2.eval(code,0); }
catch( ArrayIndexOutOfBoundsException e ) { assertEquals("Array index 1 out of bounds for array length 0",e.getMessage()); }
- try { Evaluator.evaluate(stop,-1); }
+ try { Eval2.eval(code,-1); }
catch( NegativeArraySizeException e ) { assertEquals("-1",e.getMessage()); }
}
@Test
public void testProgress() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
i8 v1=0&0;
u8 v2=0;
byte v4=0;
@@ -342,14 +333,14 @@ while(v5+(0&0)) {
}
return v1;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
}
@Test
public void testSharpNot() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
if(0>>0) {}
while(0) {}
@@ -357,14 +348,14 @@ u32 v7=0;
int v8=0;
while(0<--1>>>---(v7*0==v8)) {}
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
}
@Test
public void testProgress2() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
if(1) {}
else {
@@ -381,7 +372,7 @@ else {
}
}
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
}
}