From 69e5c14e71d462d3b36595e13637ced224e6983c Mon Sep 17 00:00:00 2001
From: massat <jean-luc.massat@univ-amu.fr>
Date: Thu, 3 Oct 2024 17:11:15 +0200
Subject: [PATCH] Add tests

---
 .gitignore                                    |   5 +-
 .idea/workspace.xml                           | 102 ++++++++++++--
 src/main/java/fr/univamu/solver/Main.java     |   2 +-
 .../java/fr/univamu/solver/TestInterval.java  |  29 ++++
 .../java/fr/univamu/solver/TestSolver.java    | 129 ++++++++++++++++++
 5 files changed, 251 insertions(+), 16 deletions(-)
 create mode 100644 src/test/java/fr/univamu/solver/TestInterval.java
 create mode 100644 src/test/java/fr/univamu/solver/TestSolver.java

diff --git a/.gitignore b/.gitignore
index b63da45..e7a3b7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,4 +39,7 @@ bin/
 .vscode/
 
 ### Mac OS ###
-.DS_Store
\ No newline at end of file
+.DS_Store
+/src/test/java/fr/univamu/solver/PrivateTestInterval.java
+/src/test/java/fr/univamu/solver/PrivateTestReducer.java
+/src/test/java/fr/univamu/solver/PrivateTestSolver.java
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 625c556..eeb497a 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,18 +4,12 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="a17b64ea-8b68-4cd2-aba6-1780c674b35e" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/gradle.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/build.gradle.kts" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.jar" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/gradlew" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/gradlew.bat" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/settings.gradle.kts" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/fr/univamu/solver/Main.java" afterDir="false" />
+    <list default="true" id="a17b64ea-8b68-4cd2-aba6-1780c674b35e" name="Changes" comment="Create">
+      <change afterPath="$PROJECT_DIR$/src/test/java/fr/univamu/solver/TestInterval.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/test/java/fr/univamu/solver/TestSolver.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/fr/univamu/solver/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/fr/univamu/solver/Main.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -41,13 +35,21 @@
   </component>
   <component name="PropertiesComponent"><![CDATA[{
   "keyToString": {
+    "Gradle.GL-Solver [:fr.univamu.solver.Main.main()].executor": "Run",
+    "Gradle.Tests in 'GL-Solver'.executor": "Run",
+    "Gradle.Tests in 'fr.univamu.solver'.executor": "Run",
     "RunOnceActivity.ShowReadmeOnStart": "true",
     "git-widget-placeholder": "master",
+    "kotlin-language-version-configured": "true",
+    "node.js.detected.package.eslint": "true",
+    "node.js.detected.package.tslint": "true",
+    "node.js.selected.package.eslint": "(autodetect)",
+    "node.js.selected.package.tslint": "(autodetect)",
     "nodejs_package_manager_path": "npm",
     "vue.rearranger.settings.migration": "true"
   }
 }]]></component>
-  <component name="RunManager">
+  <component name="RunManager" selected="Gradle.Tests in 'GL-Solver'">
     <configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <option name="MAIN_CLASS_NAME" value="fr.univamu.solver.Main" />
       <module name="GL-Solver.main" />
@@ -61,8 +63,56 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration name="Tests in 'GL-Solver'" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" value="" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value=":test" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
+      <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+      <DebugAllEnabled>false</DebugAllEnabled>
+      <RunAsTest>true</RunAsTest>
+      <method v="2" />
+    </configuration>
+    <configuration name="Tests in 'fr.univamu.solver'" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" value="" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value=":test" />
+            <option value="--tests" />
+            <option value="&quot;fr.univamu.solver.*&quot;" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
+      <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
+      <DebugAllEnabled>false</DebugAllEnabled>
+      <RunAsTest>true</RunAsTest>
+      <method v="2" />
+    </configuration>
     <recent_temporary>
       <list>
+        <item itemvalue="Gradle.Tests in 'GL-Solver'" />
+        <item itemvalue="Gradle.Tests in 'fr.univamu.solver'" />
         <item itemvalue="Application.Main" />
       </list>
     </recent_temporary>
@@ -83,8 +133,32 @@
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
       <updated>1727967430355</updated>
-      <workItem from="1727967431394" duration="53000" />
+      <workItem from="1727967431394" duration="749000" />
+    </task>
+    <task id="LOCAL-00001" summary="Create">
+      <option name="closed" value="true" />
+      <created>1727967673293</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1727967673293</updated>
     </task>
+    <task id="LOCAL-00002" summary="Create">
+      <option name="closed" value="true" />
+      <created>1727967931296</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1727967931296</updated>
+    </task>
+    <option name="localTasksCounter" value="3" />
     <servers />
   </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="Create" />
+    <option name="LAST_COMMIT_MESSAGE" value="Create" />
+  </component>
 </project>
\ No newline at end of file
diff --git a/src/main/java/fr/univamu/solver/Main.java b/src/main/java/fr/univamu/solver/Main.java
index 364b9bc..2ac06cf 100644
--- a/src/main/java/fr/univamu/solver/Main.java
+++ b/src/main/java/fr/univamu/solver/Main.java
@@ -2,6 +2,6 @@ package fr.univamu.solver;
 
 public class Main {
     public static void main(String[] args) {
-        System.out.println("Hello world!");
+        System.out.println("Solver!");
     }
 }
\ No newline at end of file
diff --git a/src/test/java/fr/univamu/solver/TestInterval.java b/src/test/java/fr/univamu/solver/TestInterval.java
new file mode 100644
index 0000000..43f7069
--- /dev/null
+++ b/src/test/java/fr/univamu/solver/TestInterval.java
@@ -0,0 +1,29 @@
+package fr.univamu.solver;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+public class TestInterval {
+	
+	@Test
+	void testEmpty() {
+		var i = new Interval(20, 10);
+		assertTrue(i.isEmpty());
+	}
+
+	@Test
+	void testFixed() {
+		var i = new Interval(20, 20);
+		assertTrue(i.isFixed());
+	}
+
+	@Test
+	void testAdd() {
+		var a = new Interval(20, 30);
+		var b = new Interval(-33, -5);
+		assertEquals("[-13,25]", a.add(b).toString());
+	}
+
+}
diff --git a/src/test/java/fr/univamu/solver/TestSolver.java b/src/test/java/fr/univamu/solver/TestSolver.java
new file mode 100644
index 0000000..37900a7
--- /dev/null
+++ b/src/test/java/fr/univamu/solver/TestSolver.java
@@ -0,0 +1,129 @@
+
+package fr.univamu.solver;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class TestSolver {
+
+	@Test
+	public void testDomain() {
+		var solver = new Solver();
+		solver.newVar().domain(0, 9);
+		solver.newVar().domain(100, 109);
+		assertEquals(100, solver.solve());
+	}
+
+	@Test
+	public void testDomainEmpty() {
+		var solver = new Solver();
+		solver.newVar().domain(20, 10);
+		assertEquals(0, solver.solve());
+	}
+
+	@Test
+	public void testConstraintAdd() {
+		var solver = new Solver();
+		var a = solver.newVar().domain(0, 9);
+		var b = solver.newVar().domain(0, 9);
+		solver.addConstraint(5, "=", a, "+", b);// 5=A+B
+		assertEquals(6, solver.solve());
+	}
+
+	@Test
+	public void testConstraintSub() {
+		var solver = new Solver();
+		var a = solver.newVar().domain(0, 9);
+		var b = solver.newVar().domain(0, 9);
+		solver.addConstraint(5, "=", a, "-", b);// 5=A-B
+		assertEquals(5, solver.solve());
+	}
+
+	@Test
+	public void testConstraintMul() {
+		var solver = new Solver();
+		var a = solver.newVar().domain(0, 9);
+		var b = solver.newVar().domain(0, 9);
+		solver.addConstraint(a, "=", b, "*", 2);// A=B*2
+		assertEquals(5, solver.solve());
+	}
+
+	@Test
+	public void testConstraintDiv() {
+		var solver = new Solver();
+		var a = solver.newVar().domain(0, 99);
+		var b = solver.newVar().domain(0, 9);
+		solver.addConstraint(a, "=", b, "/", 2);// A=B/2
+		assertEquals(10, solver.solve());
+	}
+
+	@Test
+	public void testConstraintEq() {
+		var solver = new Solver();
+		var a = solver.newVar().domain(0, 5);
+		var b = solver.newVar().domain(4, 9);
+		solver.addConstraint(a, "=", b);
+		assertEquals(2, solver.solve());
+	}
+
+	@Test
+	public void testConstraintDiff() {
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(0, 9);
+		solver.addConstraint(a, "<>", 5);
+		assertEquals(9, solver.solve());
+	}
+
+	@Test
+	public void testConstraintGreater() {
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(0, 9);
+		solver.addConstraint(a, ">", 5);
+		assertEquals(4, solver.solve());
+	}
+
+	@Test
+	public void testConstraintGreaterEqual() {
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(0, 9);
+		solver.addConstraint(a, ">=", 5);
+		assertEquals(5, solver.solve());
+	}
+
+	@Test
+	public void testConstraintLess() {
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(0, 9);
+		solver.addConstraint(a, "<", 3);
+		assertEquals(3, solver.solve());
+	}
+
+	@Test
+	public void testConstraintLessEqual() {
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(0, 9);
+		solver.addConstraint(a, "<=", 6);
+		assertEquals(7, solver.solve());
+	}
+
+	@Test
+	public void testABC() {
+		// résoudre AB + BA = CBC
+		var solver = new Solver();
+		var a = solver.newVar("A").domain(1, 9);
+		var b = solver.newVar("B").domain(1, 9);
+		var c = solver.newVar("C").domain(1, 9);
+		solver.addConstraint(//
+				a, "*", 10, "+", b, "+", // AB +
+				b, "*", 10, "+", a, "=", // BA =
+				c, "*", 100, "+", b, "*", 10, "+", c); // CBC
+		assertEquals(1, solver.solve());
+		assertEquals(6499207L, solver.getNodesCounter());
+		// nouvelle stratégie
+		solver.reduceAndCheckIntervalsStrategy();
+		assertEquals(1, solver.solve());
+		assertEquals(954264L, solver.getNodesCounter());
+	}
+
+}
-- 
GitLab