diff --git a/liquidjava-verifier/pom.xml b/liquidjava-verifier/pom.xml
index 5b42f4cb..4734b1aa 100644
--- a/liquidjava-verifier/pom.xml
+++ b/liquidjava-verifier/pom.xml
@@ -39,6 +39,45 @@
+org.jacoco
+jacoco-maven-plugin
+0.8.14
+
+
+default-prepare-agent
+
+prepare-agent
+
+
+
+default-report
+
+report
+
+
+
+default-check
+
+check
+
+
+
+
+BUNDLE
+
+
+COMPLEXITY
+COVEREDRATIO
+0.40
+
+
+
+
+
+
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
${pVersion.compiler}
diff --git a/liquidjava-verifier/src/test/java/liquidjava/rj_language/TestLiteralString.java b/liquidjava-verifier/src/test/java/liquidjava/rj_language/TestLiteralString.java
new file mode 100644
index 00000000..341ce079
--- /dev/null
+++ b/liquidjava-verifier/src/test/java/liquidjava/rj_language/TestLiteralString.java
@@ -0,0 +1,15 @@
+
+package liquidjava.rj_language;
+
+import static org.junit.Assert.assertNotEquals;
+import org.junit.Test;
+import liquidjava.rj_language.ast.LiteralString;
+
+public class TestLiteralString {
+ @Test
+ public void testLiteralString() {
+ LiteralString s1 = new LiteralString("hello");
+ LiteralString s2 = new LiteralString("world");
+ assertNotEquals(s1.hashCode(), s2.hashCode());
+ }
+}
diff --git a/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralBoolean.java b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralBoolean.java
new file mode 100644
index 00000000..82b4c70f
--- /dev/null
+++ b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralBoolean.java
@@ -0,0 +1,16 @@
+package liquidjava.rj_language.ast;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Testa o método LiteralBoolean devolve a string "true" quando o valor booleano interno é verdadeiro
+ */
+
+class LiteralBooleanSimplestTest {
+
+ @Test
+ void testIsBooleanTrue() {
+ assertTrue(new LiteralBoolean(true).isBooleanTrue());
+ }
+}
diff --git a/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralInt.java b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralInt.java
new file mode 100644
index 00000000..0d485d2c
--- /dev/null
+++ b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestLiteralInt.java
@@ -0,0 +1,16 @@
+package liquidjava.rj_language.ast;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Testa se o método LiteralInt devolve o número em formato de texto
+ */
+
+class TestLiteralInt {
+
+ @Test
+ void testToStringReturnsNumber() {
+ assertEquals("42", new LiteralInt(42).toString());
+ }
+}
diff --git a/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestOptimization.java b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestOptimization.java
new file mode 100644
index 00000000..cdf819a8
--- /dev/null
+++ b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TestOptimization.java
@@ -0,0 +1,18 @@
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import liquidjava.rj_language.ast.BinaryExpression;
+import liquidjava.rj_language.ast.LiteralInt;
+import liquidjava.rj_language.opt.ConstantFolding;
+import liquidjava.rj_language.opt.derivation_node.ValDerivationNode;
+
+public class TestOptimization {
+ @Test
+ public void testBinaryFold() {
+ BinaryExpression b = new BinaryExpression(new LiteralInt(1), "+", new LiteralInt(2));
+
+ ValDerivationNode r = ConstantFolding.fold(new ValDerivationNode(b, null));
+ assertEquals(r.getValue(), new LiteralInt(3));
+ }
+}
diff --git "a/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TesteIntegra\303\247\303\243o.java" "b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TesteIntegra\303\247\303\243o.java"
new file mode 100644
index 00000000..f369519e
--- /dev/null
+++ "b/liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/TesteIntegra\303\247\303\243o.java"
@@ -0,0 +1,56 @@
+package liquidjava.api.tests;
+
+import static org.junit.Assert.fail;
+
+import liquidjava.api.CommandLineLauncher;
+import liquidjava.errors.ErrorEmitter;
+import org.junit.Test;
+
+/**
+ * Este teste chama o CommandLineLauncher e verifica se o ErrorEmitter reporta corretamente os resultados para ficheiros
+ * conhecidos.
+ */
+public class TesteIntegração {
+
+ /**
+ * Testa a verificação de um ficheiro que se espera estar correto. Este teste falha se o ErrorEmitter encontrar um
+ * erro de Refinement.
+ */
+ @Test
+ public void testVerification_CorrectFile() {
+ String correctFilePath = "../liquidjava-example/src/main/java/testSuite/SimpleTest.java";
+ ErrorEmitter errorEmitter = CommandLineLauncher.launch(correctFilePath);
+
+ if (errorEmitter.foundError()) {
+ System.out.println(
+ "ERROR: O ficheiro " + correctFilePath + " deveria estar correto, mas foi encontrado um erro.");
+ fail();
+ }
+ }
+
+ /**
+ * Testa a verificação de um ficheiro que se espera conter um erro. Este teste falha se o ErrorEmitter não encontrar
+ * um erro de Refinement.
+ */
+ @Test
+ public void testVerification_ErrorFile() {
+ String errorFilePath = "../liquidjava-example/src/main/java/testSuite/ErrorArithmetic.java";
+
+ ErrorEmitter errorEmitter = CommandLineLauncher.launch(errorFilePath);
+
+ if (!errorEmitter.foundError()) {
+ System.out.println(
+ "ERROR: O ficheiro " + errorFilePath + " deveria conter um erro, mas passou na verificação.");
+ fail();
+ }
+ }
+
+ /**
+ * Testa se a execução do método principal de CommandLineLauncher sem argumentos arranca sem lançar exceções
+ */
+ @Test
+ public void testMainWithNoArguments() {
+ CommandLineLauncher.main(new String[] {});
+ }
+
+}