/* Copyright 2013 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.arbeitspferde.groningen.scorer;
import com.google.common.collect.Lists;
import org.arbeitspferde.groningen.common.ClockedExperimentDbTestCaseBase;
import org.arbeitspferde.groningen.common.EvaluatedSubject;
import org.arbeitspferde.groningen.config.GroningenConfig;
import org.arbeitspferde.groningen.display.DisplayMediator;
import org.arbeitspferde.groningen.eventlog.SubjectEventLogger;
import org.arbeitspferde.groningen.experimentdb.Experiment;
import org.arbeitspferde.groningen.experimentdb.ExperimentDb;
import org.arbeitspferde.groningen.experimentdb.SubjectStateBridge;
import org.arbeitspferde.groningen.subject.Subject;
import org.arbeitspferde.groningen.subject.SubjectGroup;
import org.easymock.EasyMock;
import java.util.List;
/**
* The test for {@link IterationScorer}.
*/
public class IterationScorerTest extends ClockedExperimentDbTestCaseBase {
/** The object instance we are testing. */
private IterationScorer iterationScorer;
private Experiment mockExperiment;
private SubjectScorer mockSubjectScorer;
private DisplayMediator mockDisplayMediator;
private GroningenConfig mockGroningenConfig;
private SubjectEventLogger mockSubjectEventLogger;
@Override
protected void setUp() throws Exception {
super.setUp();
experimentDb = EasyMock.createMock(ExperimentDb.class);
mockExperiment = EasyMock.createMock(Experiment.class);
mockGroningenConfig = EasyMock.createMock(GroningenConfig.class);
mockSubjectScorer = EasyMock.createMock(SubjectScorer.class);
mockDisplayMediator = EasyMock.createMock(DisplayMediator.class);
mockSubjectEventLogger = EasyMock.createMock(SubjectEventLogger.class);
iterationScorer = new IterationScorer(clock, mockDisplayMediator, experimentDb,
mockSubjectScorer, mockSubjectEventLogger, metricExporter);
}
/**
* Check that profiledRun works without exception.
*
* TODO(team): Make less fragile.
* TODO(team): Validate Protocol Buffer emissions.
*/
public void testProfiledRun() throws Exception {
final SubjectStateBridge mockSubjectA = EasyMock.createMock(SubjectStateBridge.class);
final SubjectStateBridge mockSubjectB = EasyMock.createMock(SubjectStateBridge.class);
final List<SubjectStateBridge> subjects = Lists.newArrayList();
final long experimentId = 3L;
final double subjectAFitness = 10.0;
final double subjectBFitness = 0.0;
/* needed for evaluatedSubject constructor */
final SubjectGroup mockSubjectGroup = EasyMock.createNiceMock(SubjectGroup.class);
final Subject mockSubjectAAssociatedSubject = EasyMock.createMock(Subject.class);
final Subject mockSubjectBAssociatedSubject = EasyMock.createMock(Subject.class);
final int subjectAIndex = 1;
final int subjectBIndex = 2;
subjects.add(mockSubjectA);
subjects.add(mockSubjectB);
/*
* mockSubjectGroup is used within the call path, but isn't really under test and is
* completely brittle. Set up to mock out the real stuff but don't bother checking
*/
EasyMock.expect(mockSubjectGroup.getClusterName()).andReturn("xx").anyTimes();
EasyMock.expect(mockSubjectGroup.getName()).andReturn("testjob").anyTimes();
EasyMock.expect(mockSubjectGroup.getUserName()).andReturn("testuser").anyTimes();
/*
* that we pass the same EvaluatedSubject to both be stored in the SubjectBridge and to the
* monitor is one of the few things we would like to be able to test and its not testable.
* configure mocks for the construction ahead of time...
*/
EasyMock.expect(mockSubjectA.getAssociatedSubject()).andReturn(mockSubjectAAssociatedSubject)
.anyTimes();
EasyMock.expect(mockSubjectAAssociatedSubject.getGroup())
.andReturn(mockSubjectGroup).anyTimes();
EasyMock.expect(mockSubjectAAssociatedSubject.getIndex())
.andReturn(subjectAIndex).anyTimes();
EasyMock.expect(mockSubjectAAssociatedSubject.isDefault())
.andReturn(false).anyTimes();
EasyMock.expect(mockSubjectB.getAssociatedSubject()).andReturn(mockSubjectBAssociatedSubject)
.anyTimes();
EasyMock.expect(mockSubjectBAssociatedSubject.getGroup())
.andReturn(mockSubjectGroup).anyTimes();
EasyMock.expect(mockSubjectBAssociatedSubject.getIndex())
.andReturn(subjectBIndex).anyTimes();
EasyMock.expect(mockSubjectBAssociatedSubject.isDefault())
.andReturn(false).anyTimes();
/* profiledRun */
EasyMock.expect(experimentDb.getLastExperiment()).andReturn(mockExperiment);
EasyMock.expect(mockExperiment.getSubjects()).andReturn(subjects);
EasyMock.expect(experimentDb.getExperimentId()).andReturn(experimentId);
EasyMock.expect(mockSubjectScorer.compute(mockSubjectA, mockGroningenConfig))
.andReturn(subjectAFitness);
mockSubjectA.setEvaluatedCopy(EasyMock.anyObject(EvaluatedSubject.class));
EasyMock.expectLastCall();
mockDisplayMediator.addIndividual(EasyMock.anyObject(EvaluatedSubject.class));
EasyMock.expectLastCall();
mockSubjectEventLogger.logSubjectInExperiment(
mockGroningenConfig, mockExperiment, mockSubjectA);
EasyMock.expectLastCall();
/* second time through loop */
EasyMock.expect(mockSubjectScorer.compute(mockSubjectB, mockGroningenConfig))
.andReturn(subjectBFitness);
mockSubjectB.setEvaluatedCopy(EasyMock.anyObject(EvaluatedSubject.class));
EasyMock.expectLastCall();
mockDisplayMediator.addIndividual(EasyMock.anyObject(EvaluatedSubject.class));
EasyMock.expectLastCall();
mockSubjectEventLogger.logSubjectInExperiment(
mockGroningenConfig, mockExperiment, mockSubjectB);
EasyMock.expectLastCall();
mockDisplayMediator.processGeneration();
EasyMock.replay(experimentDb);
EasyMock.replay(mockExperiment);
EasyMock.replay(mockSubjectA);
EasyMock.replay(mockSubjectB);
EasyMock.replay(mockGroningenConfig);
EasyMock.replay(mockSubjectAAssociatedSubject);
EasyMock.replay(mockSubjectBAssociatedSubject);
EasyMock.replay(mockSubjectGroup);
EasyMock.replay(mockSubjectScorer);
EasyMock.replay(mockSubjectEventLogger);
iterationScorer.profiledRun(mockGroningenConfig);
EasyMock.verify(experimentDb);
EasyMock.verify(mockExperiment);
EasyMock.verify(mockSubjectA);
EasyMock.verify(mockSubjectB);
EasyMock.verify(mockGroningenConfig);
EasyMock.verify(mockSubjectAAssociatedSubject);
EasyMock.verify(mockSubjectBAssociatedSubject);
EasyMock.verify(mockSubjectScorer);
EasyMock.verify(mockSubjectEventLogger);
}
}