Here is an example implementation of the Java application:
```java
import java.text.DecimalFormat;
// Interface for EstateAgent class
interface IEstateAgent {
double estateAgentSales(double[] propertySales);
double estateAgentCommission(double propertySales);
int topEstateAgent(double[] totalSales);
}
// EstateAgent class implementing the IEstateAgent interface
class EstateAgent implements IEstateAgent {
DecimalFormat decimalFormat = new DecimalFormat("#,##,###");
// Method to calculate the total property sales for an estate agent
public double estateAgentSales(double[] propertySales) {
double totalSales = 0;
for (double sale : propertySales) {
totalSales += sale;
}
return totalSales;
}
// Method to calculate the 2% commission earned by an estate agent
public double estateAgentCommission(double propertySales) {
return propertySales * 0.02;
}
// Method to determine the top-performing estate agent based on their total sales
public int topEstateAgent(double[] totalSales) {
double maxSales = totalSales[0];
int topAgentIndex = 0;
for (int i = 1; i < totalSales.length; i++) {
if (totalSales[i] > maxSales) {
maxSales = totalSales[i];
topAgentIndex = i;
}
}
return topAgentIndex;
}
}
// Main class to run the application
public class EstateAgentApp {
public static void main(String[] args) {
// Array to store property sales for two estate agents
double[][] propertySales = {
{800000, 1500000, 2000000},
{700000, 1200000, 1600000}
};
// Initialize EstateAgent object
EstateAgent estateAgent = new EstateAgent();
// Array to store total property sales for each estate agent
double[] totalSales = new double[2];
// Calculate and print the total property sales for each estate agent
System.out.println("ESTATE AGENT SALES REPORT");
System.out.println("\t\t\t\t\tJAN\t\t\t\t\t\tFEB\t\t\t\t\t\tMAR");
System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------");
for (int i = 0; i < propertySales.length; i++) {
double agentTotalSales = estateAgent.estateAgentSales(propertySales[i]);
totalSales[i] = agentTotalSales;
System.out.print("Estate Agent " + (i+1) + ": \t");
for (double sale : propertySales[i]) {
System.out.print("R " + decimalFormat.format(sale) + "\t\t\t");
}
System.out.println();
}
// Calculate and print the total 2% commission earned by each estate agent
double[] commissions = new double[2];
for (int i = 0; i < totalSales.length; i++) {
double agentCommission = estateAgent.estateAgentCommission(totalSales[i]);
commissions[i] = agentCommission;
}
System.out.println();
System.out.println("The total property sales for Estate Agent 1 = R " + decimalFormat.format(totalSales[0]));
System.out.println("The total property sales for Estate Agent 2 = R " + decimalFormat.format(totalSales[1]));
System.out.println();
System.out.println("Sales commission for Estate Agent 1 = R " + decimalFormat.format(commissions[0]));
System.out.println("Sales commission for Estate Agent 2 = R " + decimalFormat.format(commissions[1]));
System.out.println();
// Determine and print the top-performing estate agent
int topAgentIndex = estateAgent.topEstateAgent(totalSales);
System.out.println("Top performing estate agent: Estate Agent " + (topAgentIndex+1));
}
}
```
To create the unit tests, you can use a testing framework like JUnit.
Here is an example of how you can write the unit tests:
```java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class EstateAgentTests {
// Test to calculate total sales for estate agent
@Test
void calculateTotalSales_ReturnsTotalSales() {
EstateAgent estateAgent = new EstateAgent();
double[] propertySales = {800000, 1500000, 2000000};
double expectedTotalSales = 4300000;
double actualTotalSales = estateAgent.estateAgentSales(propertySales);
assertEquals(expectedTotalSales, actualTotalSales);
}
// Test to calculate commission for estate agent
@Test
void calculateTotalCommission_ReturnsCommission() {
EstateAgent estateAgent = new EstateAgent();
double propertySales = 4300000;
double expectedCommission = 86000;
double actualCommission = estateAgent.estateAgentCommission(propertySales);
assertEquals(expectedCommission, actualCommission);
}
// Test to determine the top performing estate agent
@Test
void topAgent_ReturnsTopPosition() {
EstateAgent estateAgent = new EstateAgent();
double[] totalSales = {4300000, 3500000};
int expectedTopAgentIndex = 0;
int actualTopAgentIndex = estateAgent.topEstateAgent(totalSales);
assertEquals(expectedTopAgentIndex, actualTopAgentIndex);
}
}
```
Remember to add the necessary dependencies for JUnit in your project's build file (e.g., pom.xml for Maven).