Skip to content
Snippets Groups Projects
Commit 5dbda7d1 authored by Hugo Roussel's avatar Hugo Roussel
Browse files

Moved to Junit 5 and add tests

Moved to Junit 5.
Added tests for AMOEBAonAMAK's backup system.
parent 721e9e70
Branches
No related tags found
2 merge requests!3Merge masters,!2Merge dev into develop
Showing
with 270 additions and 76 deletions
......@@ -22,11 +22,6 @@
</build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
......
package agent;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.Agent;
import fr.irit.smac.amak.CommunicatingAgent;
......@@ -16,7 +16,7 @@ public class TestAgentBasicsOperations extends ObjectsForAgentTesting {
private Agent<TestAMAS, TestEnv> agent;
@Before
@BeforeEach
public void setUp() {
super.setup();
......
......@@ -5,10 +5,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Collection;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.messaging.IAmakEnvelope;
import testutils.ObjectsForAgentTesting;
......@@ -19,7 +19,7 @@ public class TestAgentMessagingFeature extends ObjectsForAgentTesting {
public ObjectsForMessagingTesting omt;
@Before
@BeforeEach
public void omt() {
omt = new ObjectsForMessagingTesting();
}
......@@ -45,7 +45,7 @@ public class TestAgentMessagingFeature extends ObjectsForAgentTesting {
* Since I was never able to make it fail reliably, I suspect a badly designed test,
* And decided to deactivate it.
*/
@Ignore @Test
@Disabled @Test
public void getAllReceivedMessagesSendWithRawID() throws InterruptedException {
communicantAgent1.run();
boolean sendingSuccessful = communicantAgent1.sendMessage(omt.MSG_1, ObjectsForAgentTesting.RAW_ID3);
......@@ -89,7 +89,7 @@ public class TestAgentMessagingFeature extends ObjectsForAgentTesting {
assertEquals(omt.MSG_1, msg);
}
@After
@AfterEach
public void teardown() {
omt.teardown();
}
......
......@@ -7,8 +7,8 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.junit.After;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.messaging.IAmakEnvelope;
import fr.irit.smac.amak.messaging.IAmakMessage;
......@@ -53,7 +53,7 @@ public class TestAgentMessagingReaderAllMsg extends ObjectsForAgentTesting {
}
@After
@AfterEach
public void teardown() {
omt.teardown();
}
......
package agent;
import static org.junit.Assert.assertFalse;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.Amas;
import fr.irit.smac.amak.CommunicatingAgent;
......@@ -25,8 +26,9 @@ public class TestAgentTwoPhaseScheduling {
private TestAMAS amas;
private static final Semaphore semaphoreToCreateBlockingState = new Semaphore(1);
@Before
@BeforeEach
public void setup() {
Configuration.commandLineMode = true;
ObjectsForAgentTesting o = new ObjectsForAgentTesting();
TestEnv env = o.new TestEnv();
amas = new TestAMAS(env);
......@@ -53,7 +55,7 @@ public class TestAgentTwoPhaseScheduling {
System.out.println("main : wait for token");
boolean hasToken = semaphoreToWaitAgentEnding.tryAcquire(2, 10, TimeUnit.SECONDS);
System.out.println("main : token release or expire, hasToken=" + hasToken);
assertFalse("None token should be available !", hasToken);
assertFalse(hasToken, "None token should be available !");
assertEquals(1, perceptionIsDone.get());
assertEquals(0, decideAndActDoneWithoutAllPerceptions.get());
}
......
package messaging;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.List;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.messaging.IAmakEnvelope;
import fr.irit.smac.amak.messaging.IAmakMessage;
......
package messaging;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.List;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import fr.irit.smac.amak.messaging.IAmakEnvelope;
import fr.irit.smac.amak.messaging.IAmakMessage;
......
package testutils;
import org.junit.Before;
import org.junit.jupiter.api.BeforeEach;
import fr.irit.smac.amak.Amas;
import fr.irit.smac.amak.CommunicatingAgent;
......@@ -18,7 +19,7 @@ public class ObjectsForAgentTesting {
public TestEnv env;
@Before
@BeforeEach
public void setup() {
Configuration.commandLineMode = true;
......
package testutils;
import org.junit.After;
import org.junit.jupiter.api.AfterEach;
import fr.irit.smac.amak.aid.AddressableAID;
import fr.irit.smac.amak.internal.messaging.ImplMessagingServiceAgentMessaging;
......@@ -52,7 +54,7 @@ public class ObjectsForMessagingTesting {
return address;
}
@After
@AfterEach
public void teardown() {
messagingServices.disposeAll();
}
......
......@@ -18,14 +18,7 @@
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<testSourceDirectory>tests</testSourceDirectory>
</build>
<dependencies>
......
package agents;
import static org.junit.jupiter.api.Assertions.assertTrue;
import agents.percept.Percept;
import fr.irit.smac.amak.Agent;
import fr.irit.smac.amak.tools.Loggable;
......@@ -17,8 +15,6 @@ public abstract class AmoebaAgent extends Agent<AMOEBA, World> implements Loggab
protected String name;
private boolean dying;
static AmoebaAgent lastDeath = null;
protected RenderStrategy renderStrategy;
/**
......@@ -28,7 +24,6 @@ public abstract class AmoebaAgent extends Agent<AMOEBA, World> implements Loggab
public AmoebaAgent(AMOEBA amas, Object... params) {
super(amas, params);
this.dying = false;
assertTrue(this != lastDeath);
}
@Override
......@@ -75,7 +70,6 @@ public abstract class AmoebaAgent extends Agent<AMOEBA, World> implements Loggab
}
super.destroy();
logger().debug("CYCLE "+getAmas().getCycle(), "Agent %s destroyed.", toString());
lastDeath = this;
}
/**
......
package experiments;
//Packages importer afin d'utiliser l'objet File
//Packages a importer afin d'utiliser l'objet File
import java.io.FileNotFoundException;
import java.io.PrintWriter;
......
......@@ -45,8 +45,8 @@ public class F_XY_System implements StudiedSystem {
result = getResult(x, y);
out.put("px", x);
out.put("py", y);
out.put("px0", x);
out.put("px1", y);
out.put("oracle", result);
return out;
}
......
......@@ -4,7 +4,6 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
......@@ -16,6 +15,7 @@ import gui.saveExplorer.SaveExplorer;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.FileChooser;
import utils.DeleteDirectory;
/**
* An helper class that handle save, autosave, and load needs of an AMOEBA.
......@@ -58,7 +58,7 @@ public class SaveHelper {
/**
* Path to the save directory.
*/
private Path dir;
public Path dir;
private AMOEBA amoeba;
......@@ -101,7 +101,7 @@ public class SaveHelper {
AmoebaWindow.addOnCloseAction(()-> {
if(deleteFolderOnClose) {
try {
deleteDirectoryRecursion(dir);
DeleteDirectory.deleteDirectoryRecursion(dir);
} catch (IOException e) {
e.printStackTrace();
System.err.println("Failed to delete saves files on close.");
......@@ -112,29 +112,21 @@ public class SaveHelper {
}
}
/**
* Delete a directory and everything in it, recursively.
* @param path
* @throws IOException
*/
private void deleteDirectoryRecursion(Path path) throws IOException {
if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) {
try (DirectoryStream<Path> entries = Files.newDirectoryStream(path)) {
for (Path entry : entries) {
deleteDirectoryRecursion(entry);
}
}
}
Files.delete(path);
}
/**
* Load a save pointed by path.
* @param path path to the save.
*/
public void load(String path) {
File f = new File(path);
backupSystem.load(f);
load(f);
}
/**
* Load a save from file.
* @param path path to the save.
*/
public void load(File file) {
backupSystem.load(file);
}
/**
......@@ -143,8 +135,16 @@ public class SaveHelper {
*/
public void save(String path) {
File f = new File(path);
save(f);
}
/**
* Create a save in file.
* @param path path of the new save
*/
public void save(File file) {
backupSystem.setLoadPresetContext(true);
backupSystem.save(f);
backupSystem.save(file);
}
/**
......
package utils;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
public class DeleteDirectory {
/**
* Delete a directory and everything in it, recursively.
* @param path
* @throws IOException
*/
public static void deleteDirectoryRecursion(Path path) throws IOException {
if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) {
try (DirectoryStream<Path> entries = Files.newDirectoryStream(path)) {
for (Path entry : entries) {
deleteDirectoryRecursion(entry);
}
}
}
Files.delete(path);
}
}
package utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Round {
/**
* Round a value to its nth decimal
* @param value
* @param places
* @return
*/
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
}
package savesystem;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import experiments.F_XY_System;
import fr.irit.smac.amak.Configuration;
import kernel.AMOEBA;
import kernel.StudiedSystem;
import utils.DeleteDirectory;
import utils.Round;
public class TestBackupSystem {
AMOEBA amoeba;
static final int SIZE = 100;
static final int ROUNDING_DECIMAL = 5;
static HashMap<String, Double>[] train = new HashMap[SIZE];
static HashMap<String, Double>[] test = new HashMap[SIZE];
@BeforeAll
public static void setupTrainTestValues() {
StudiedSystem studiedSystem = new F_XY_System(50.0);
for (int i = 0; i < train.length; i++) {
studiedSystem.playOneStep();
train[i] = studiedSystem.getOutput();
}
for (int i = 0; i < test.length; i++) {
studiedSystem.playOneStep();
test[i] = studiedSystem.getOutput();
}
}
@BeforeEach
public void setup() {
Configuration.allowedSimultaneousAgentsExecution = 1;
Configuration.commandLineMode = true;
StudiedSystem studiedSystem = new F_XY_System(50.0);
amoeba = new AMOEBA("resources/twoDimensionsLauncher.xml", studiedSystem);
for (int i = 0; i < train.length; i++) {
studiedSystem.playOneStep();
amoeba.learn(train[i]);
}
}
@Test
public void testSaveLoadSize() throws IOException {
File tempFile = File.createTempFile("testSave", "xml");
tempFile.deleteOnExit();
amoeba.saver.save(tempFile);
StudiedSystem studiedSystem = new F_XY_System(50.0);
AMOEBA amoebaLoad = new AMOEBA(tempFile.getAbsolutePath(), studiedSystem);
/*
* Improvement idea : defining equals on agent, and then test equality
*/
assertEquals(amoeba.getAgents().size(), amoebaLoad.getAgents().size());
try {
DeleteDirectory.deleteDirectoryRecursion(amoeba.saver.dir);
DeleteDirectory.deleteDirectoryRecursion(amoebaLoad.saver.dir);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test @Disabled
public void testSaveLoadRequestSameAmoeba() throws IOException {
File tempFile = File.createTempFile("testSave", "xml");
tempFile.deleteOnExit();
Double[] requestOriginal = new Double[SIZE];
Double[] requestLoaded = new Double[SIZE];
amoeba.saver.save(tempFile);
for (int i = 0; i < test.length; i++) {
requestOriginal[i] = Round.round(amoeba.request(test[i]), ROUNDING_DECIMAL);
}
amoeba.saver.load(tempFile);
for (int i = 0; i < test.length; i++) {
requestLoaded[i] = Round.round(amoeba.request(test[i]), ROUNDING_DECIMAL);
}
assertArrayEquals(requestOriginal, requestLoaded);
try {
DeleteDirectory.deleteDirectoryRecursion(amoeba.saver.dir);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test @Disabled
public void testSaveLoadRequestDiffAmoeba() throws IOException {
File tempFile = File.createTempFile("testSave", "xml");
tempFile.deleteOnExit();
Double[] requestOriginal = new Double[SIZE];
Double[] requestLoaded = new Double[SIZE];
amoeba.saver.save(tempFile);
for (int i = 0; i < test.length; i++) {
requestOriginal[i] = Round.round(amoeba.request(test[i]), ROUNDING_DECIMAL);
}
StudiedSystem studiedSystem = new F_XY_System(50.0);
AMOEBA amoebaLoad = new AMOEBA(tempFile.getAbsolutePath(), studiedSystem);
amoebaLoad.saver.load(tempFile);
for (int i = 0; i < test.length; i++) {
requestLoaded[i] = Round.round(amoebaLoad.request(test[i]), ROUNDING_DECIMAL);
}
assertArrayEquals(requestOriginal, requestLoaded);
try {
DeleteDirectory.deleteDirectoryRecursion(amoeba.saver.dir);
DeleteDirectory.deleteDirectoryRecursion(amoebaLoad.saver.dir);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test @Disabled
public void testSaveLoadRequestDiffAmoebaNew() throws IOException {
File tempFile = File.createTempFile("testSave", "xml");
tempFile.deleteOnExit();
Double[] requestLoaded1 = new Double[SIZE];
Double[] requestLoaded2 = new Double[SIZE];
amoeba.saver.save(tempFile);
AMOEBA amoebaLoad1 = new AMOEBA(tempFile.getAbsolutePath(), null);
amoebaLoad1.saver.load(tempFile);
for (int i = 0; i < test.length; i++) {
requestLoaded1[i] = Round.round(amoebaLoad1.request(test[i]), ROUNDING_DECIMAL);
}
AMOEBA amoebaLoad2 = new AMOEBA(tempFile.getAbsolutePath(), null);
amoebaLoad2.saver.load(tempFile);
for (int i = 0; i < test.length; i++) {
requestLoaded2[i] = Round.round(amoebaLoad2.request(test[i]), ROUNDING_DECIMAL);
}
assertArrayEquals(requestLoaded1, requestLoaded2);
try {
DeleteDirectory.deleteDirectoryRecursion(amoeba.saver.dir);
DeleteDirectory.deleteDirectoryRecursion(amoebaLoad1.saver.dir);
DeleteDirectory.deleteDirectoryRecursion(amoebaLoad2.saver.dir);
} catch (IOException e) {
e.printStackTrace();
}
}
}
......@@ -42,6 +42,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<reuseForks>false</reuseForks>
<forkCount>1C</forkCount>
......@@ -76,10 +77,9 @@
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment