Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,27 @@
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.5</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>5.0.1</version>
</dependency>

</dependencies>
<!--
It was necessary to include the following lines to fix the
Expand All @@ -41,4 +62,4 @@
</plugin>
</plugins>
</build>
</project>
</project>
16 changes: 16 additions & 0 deletions src/main/java/br/unb/cic/test/unit/DefaultReport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package br.unb.cic.test.unit;

public class DefaultReport extends Report {

@Override
public void export() {
for (TestResult result : testResults) {
System.out.println("Test Case: " + result.getTestCaseName());
System.out.println("Successes: " + result.getSuccesses());
System.out.println("Errors: " + result.getErrors());
System.out.println("Failures: " + result.getFailures());
System.out.println();
}
}
}

19 changes: 17 additions & 2 deletions src/main/java/br/unb/cic/test/unit/DefaultRunner.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package br.unb.cic.test.unit;

import br.unb.cic.test.unit.eh.Failure;
import com.google.inject.Inject;
import org.reflections.Reflections;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashSet;
import java.util.Set;

Expand All @@ -11,12 +15,23 @@
* from <code>TestCase</code>.
*/
public class DefaultRunner extends TestRunner {

@Inject
public DefaultRunner(Set<Report> reports) {
super(reports);
}

@Override
public Set<TestCase> listTestCases() {
public Set<TestCase> listTestCases(String packagePath) {
try {
Reflections reflections = new Reflections();


Reflections reflections = new Reflections(packagePath);
Set<Class<? extends TestCase>> testCaseClasses = reflections.getSubTypesOf(TestCase.class);
Set<TestCase> testCases = new HashSet<>();



for (Class<? extends TestCase> c : testCaseClasses) {
testCases.add(c.newInstance());
}
Expand Down
47 changes: 47 additions & 0 deletions src/main/java/br/unb/cic/test/unit/JsonReportGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package br.unb.cic.test.unit;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Set;

public class JsonReportGenerator extends Report {


@Override
public void export() {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonObject reportObject = new JsonObject();

JsonArray testResultsArray = new JsonArray();
for (TestResult testResult : testResults) {
JsonObject testResultObject = new JsonObject();
testResultObject.addProperty("testCase", testResult.getTestCaseName());
testResultObject.add("successes", toJsonArray(testResult.getSuccesses()));
testResultObject.add("errors", toJsonArray(testResult.getErrors()));
testResultObject.add("failures", toJsonArray(testResult.getFailures()));
testResultsArray.add(testResultObject);
}

reportObject.add("testResults", testResultsArray);

try (FileWriter writer = new FileWriter(filePath + ".json")) {
gson.toJson(reportObject, writer);
} catch (IOException e) {
System.err.println("Error exporting JSON report: " + e.getMessage());
}
}

private JsonArray toJsonArray(Set<String> strings) {
JsonArray jsonArray = new JsonArray();
for (String string : strings) {
jsonArray.add(string);
}
return jsonArray;
}

}
15 changes: 15 additions & 0 deletions src/main/java/br/unb/cic/test/unit/Report.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package br.unb.cic.test.unit;

import java.util.Set;

public abstract class Report {
public String filePath;
Set<TestResult> testResults;
public abstract void export();

public void setFilePath(String filePath) {
this.filePath = filePath;
}
public void setResult(Set<TestResult> testResults) {this.testResults = testResults;}

}
44 changes: 44 additions & 0 deletions src/main/java/br/unb/cic/test/unit/ReportManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package br.unb.cic.test.unit;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class ReportManager {

private final Map<String, Class<? extends Report>> reportTypeMap;

public ReportManager() {
reportTypeMap = new HashMap<>();
reportTypeMap.put("default", DefaultReport.class);
reportTypeMap.put("json", JsonReportGenerator.class);
// Add more report types here
}

public Map<String, Class<? extends Report>> getReportTypemap() {

return reportTypeMap;
}

public void exportReport(Set<Report> reports, String reportType, String filePath, Set<TestResult> results) {
Class<? extends Report> reportClass = reportTypeMap.get(reportType);

if (reportClass == null) {
throw new IllegalArgumentException("Unsupported report type: " + reportType);
}



for (Report report : reports) {
if (reportClass.isInstance(report)) {
report.setFilePath(filePath);
report.setResult(results);
report.export();
return;
}
}

throw new IllegalArgumentException("Report of type " + reportType + " not found in the reports list.");
}

}
18 changes: 18 additions & 0 deletions src/main/java/br/unb/cic/test/unit/ReportModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.unb.cic.test.unit;

import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;

public class ReportModule extends AbstractModule {

@Override
protected void configure() {
Multibinder<Report> reportMultibinder = Multibinder.newSetBinder(binder(), Report.class);



reportMultibinder.addBinding().to(DefaultReport.class);
reportMultibinder.addBinding().to(JsonReportGenerator.class);
// new reports here
}
}
7 changes: 5 additions & 2 deletions src/main/java/br/unb/cic/test/unit/SuiteRunner.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package br.unb.cic.test.unit;

import br.unb.cic.test.unit.eh.TestCaseInstantiationError;
import com.google.inject.Inject;

import java.util.HashSet;
import java.util.Set;
Expand All @@ -13,7 +14,9 @@
public class SuiteRunner extends TestRunner {
private Set<Class<? extends TestCase>> testClasses;

public SuiteRunner() {
@Inject
public SuiteRunner(Set<Report> reports) {
super(reports);
testClasses = new HashSet<>();
}

Expand All @@ -29,7 +32,7 @@ public SuiteRunner withTestCase(Class<? extends TestCase> c) {
}

@Override
public Set<TestCase> listTestCases() {
public Set<TestCase> listTestCases(String packagePath) {
Set<TestCase> testCases = new HashSet<>();
for (Class<? extends TestCase> c : testClasses) {
try {
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/br/unb/cic/test/unit/TestCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import br.unb.cic.test.unit.eh.AssertTrueException;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
* Define the root of the Test Case class hierarchy.
Expand Down Expand Up @@ -38,6 +39,30 @@ protected void assertEquals(Object o1, Object o2) {
}
}

protected void assertNotNull(Object object) {
if (object == null) {
throw new AssertException();
}
}

protected void assertNotEquals(Object o1, Object o2) {
if (o1.equals(o2)) {
throw new AssertException();
}
}

protected void assertArrayEquals(Object[] arr1, Object[] arr2) {
if (!Arrays.equals(arr1, arr2)) {
throw new AssertException();
}
}

protected void assertGreaterThan(int value1, int value2) {
if (value1 <= value2) {
throw new AssertException();
}
}

public void before() {}
public void after() {};

Expand Down
64 changes: 64 additions & 0 deletions src/main/java/br/unb/cic/test/unit/TestResultGUI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package br.unb.cic.test.unit;

import javax.swing.*;
import java.awt.*;

public class TestResultGUI extends JFrame{
private TestResult testResult;

public TestResultGUI(TestResult testResult) {
this.testResult = testResult;
initialize();
}

private void initialize() {
setTitle("Test Result");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);

// Create the main panel
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());

// Create the title label
JLabel titleLabel = new JLabel("Test Case: " + testResult.getTestCaseName());
titleLabel.setFont(new Font("Arial", Font.BOLD, 18));
titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
mainPanel.add(titleLabel, BorderLayout.NORTH);

// Create the results panel
JPanel resultsPanel = new JPanel(new GridLayout(3, 1));

// Create the success label
JLabel successLabel = new JLabel("Successes: " + testResult.getSuccesses().size());
resultsPanel.add(successLabel);

// Create the error label
JLabel errorLabel = new JLabel("Errors: " + testResult.getErrors().size());
resultsPanel.add(errorLabel);

// Create the failure label
JLabel failureLabel = new JLabel("Failures: " + testResult.getFailures().size());
resultsPanel.add(failureLabel);

mainPanel.add(resultsPanel, BorderLayout.CENTER);

// Add the main panel to the frame
add(mainPanel);
}

public static void main(String[] args) {
// Example usage
TestResult testResult = new TestResult("ExampleTestCase");
testResult.reportSuccess("testMethod1");
testResult.reportSuccess("testMethod2");
testResult.reportError("testMethod3");
testResult.reportFailure("testMethod4");

SwingUtilities.invokeLater(() -> {
TestResultGUI gui = new TestResultGUI(testResult);
gui.setVisible(true);
});
}
}
17 changes: 14 additions & 3 deletions src/main/java/br/unb/cic/test/unit/TestRunner.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package br.unb.cic.test.unit;

import com.google.inject.Inject;

import java.util.HashSet;
import java.util.Set;

Expand All @@ -8,17 +10,26 @@
* override the abstract method <code>listTestCases()</code>.
*/
public abstract class TestRunner {
public abstract Set<TestCase> listTestCases();
public abstract Set<TestCase> listTestCases(String packagePath);

public Set<Report> reports;


@Inject
public TestRunner(Set<Report> reports) {
this.reports = reports;
}

public Set<Report> getReports() {return reports;}
/**
* This is a (template) method that executes all
* test cases coming from <code>listTestCases</code>.
*
* @return Return a set of test results---one for each test case
* in run.
*/
public Set<TestResult> runAllTests() {
Set<TestCase> testCases = listTestCases();
public Set<TestResult> runAllTests(String packagePath) {
Set<TestCase> testCases = listTestCases(packagePath);
Set<TestResult> result = new HashSet<>();
for(TestCase tc: testCases) {
result.add(tc.run());
Expand Down
Loading