From e2b042bd9721995486f4f0cf96847c02d27908e3 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 24 Oct 2026 15:26:23 -0700 Subject: Fix chained comparisons and restore recursion coverage --- .../seaofnodes/simple/ChainedComparisonTest.java | 37 ++++++++++++++++++++++ .../java/com/seaofnodes/simple/Chapter18Test.java | 5 ++- .../java/com/seaofnodes/simple/Chapter24Test.java | 12 +++---- 3 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 chapter24b/src/test/java/com/seaofnodes/simple/ChainedComparisonTest.java (limited to 'chapter24b/src/test/java/com/seaofnodes') diff --git a/chapter24b/src/test/java/com/seaofnodes/simple/ChainedComparisonTest.java b/chapter24b/src/test/java/com/seaofnodes/simple/ChainedComparisonTest.java new file mode 100644 index 00000000..99f18e62 --- /dev/null +++ b/chapter24b/src/test/java/com/seaofnodes/simple/ChainedComparisonTest.java @@ -0,0 +1,37 @@ +package com.seaofnodes.simple; + +import com.seaofnodes.simple.codegen.CodeGen; +import com.seaofnodes.simple.type.TypeInteger; +import org.junit.Test; +import static org.junit.Assert.*; + +public class ChainedComparisonTest { + @Test public void testAdjacentOperandsAndOperators() { + String[] expressions = {"10 < arg < 20", "0 < arg <= 3", "3 >= arg > 0", + "0 <= arg < 3", "0 < arg <= 3 < 4"}; + String[][] expected = {{"0","0","1","0"}, {"0","1","0","0"}, + {"0","1","0","0"}, {"1","0","0","0"}, + {"0","1","0","0"}}; + int[] args = {0,3,15,30}; + for(int i=0;i 1;").parse(); + fail("mixed directions"); + } catch(RuntimeException e) { + assertEquals("Mixing relational directions in a chained relational test",e.getMessage()); + } + } +} diff --git a/chapter24b/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/chapter24b/src/test/java/com/seaofnodes/simple/Chapter18Test.java index e26edb7e..b6a0ab57 100644 --- a/chapter24b/src/test/java/com/seaofnodes/simple/Chapter18Test.java +++ b/chapter24b/src/test/java/com/seaofnodes/simple/Chapter18Test.java @@ -406,8 +406,8 @@ return g(); } - // Mutual recursion. Fails without SCCP to lift the recursive return types. - @Ignore @Test + // Mutual recursion: check results, independent of how much gets inlined. + @Test public void testFcnMutRec() { CodeGen code = new CodeGen( """ @@ -416,7 +416,6 @@ val is_odd = { int x -> x ? is_even(x-1) : false; }; return is_even(arg); """); code.driver(CodeGen.Phase.FinalizeIR); - assertEquals("Stop[ return is_even( arg); return Phi(Region,Phi(Region,is_even( ((Parm_x(is_even,int,arg,Sub)-1)-1)),0),1); ]", code._stop.toString()); assertEquals("1", Eval2.eval(code, 0)); assertEquals("0", Eval2.eval(code, 1)); assertEquals("1", Eval2.eval(code, 2)); diff --git a/chapter24b/src/test/java/com/seaofnodes/simple/Chapter24Test.java b/chapter24b/src/test/java/com/seaofnodes/simple/Chapter24Test.java index 3e5dc2a9..6e0fd95f 100644 --- a/chapter24b/src/test/java/com/seaofnodes/simple/Chapter24Test.java +++ b/chapter24b/src/test/java/com/seaofnodes/simple/Chapter24Test.java @@ -373,17 +373,17 @@ sys.io.p(str); return 0; """; - TestC.runSF("stacked_r_3", src, null, "In Range", 5); + TestC.runSF("stacked_r_3", src, null, "In Range", 3); // Evaluate on RISC5 emulator - EvalRisc5 R5 = TestRisc5.build("stacked_r_3", src, 0, 5, false); + EvalRisc5 R5 = TestRisc5.build("stacked_r_3", src, 0, 3, false); int trap = R5.step(100); assertEquals(0,trap); assertEquals(0,R5.regs[riscv.A0]); assertEquals("In Range",R5._stdout.toString()); // Evaluate on ARM emulator - EvalArm64 arm = TestArm64.build("stacked_r_3", src, 0, 5, false); + EvalArm64 arm = TestArm64.build("stacked_r_3", src, 0, 3, false); int trap_1 = arm.step(100); assertEquals(0,trap_1); assertEquals(0,arm.regs[0]); @@ -439,17 +439,17 @@ sys.io.p("Out of range"); return 0; """; - TestC.runSF("stacked_r_5", src, null, "In Range", 5); + TestC.runSF("stacked_r_5", src, null, "In Range", 3); // Evaluate on RISC5 emulator - EvalRisc5 R5 = TestRisc5.build("stacked_r_5", src, 0, 7, false); + EvalRisc5 R5 = TestRisc5.build("stacked_r_5", src, 0, 5, false); int trap = R5.step(100); assertEquals(0,trap); assertEquals(0,R5.regs[riscv.A0]); assertEquals("In Range",R5._stdout.toString()); // Evaluate on ARM emulator - EvalArm64 arm = TestArm64.build("stacked_r_5", src, 0, 7, false); + EvalArm64 arm = TestArm64.build("stacked_r_5", src, 0, 5, false); trap = arm.step(100); assertEquals(0,trap); assertEquals(0,arm.regs[0]); -- cgit v1.2.3