summaryrefslogtreecommitdiff
path: root/chapter12/src/test/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-07-25 23:46:39 +0300
committerDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2024-08-05 23:28:33 +0100
commit799ba3a8d2603a51fc5b860f7845e72e6af61c38 (patch)
tree628fb922e02c3940bda7bbf02da8b86ffca5f637 /chapter12/src/test/java
parente325c3ad27aa12df9f2edfb1988e9c1270a88eea (diff)
downloadSimple-799ba3a8d2603a51fc5b860f7845e72e6af61c38.tar.gz
Simple-799ba3a8d2603a51fc5b860f7845e72e6af61c38.zip
Float bugs
Fix bug infinite loop finding. Fix inf loops before printing graph. Missing float unary negate . Generator makes float exprs Fix missing dep in LCA finding
Diffstat (limited to 'chapter12/src/test/java')
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java6
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java20
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java1
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java7
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java23
5 files changed, 37 insertions, 20 deletions
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 9b05d66c..6c1f7938 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -292,7 +292,7 @@ else {
}
""");
StopNode stop = parser.parse(false).iterate(false);
- assertEquals("Stop[ return 9; return 0; return 0; ]", stop.toString());
+ assertEquals("Stop[ return 9; return 0; return 0; return 0; return 0; ]", stop.toString());
}
@@ -433,8 +433,8 @@ while( -arg )
while(1)
arg = arg+ptr.v;
""");
- StopNode stop = parser.parse(false).iterate(false);
- assertEquals("return 0;", stop.toString());
+ StopNode stop = parser.parse(false).iterate(true);
+ assertEquals("Stop[ return 0; return 0; ]", stop.toString());
}
@Test
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
index bfd6c309..af8fdfe9 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
@@ -6,15 +6,27 @@ import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
public class Chapter12Test {
@Test
+ public void testJig() {
+ Parser parser = new Parser(
+"""
+return 3.14;
+""");
+ StopNode stop = parser.parse(false).iterate(false);
+ assertEquals("return 3.14;", stop.toString());
+ assertEquals(3.14, Evaluator.evaluate(stop, 0));
+ }
+
+ @Test
public void testFloat() {
Parser parser = new Parser(
"""
return 3.14;
""");
- StopNode stop = parser.parse(false).iterate(true);
+ StopNode stop = parser.parse(false).iterate(false);
assertEquals("return 3.14;", stop.toString());
assertEquals(3.14, Evaluator.evaluate(stop, 0));
}
@@ -31,7 +43,7 @@ while( 1 ) {
}
return guess;
""");
- StopNode stop = parser.parse(false).iterate(true);
+ StopNode stop = parser.parse(false).iterate(false);
assertEquals("return Phi(Loop9,(flt)arg,(((ToFloat/Phi_guess)+Phi_guess)/2.0));", stop.toString());
assertEquals(3.0, Evaluator.evaluate(stop, 9));
assertEquals(1.414213562373095, Evaluator.evaluate(stop, 2));
@@ -44,8 +56,8 @@ return guess;
flt x = arg;
return x+1==x;
""");
- StopNode stop = parser.parse(false).iterate(true);
- assertEquals("return (((flt)arg+1.0)==ToFloat);", stop.toString());
+ StopNode stop = parser.parse(false).iterate(false);
+ assertEquals("return ((flt)arg==(ToFloat+1.0));", stop.toString());
assertEquals(0L, Evaluator.evaluate(stop, 1));
}
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java b/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java
index 699711fc..efd76481 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java
@@ -14,7 +14,6 @@ import static org.junit.Assert.assertTrue;
*/
public class FuzzerWrap {
- @Ignore
@Test
public void fuzzPeeps() {
var fuzzer = new Fuzzer();
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index 09bda290..ab5c9bbd 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -135,15 +135,16 @@ public class Evaluator {
case ConstantNode cons -> cons(cons);
case AddNode add -> vall(add.in(1)) + vall(add.in(2));
case AddFNode add -> vald(add.in(1)) + vald(add.in(2));
- case BoolNode.EQ eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L;
- case BoolNode.LE le -> vall(le.in(1)) <= vall(le.in(2)) ? 1L : 0L;
- case BoolNode.LT lt -> vall(lt.in(1)) < vall(lt.in(2)) ? 1L : 0L;
case BoolNode.EQF eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L;
case BoolNode.LEF le -> vald(le.in(1)) <= vald(le.in(2)) ? 1L : 0L;
case BoolNode.LTF lt -> vald(lt.in(1)) < vald(lt.in(2)) ? 1L : 0L;
+ case BoolNode.EQ eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L;
+ case BoolNode.LE le -> vall(le.in(1)) <= vall(le.in(2)) ? 1L : 0L;
+ case BoolNode.LT lt -> vall(lt.in(1)) < vall(lt.in(2)) ? 1L : 0L;
case DivNode div -> div(div);
case DivFNode div -> div(div);
case MinusNode minus -> -vall(minus.in(1));
+ case MinusFNode minus -> -vald(minus.in(1));
case MulNode mul -> vall(mul.in(1)) * vall(mul.in(2));
case MulFNode mul -> vald(mul.in(1)) * vald(mul.in(2));
case NotNode not -> isTrue(val(not.in(1))) ? 0L : 1L;
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java b/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
index 155063ab..053be297 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java
@@ -90,6 +90,7 @@ public class ScriptGenerator {
}
private static final Type TYPE_INT = new Type("int");
+ private static final Type TYPE_FLT = new Type("flt");
private static class Variable {
@@ -343,7 +344,9 @@ public class ScriptGenerator {
* @return A random type
*/
private Type getType() {
- if (structs.isEmpty() || random.nextBoolean()) return TYPE_INT;
+ int t = random.nextInt(10);
+ if( t<5 || structs.isEmpty() ) return TYPE_INT;
+ if( t<7 ) return TYPE_FLT;
var idx = random.nextInt(structs.size());
TypeStruct struct = structs.get(idx);
if (random.nextBoolean()) return struct.nullable;
@@ -415,7 +418,7 @@ public class ScriptGenerator {
indentation += INDENTATION;
for (int i=0; i<fields.length; i++) {
var fieldName = getRandomName();
- var type = generateInvalid() ? getType() : TYPE_INT;
+ var type = generateInvalid() ? getType() : (random.nextBoolean() ? TYPE_INT : TYPE_FLT);
printIndentation().append(type.name).append(" ").append(fieldName).append(";\n");
fields[i] = new TypeStruct.Field(fieldName.toString(), type);
}
@@ -679,16 +682,16 @@ public class ScriptGenerator {
*/
public void genExpression(Type type) {
if (generateInvalid()) type = getType();
- if (type != TYPE_INT) {
+ if (type != TYPE_INT && type != TYPE_FLT) {
genUnary(type);
return;
}
var num = randLog(MAX_BINARY_EXPRESSIONS_PER_EXPRESSION);
while(num-->0) {
- genUnary(TYPE_INT);
+ genUnary(type);
sb.append(BINARY_OP[random.nextInt(BINARY_OP.length)]);
}
- genUnary(TYPE_INT);
+ genUnary(type);
}
/**
@@ -696,7 +699,7 @@ public class ScriptGenerator {
*/
public void genUnary(Type type) {
if (generateInvalid()) type = getType();
- if (type != TYPE_INT) {
+ if (type != TYPE_INT && type != TYPE_FLT) {
genSuffix(type);
return;
}
@@ -704,7 +707,7 @@ public class ScriptGenerator {
while(num-->0) {
sb.append(UNARY_OP[random.nextInt(UNARY_OP.length)]);
}
- genSuffix(TYPE_INT);
+ genSuffix(type);
}
/**
@@ -712,7 +715,7 @@ public class ScriptGenerator {
*/
public void genSuffix(Type type) {
if (generateInvalid()) type = getType();
- if (type == TYPE_INT && random.nextBoolean()) {
+ if ((type == TYPE_INT || type == TYPE_FLT) && random.nextBoolean()) {
var t = getType();
if (generateInvalid()) {
var field = getRandomName();
@@ -721,7 +724,7 @@ public class ScriptGenerator {
return;
} else if (t instanceof TypeStruct s && s.fields.length > 0) {
var field = s.fields[random.nextInt(s.fields.length)];
- if (field.type == TYPE_INT) {
+ if (field.type == TYPE_INT || field.type == TYPE_FLT) {
genPrimary(t);
sb.append(".").append(field.name);
return;
@@ -762,6 +765,8 @@ public class ScriptGenerator {
case 1 -> sb.append("false");
default -> sb.append(random.nextInt(1<<(rand-2)));
}
+ } else if (type == TYPE_FLT) {
+ sb.append(random.nextFloat());
} else if (type instanceof TypeNullable n) {
if (random.nextBoolean()) {
sb.append("null");