package de.randi2.simulation.integration.service;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import de.randi2.core.integration.services.AbstractServiceTest;
import de.randi2.model.TreatmentArm;
import de.randi2.model.Trial;
import de.randi2.model.TrialSite;
import de.randi2.model.randomization.BlockRandomizationConfig;
import de.randi2.simulation.distribution.UniformDistribution;
import de.randi2.simulation.model.DistributionSubjectProperty;
import de.randi2.simulation.model.SimulationResult;
import de.randi2.simulation.service.SimulationService;
import de.randi2.simulation.service.SimulationServiceImpl;
import de.randi2.testUtility.utility.DomainObjectFactory;
public class SimulationServiceTest extends AbstractServiceTest{
private SimulationService service = new SimulationServiceImpl();
@Autowired
protected DomainObjectFactory factory;
private Trial validTrial;
@Before
public void setUp() {
validTrial = factory.getTrial();
}
@Test
public void testWithoutStrata(){
validTrial.addParticipatingSite(factory.getTrialSite());
validTrial.addParticipatingSite(factory.getTrialSite());
int blocksize = 10;
int randomizations = 100;
TreatmentArm arm1 = new TreatmentArm();
arm1.setPlannedSubjects(randomizations/2);
arm1.setName("arm1");
arm1.setTrial(validTrial);
TreatmentArm arm2 = new TreatmentArm();
arm2.setPlannedSubjects(randomizations/2);
arm2.setName("arm2");
arm2.setTrial(validTrial);
Set<TreatmentArm> arms = new HashSet<TreatmentArm>();
arms.add(arm1);
arms.add(arm2);
validTrial.setTreatmentArms(arms);
BlockRandomizationConfig configb = new BlockRandomizationConfig();
configb.setMaximum(blocksize);
configb.setMinimum(blocksize);
validTrial.setRandomizationConfiguration(configb);
SimulationResult result = service.simulateTrial(validTrial,new ArrayList<DistributionSubjectProperty>(),new UniformDistribution<TrialSite>(new ArrayList<TrialSite>(validTrial.getParticipatingSites())), 1000, 10000000, false);
assertEquals(1000, result.getAmountRuns());
double roundedResult = Math
.round(( result.getMarginalBalanceMax() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
roundedResult = Math
.round(( result.getMarginalBalanceMin() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
roundedResult = Math
.round(( result.getMarginalBalanceMean() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
for(int i = 0;i<arms.size();i++){
roundedResult = Math
.round(( result.getMedians()[i] * 100000.0)) / 100000.0;;
assertEquals(50.0, roundedResult);
roundedResult = Math
.round(( result.getMeans()[i] * 100000.0)) / 100000.0;;
assertEquals(50.0, roundedResult);
assertEquals(50, result.getMins()[i]);
assertEquals(50, result.getMaxs()[i]);
}
}
@Test
public void testWithStrata(){
validTrial.addParticipatingSite(factory.getTrialSite());
validTrial.addParticipatingSite(factory.getTrialSite());
int blocksize = 10;
int randomizations = 100;
TreatmentArm arm1 = new TreatmentArm();
arm1.setPlannedSubjects(randomizations/2);
arm1.setName("arm1");
arm1.setTrial(validTrial);
TreatmentArm arm2 = new TreatmentArm();
arm2.setPlannedSubjects(randomizations/2);
arm2.setName("arm2");
arm2.setTrial(validTrial);
Set<TreatmentArm> arms = new HashSet<TreatmentArm>();
arms.add(arm1);
arms.add(arm2);
validTrial.setTreatmentArms(arms);
BlockRandomizationConfig configb = new BlockRandomizationConfig();
configb.setMaximum(blocksize);
configb.setMinimum(blocksize);
validTrial.setRandomizationConfiguration(configb);
SimulationResult result = service.simulateTrial(validTrial,new ArrayList<DistributionSubjectProperty>(),new UniformDistribution<TrialSite>(new ArrayList<TrialSite>(validTrial.getParticipatingSites())), 1000, 10000000, false);
assertEquals(1000, result.getAmountRuns());
double roundedResult = Math
.round(( result.getMarginalBalanceMax() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
roundedResult = Math
.round(( result.getMarginalBalanceMin() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
roundedResult = Math
.round(( result.getMarginalBalanceMean() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
for(int i = 0;i<arms.size();i++){
roundedResult = Math
.round(( result.getMedians()[i] * 100000.0)) / 100000.0;;
assertEquals(50.0, roundedResult);
roundedResult = Math
.round(( result.getMeans()[i] * 100000.0)) / 100000.0;;
assertEquals(50.0, roundedResult);
assertEquals(50, result.getMins()[i]);
assertEquals(50, result.getMaxs()[i]);
}
}
@Test
public void testWithTrialSiteStrata(){
validTrial.addParticipatingSite(factory.getTrialSite());
validTrial.addParticipatingSite(factory.getTrialSite());
int blocksize = 10;
int randomizations = 100;
TreatmentArm arm1 = new TreatmentArm();
arm1.setPlannedSubjects(randomizations/2);
arm1.setName("arm1");
arm1.setTrial(validTrial);
TreatmentArm arm2 = new TreatmentArm();
arm2.setPlannedSubjects(randomizations/2);
arm2.setName("arm2");
arm2.setTrial(validTrial);
Set<TreatmentArm> arms = new HashSet<TreatmentArm>();
arms.add(arm1);
arms.add(arm2);
validTrial.setTreatmentArms(arms);
validTrial.setStratifyTrialSite(true);
BlockRandomizationConfig configb = new BlockRandomizationConfig();
configb.setMaximum(blocksize);
configb.setMinimum(blocksize);
validTrial.setRandomizationConfiguration(configb);
SimulationResult result = service.simulateTrial(validTrial,new ArrayList<DistributionSubjectProperty>(),new UniformDistribution<TrialSite>(new ArrayList<TrialSite>(validTrial.getParticipatingSites())), 1000, 10000000, false);
assertEquals(1000, result.getAmountRuns());
double roundedResult = Math
.round(( result.getMarginalBalanceMax() * 100000.0)) / 100000.0;
assertTrue(roundedResult<0.1);
roundedResult = Math
.round(( result.getMarginalBalanceMin() * 100000.0)) / 100000.0;;
assertEquals(0.0, roundedResult);
roundedResult = Math
.round(( result.getMarginalBalanceMean() * 100000.0)) / 100000.0;;
assertTrue(roundedResult<0.05);
for(int i = 0;i<arms.size();i++){
roundedResult = Math
.round(( result.getMedians()[i] * 100000.0)) / 100000.0;;
assertEquals(50.0, roundedResult);
roundedResult = Math
.round(( result.getMeans()[i] * 100000.0)) / 100000.0;;
assertTrue(49.7<roundedResult);
assertTrue(50.3>roundedResult);
}
}
}