package uk.ac.ox.zoo.seeg.abraid.mp.common.domain;
import org.junit.Test;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.csv.CsvSubmodelStatistic;
import uk.ac.ox.zoo.seeg.abraid.mp.common.dto.json.JsonModelRunStatistics;
import java.util.ArrayList;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
/**
* Tests for SubmodelStatistic.
* Copyright (c) 2014 University of Oxford
*/
public class SubmodelStatisticTest {
@Test
public void constructorBindsFieldCorrectly() {
// Arrange
ModelRun runExpectation = mock(ModelRun.class);
CsvSubmodelStatistic dtoExpectation = new CsvSubmodelStatistic();
dtoExpectation.setKappa(3.0);
dtoExpectation.setAreaUnderCurve(4.0);
dtoExpectation.setSensitivity(5.0);
dtoExpectation.setSpecificity(6.0);
dtoExpectation.setProportionCorrectlyClassified(7.0);
dtoExpectation.setKappaStandardDeviation(8.0);
dtoExpectation.setAreaUnderCurveStandardDeviation(9.0);
dtoExpectation.setSensitivityStandardDeviation(10.0);
dtoExpectation.setSpecificityStandardDeviation(11.0);
dtoExpectation.setProportionCorrectlyClassifiedStandardDeviation(12.0);
// Act
SubmodelStatistic result = new SubmodelStatistic(dtoExpectation, runExpectation);
// Assert
assertThat(result.getModelRun()).isEqualTo(runExpectation);
assertThat(result.getKappa()).isEqualTo(dtoExpectation.getKappa());
assertThat(result.getAreaUnderCurve()).isEqualTo(dtoExpectation.getAreaUnderCurve());
assertThat(result.getSensitivity()).isEqualTo(dtoExpectation.getSensitivity());
assertThat(result.getSpecificity()).isEqualTo(dtoExpectation.getSpecificity());
assertThat(result.getProportionCorrectlyClassified()).isEqualTo(dtoExpectation.getProportionCorrectlyClassified());
assertThat(result.getKappaStandardDeviation()).isEqualTo(dtoExpectation.getKappaStandardDeviation());
assertThat(result.getAreaUnderCurveStandardDeviation()).isEqualTo(dtoExpectation.getAreaUnderCurveStandardDeviation());
assertThat(result.getSensitivityStandardDeviation()).isEqualTo(dtoExpectation.getSensitivityStandardDeviation());
assertThat(result.getSpecificityStandardDeviation()).isEqualTo(dtoExpectation.getSpecificityStandardDeviation());
assertThat(result.getProportionCorrectlyClassifiedStandardDeviation()).isEqualTo(dtoExpectation.getProportionCorrectlyClassifiedStandardDeviation());
assertThat(result.getId()).isNull();
}
@Test
public void summariseReturnsExpectedJson() {
// Arrange
SubmodelStatistic stat1 = new SubmodelStatistic(4.0, 5.0, 6.0, 7.0, 8.0);
SubmodelStatistic stat2 = new SubmodelStatistic(6.0, 7.0, 8.0, 9.0, 10.0);
// Act
JsonModelRunStatistics result = SubmodelStatistic.summarise(Arrays.asList(stat1, stat2));
// Assert
assertThat(result.getKappa()).isEqualTo(5.0);
assertThat(result.getAuc()).isEqualTo(6.0);
assertThat(result.getSens()).isEqualTo(7.0);
assertThat(result.getSpec()).isEqualTo(8.0);
assertThat(result.getPcc()).isEqualTo(9.0);
assertSd(result.getKappaSd(), 2);
assertSd(result.getAucSd(), 2);
assertSd(result.getSensSd(), 2);
assertSd(result.getSpecSd(), 2);
assertSd(result.getPccSd(), 2);
}
private void assertSd(double sd, int count) {
assertThat(sd).isEqualTo(Math.sqrt(count));
}
@Test
public void summariseReturnsExpectedJsonFromEmptyList() {
// Act
JsonModelRunStatistics result = SubmodelStatistic.summarise(new ArrayList<SubmodelStatistic>());
// Assert
assertThat(result.getKappa()).isNull();
assertThat(result.getAuc()).isNull();
assertThat(result.getSens()).isNull();
assertThat(result.getSpec()).isNull();
assertThat(result.getPcc()).isNull();
assertThat(result.getKappaSd()).isNull();
assertThat(result.getAucSd()).isNull();
assertThat(result.getSensSd()).isNull();
assertThat(result.getSpecSd()).isNull();
assertThat(result.getPccSd()).isNull();
}
@Test
public void summariseReturnsExpectedJsonWhenNullsPresent() {
// Arrange
SubmodelStatistic stat1 = new SubmodelStatistic(null, 5.0, 6.0, 7.0, 8.0);
SubmodelStatistic stat2 = new SubmodelStatistic(6.0, 7.0, 8.0, 9.0, 10.0);
// Act
JsonModelRunStatistics result = SubmodelStatistic.summarise(Arrays.asList(stat1, stat2));
// Assert - the whole first submodel should be excluded, so results just equal the 2nd model
assertThat(result.getKappa()).isEqualTo(stat2.getKappa());
assertThat(result.getAuc()).isEqualTo(stat2.getAreaUnderCurve());
assertThat(result.getSens()).isEqualTo(stat2.getSensitivity());
assertThat(result.getSpec()).isEqualTo(stat2.getSpecificity());
assertThat(result.getPcc()).isEqualTo(stat2.getProportionCorrectlyClassified());
assertThat(result.getKappaSd()).isEqualTo(0);
assertThat(result.getAucSd()).isEqualTo(0);
assertThat(result.getSensSd()).isEqualTo(0);
assertThat(result.getSpecSd()).isEqualTo(0);
assertThat(result.getPccSd()).isEqualTo(0);
}
@Test
public void summariseReturnsExpectedJsonWhenNoCompleteSubmodelsPresent() {
// Arrange
SubmodelStatistic stat1 = new SubmodelStatistic(null, 5.0, 6.0, 7.0, 8.0);
SubmodelStatistic stat2 = new SubmodelStatistic(4.0, null, 6.0, 7.0, 8.0);
SubmodelStatistic stat3 = new SubmodelStatistic(4.0, 5.0, null, 7.0, 8.0);
SubmodelStatistic stat4 = new SubmodelStatistic(4.0, 5.0, 6.0, null, 8.0);
SubmodelStatistic stat5 = new SubmodelStatistic(4.0, 5.0, 6.0, 7.0, null);
// Act
JsonModelRunStatistics result = SubmodelStatistic.summarise(Arrays.asList(stat1, stat2, stat3, stat4, stat5, null));
// Assert
assertThat(result.getKappa()).isNull();
assertThat(result.getAuc()).isNull();
assertThat(result.getSens()).isNull();
assertThat(result.getSpec()).isNull();
assertThat(result.getPcc()).isNull();
assertThat(result.getKappaSd()).isNull();
assertThat(result.getAucSd()).isNull();
assertThat(result.getSensSd()).isNull();
assertThat(result.getSpecSd()).isNull();
assertThat(result.getPccSd()).isNull();
}
}