From 5c34eeb1b236cd412ebf13b95305a72288fd9bdb Mon Sep 17 00:00:00 2001
From: Jan Gruteser <jan.gruteser@hhu.de>
Date: Thu, 2 Jan 2025 17:16:17 +0100
Subject: [PATCH] add some ActionTests and TODOs

---
 .../de/tla2b/prettyprintb/ActionsTest.java    | 197 +++++++++++++++++-
 .../prettyprintb/UnchangedVariableTest.java   |  27 ---
 2 files changed, 193 insertions(+), 31 deletions(-)
 delete mode 100644 src/test/java/de/tla2b/prettyprintb/UnchangedVariableTest.java

diff --git a/src/test/java/de/tla2b/prettyprintb/ActionsTest.java b/src/test/java/de/tla2b/prettyprintb/ActionsTest.java
index 1bdb1c7..7b7ecba 100644
--- a/src/test/java/de/tla2b/prettyprintb/ActionsTest.java
+++ b/src/test/java/de/tla2b/prettyprintb/ActionsTest.java
@@ -8,14 +8,13 @@ import static de.tla2b.util.TestUtil.compare;
 
 public class ActionsTest {
 
-	@Ignore // changed UNCHANGED translation TODO fix test
 	@Test
 	public void testOperation1() throws Exception {
 		final String module = "-------------- MODULE Testing ----------------\n"
 			+ "EXTENDS Naturals \n"
 			+ "VARIABLES x, y \n"
 			+ "Init == x = 1 /\\ y = 1 \n"
-			+ "Next == x' = 1 /\\ UNCHANGED y \n"
+			+ "Next == x' \\in 1..5 /\\ UNCHANGED y \n"
 			+ "=================================";
 
 		final String expected = "MACHINE Testing\n"
@@ -23,8 +22,8 @@ public class ActionsTest {
 			+ "INVARIANT x : INTEGER & y : INTEGER \n"
 			+ "INITIALISATION  x, y:(x = 1 & y = 1) \n"
 			+ "OPERATIONS \n"
-			+ " Next = ANY y_n WHERE y_n : INTEGER "
-			+ " & y_n = y THEN x,y := 1,y_n END \n"
+			+ " Next = ANY x_n WHERE x_n : INTEGER "
+			+ " & x_n : 1..5 & TRUE = TRUE THEN x := x_n END \n"
 			+ "END";
 		compare(expected, module);
 	}
@@ -65,6 +64,196 @@ public class ActionsTest {
 		compare(expected, module);
 	}
 
+	@Test
+	public void testOperation4() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x, y \n"
+				+ "Init == x = 1 /\\ y = 1 \n"
+				+ "Next == x < 2 /\\ x' < x /\\ y' > y + x\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "VARIABLES x, y\n"
+				+ "INVARIANT x : INTEGER & y : INTEGER \n"
+				+ "INITIALISATION  x, y:(x = 1 & y = 1) \n"
+				+ "OPERATIONS Next = ANY x_n, y_n WHERE x < 2 & x_n : INTEGER & y_n : INTEGER & x_n < x & y_n > y + x THEN x,y := x_n,y_n END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Test
+	public void testUnchangedOnTopLevel() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x, y \n"
+				+ "Init == x = 1 /\\ y = 1 \n"
+				+ "Next == x < 2 /\\ x' = 1 /\\ UNCHANGED y\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "VARIABLES x, y\n"
+				+ "INVARIANT x : INTEGER & y : INTEGER \n"
+				+ "INITIALISATION  x, y:(x = 1 & y = 1) \n"
+				+ "OPERATIONS Next = SELECT x < 2 & TRUE = TRUE & TRUE = TRUE THEN x:= 1 END \n"
+				+ "END";
+		compare(expected, module);
+		// TODO: get rid of TRUE = TRUE
+	}
+
+	@Test
+	public void testUnchangedOnly() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x, y \n"
+				+ "Init == x = 1 /\\ y = 1 \n"
+				+ "Next == UNCHANGED <<x,y>>\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "VARIABLES x, y\n"
+				+ "INVARIANT x : INTEGER & y : INTEGER \n"
+				+ "INITIALISATION  x, y:(x = 1 & y = 1) \n"
+				+ "OPERATIONS Next = BEGIN skip END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Test
+	public void testSpecification() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x \n"
+				+ "Init == x = 1 \n"
+				+ "Next == x' \\in 1..5 \n"
+				+ "Spec == Init /\\ [][Next]_x \n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "DEFINITIONS Init == x=1 \n"
+				+ "VARIABLES x \n"
+				+ "INVARIANT x : INTEGER \n"
+				+ "INITIALISATION  x:(Init) \n"
+				+ "OPERATIONS \n"
+				+ " Next = ANY x_n WHERE x_n : INTEGER "
+				+ " & x_n : 1..5 THEN x := x_n END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Ignore
+	@Test
+	public void testPrimedTuple() throws Exception {
+		// TODO: implement
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x, y, b \n"
+				+ "Init == <<x,y,b>> = <<1,1,FALSE>> \n"
+				+ "Next == <<x,y,b>>' = <<x+1,y-1,~b>>\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "VARIABLES x, y, b\n"
+				+ "INVARIANT x : INTEGER & y : INTEGER & b : BOOL \n"
+				+ "INITIALISATION  x, y, b:(x = 1 & y = 1 & b = FALSE) \n"
+				+ "OPERATIONS Next = BEGIN x,y,b := x+1,y-1,bool(b = FALSE) END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Ignore
+	@Test
+	public void testPrimedDefinition() throws Exception {
+		// TODO: implement
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x, y, b \n"
+				+ "Init == <<x,y,b>> = <<1,1,FALSE>> \n"
+				+ "NextDef(s,t,u) == s=t+2 /\\ u=TRUE \n"
+				+ "Next == NextDef(x,y,b)' /\\ y'=y-1 \n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "VARIABLES x, y, b\n"
+				+ "INVARIANT x : INTEGER & y : INTEGER & b : BOOL \n"
+				+ "INITIALISATION  x, y, b:(x = 1 & y = 1 & b = FALSE) \n"
+				+ "OPERATIONS Next = ANY x_n, y_n WHERE x_n : INTEGER & y_n : INTEGER & x_n = y_n+2 & y_n = y-1 THEN x,y,b := x_n,y_n,TRUE END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Test
+	public void testAlwaysDisabled() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "Init == TRUE \n"
+				+ "Next == FALSE\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "OPERATIONS Next = SELECT FALSE = TRUE THEN skip END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Test
+	public void testAlwaysEnabled() throws Exception {
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "Init == TRUE \n"
+				+ "Next == TRUE\n"
+				+ "=================================";
+
+		final String expected = "MACHINE Testing\n"
+				+ "OPERATIONS Next = SELECT TRUE = TRUE THEN skip END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Ignore
+	@Test
+	public void testAngleAct() throws Exception {
+		// TODO: implement?
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x \n"
+				+ "AngleActDef == x' \\in 1..3 \n"
+				+ "Init == x = 1 \n"
+				+ "Next == <<AngleActDef>>_x \n"
+				+ "=================================";
+
+		// <<AngleAct>>_x means: AngleAct AND x'/=x
+		final String expected = "MACHINE Testing\n"
+				+ "DEFINITIONS AngleActDef == x_n : 1..3"
+				+ "VARIABLES x\n"
+				+ "INVARIANT x : INTEGER \n"
+				+ "INITIALISATION  x:(x = 1) \n"
+				+ "OPERATIONS Next = ANY x_n WHERE x_n : INTEGER & (AngleActDef & x_n /= x) THEN x := x_n END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
+	@Ignore
+	@Test
+	public void testSquaredAct() throws Exception {
+		// TODO: do we need a translation for stuttering steps? => implement?
+		final String module = "-------------- MODULE Testing ----------------\n"
+				+ "EXTENDS Naturals \n"
+				+ "VARIABLES x \n"
+				+ "SquaredActDef == x' \\in 1..3 \n"
+				+ "Init == x = 1 \n"
+				+ "Next == [SquaredActDef]_x \n"
+				+ "=================================";
+
+		// [SquaredAct]_x means: SquaredAct OR x'=x
+		final String expected = "MACHINE Testing\n"
+				+ "DEFINITIONS SquaredActDef == x_n = 1"
+				+ "VARIABLES x\n"
+				+ "INVARIANT x : INTEGER \n"
+				+ "INITIALISATION  x:(x = 1) \n"
+				+ "OPERATIONS Next = ANY x_n WHERE x_n : INTEGER & (SquaredActDef or x_n = x) THEN x := x_n END \n"
+				+ "END";
+		compare(expected, module);
+	}
+
 	@Test(expected = SemanticErrorException.class)
 	public void testMissingInit() throws Exception {
 		final String module = "-------------- MODULE Testing ----------------\n"
diff --git a/src/test/java/de/tla2b/prettyprintb/UnchangedVariableTest.java b/src/test/java/de/tla2b/prettyprintb/UnchangedVariableTest.java
deleted file mode 100644
index 2f21a70..0000000
--- a/src/test/java/de/tla2b/prettyprintb/UnchangedVariableTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package de.tla2b.prettyprintb;
-
-import org.junit.Test;
-
-import static de.tla2b.util.TestUtil.compare;
-
-public class UnchangedVariableTest {
-
-
-	@Test
-	public void testUnchangedOnTopLevel() throws Exception {
-		final String module = "-------------- MODULE Testing ----------------\n"
-			+ "EXTENDS Naturals \n"
-			+ "VARIABLES x, y \n"
-			+ "Init == x = 1 /\\ y = 1 \n"
-			+ "Next == x < 2 /\\ x' = 1 /\\ UNCHANGED y\n"
-			+ "=================================";
-
-		final String expected = "MACHINE Testing\n"
-			+ "VARIABLES x, y\n"
-			+ "INVARIANT x : INTEGER & y : INTEGER \n"
-			+ "INITIALISATION  x, y:(x = 1 & y = 1) \n"
-			+ "OPERATIONS Next = SELECT x < 2 & TRUE = TRUE & TRUE = TRUE THEN x:= 1 END \n"
-			+ "END";
-		compare(expected, module);
-	}
-}
-- 
GitLab