/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.gui;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.notNull;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreePath;
import org.drugis.addis.ExampleData;
import org.drugis.addis.entities.AdverseEvent;
import org.drugis.addis.entities.Arm;
import org.drugis.addis.entities.ContinuousVariableType;
import org.drugis.addis.entities.Domain;
import org.drugis.addis.entities.DomainImpl;
import org.drugis.addis.entities.DoseUnit;
import org.drugis.addis.entities.Drug;
import org.drugis.addis.entities.Endpoint;
import org.drugis.addis.entities.EntityCategory;
import org.drugis.addis.entities.EntityIdExistsException;
import org.drugis.addis.entities.FixedDose;
import org.drugis.addis.entities.Indication;
import org.drugis.addis.entities.PopulationCharacteristic;
import org.drugis.addis.entities.Study;
import org.drugis.addis.entities.StudyOutcomeMeasure;
import org.drugis.addis.entities.Unit;
import org.drugis.addis.entities.Variable;
import org.drugis.addis.entities.analysis.MetaAnalysis;
import org.drugis.addis.entities.analysis.MetaBenefitRiskAnalysis;
import org.drugis.addis.entities.analysis.NetworkMetaAnalysis;
import org.drugis.addis.entities.analysis.PairWiseMetaAnalysis;
import org.drugis.addis.entities.analysis.RandomEffectsMetaAnalysis;
import org.drugis.addis.entities.treatment.TreatmentDefinition;
import org.drugis.common.event.TreeModelEventMatcher;
import org.junit.Before;
import org.junit.Test;
public class DomainTreeModelTest {
private DomainTreeModel d_treeModel;
private Domain d_domain;
private Indication d_firstIndication;
private Endpoint d_firstEndpoint;
private AdverseEvent d_firstADE;
private PopulationCharacteristic d_firstPopChar;
private Study d_firstStudy;
private Drug d_firstDrug;
private RandomEffectsMetaAnalysis d_firstMetaAnalysis;
@Before
public void setUp() {
d_domain = new DomainImpl();
d_firstIndication = new Indication(8L, "Indication");
d_firstEndpoint = new Endpoint("Endpoint", Endpoint.convertVarType(Variable.Type.RATE));
d_firstADE = new AdverseEvent("firstADE", AdverseEvent.convertVarType(Variable.Type.CONTINUOUS));
d_firstStudy = new Study("First", d_firstIndication);
d_firstDrug = new Drug("Drug", "atc");
ExampleData.addDefaultEpochs(d_firstStudy);
Arm pg = d_firstStudy.createAndAddArm("first", 100, d_firstDrug, new FixedDose(100.0, DoseUnit.createMilliGramsPerDay()));
d_firstStudy.getEndpoints().add(new StudyOutcomeMeasure<Endpoint>(d_firstEndpoint));
d_firstStudy.getAdverseEvents().add(new StudyOutcomeMeasure<AdverseEvent>(d_firstADE));
ExampleData.addDefaultMeasurementMoments(d_firstStudy);
d_firstStudy.setMeasurement(d_firstStudy.findStudyOutcomeMeasure(d_firstEndpoint), pg, d_firstEndpoint.buildMeasurement(pg));
d_firstStudy.setMeasurement(d_firstStudy.findStudyOutcomeMeasure(d_firstADE), pg, d_firstADE.buildMeasurement(pg));
d_firstMetaAnalysis = ExampleData.buildRandomEffectsMetaAnalysis("meta", d_firstEndpoint, Collections.singletonList((Study)d_firstStudy), TreatmentDefinition.createTrivial(d_firstDrug), TreatmentDefinition.createTrivial(d_firstDrug));
d_firstPopChar = new PopulationCharacteristic("Age", new ContinuousVariableType());
d_domain.getIndications().add(d_firstIndication);
d_domain.getEndpoints().add(d_firstEndpoint);
d_domain.getAdverseEvents().add(d_firstADE);
d_domain.getDrugs().add(d_firstDrug);
d_domain.getStudies().add(d_firstStudy);
d_domain.getPopulationCharacteristics().add(d_firstPopChar);
d_domain.getMetaAnalyses().add(d_firstMetaAnalysis);
d_treeModel = new DomainTreeModel(d_domain);
}
@Test
public void testGetRoot() {
assertNotNull(d_treeModel.getRoot());
assertNotNull(d_treeModel.getRoot().toString());
}
@Test
public void testGetIndication() {
assertEquals(d_firstIndication, d_treeModel.getChild(d_domain.getCategory(Indication.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(Indication.class), 1));
}
@Test
public void testGetEndpoint() {
assertEquals(d_firstEndpoint, d_treeModel.getChild(d_domain.getCategory(Endpoint.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(Endpoint.class), 1));
}
@Test
public void testGetADE() {
assertEquals(d_firstADE, d_treeModel.getChild(d_domain.getCategory(AdverseEvent.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(AdverseEvent.class), 1));
}
@Test
public void testGetPopChar() {
assertEquals(d_firstPopChar, d_treeModel.getChild(d_domain.getCategory(PopulationCharacteristic.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(AdverseEvent.class), 1));
}
@Test
public void testGetDrug() {
assertEquals(d_firstDrug, d_treeModel.getChild(d_domain.getCategory(Drug.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(Drug.class), 1));
}
@Test
public void testGetAnalysis() {
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(NetworkMetaAnalysis.class), 0));
assertEquals(d_firstMetaAnalysis, d_treeModel.getChild(d_domain.getCategory(PairWiseMetaAnalysis.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(PairWiseMetaAnalysis.class), 1));
}
@Test
public void testGetStudy() {
assertEquals(d_firstStudy, d_treeModel.getChild(d_domain.getCategory(Study.class), 0));
assertEquals(null, d_treeModel.getChild(d_domain.getCategory(Study.class), 1));
}
@Test
public void testGetChildCount() {
assertEquals(d_domain.getCategories().size(), d_treeModel.getChildCount(d_treeModel.getRoot()));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(PairWiseMetaAnalysis.class)));
assertEquals(0, d_treeModel.getChildCount(d_domain.getCategory(NetworkMetaAnalysis.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(Indication.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(Indication.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(Endpoint.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(AdverseEvent.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(PopulationCharacteristic.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(Drug.class)));
assertEquals(1, d_treeModel.getChildCount(d_domain.getCategory(Study.class)));
assertEquals(0, d_treeModel.getChildCount(d_domain.getCategory(MetaBenefitRiskAnalysis.class)));
assertEquals(0, d_treeModel.getChildCount(d_firstEndpoint));
}
@Test
public void testGetIndexOfChild() {
// test root
assertEquals(0, d_treeModel.getIndexOfChild(d_treeModel.getRoot(), d_domain.getCategory(Unit.class)));
// test categories
for (EntityCategory cat : d_domain.getCategories()) {
assertEquals(d_domain.getCategories().indexOf(cat),
d_treeModel.getIndexOfChild(d_treeModel.getRoot(), cat));
}
// test first element of every category
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(Unit.class), Domain.GRAM));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(Indication.class), d_firstIndication));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(Endpoint.class), d_firstEndpoint));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(AdverseEvent.class), d_firstADE));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(PopulationCharacteristic.class), d_firstPopChar));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(Study.class), d_firstStudy));
assertEquals(0, d_treeModel.getIndexOfChild(d_domain.getCategory(Drug.class), d_firstDrug));
// test non element of tree
assertEquals(-1, d_treeModel.getIndexOfChild(d_domain.getCategory(Endpoint.class), new Object()));
}
@Test
public void testIsLeaf() {
assertFalse(d_treeModel.isLeaf(d_treeModel.getRoot()));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(Indication.class)));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(Endpoint.class)));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(AdverseEvent.class)));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(Study.class)));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(Drug.class)));
assertFalse(d_treeModel.isLeaf(d_domain.getCategory(MetaAnalysis.class)));
assertTrue(d_treeModel.isLeaf(d_firstIndication));
assertTrue(d_treeModel.isLeaf(d_firstEndpoint));
assertTrue(d_treeModel.isLeaf(d_firstADE));
assertTrue(d_treeModel.isLeaf(d_firstPopChar));
assertTrue(d_treeModel.isLeaf(d_firstStudy));
assertTrue(d_treeModel.isLeaf(d_firstDrug));
assertTrue(d_treeModel.isLeaf(d_firstMetaAnalysis));
}
@Test
public void testChangeIndicationsFires() {
Indication indication1 = new Indication(10L, "Blah");
Indication indication2 = new Indication(11L, "XBlah");
Indication indication3 = new Indication(12L, "YBlah");
TreeModelEvent expectedEvent1 = new TreeModelEvent(d_treeModel,
new Object[] {d_treeModel.getRoot(), d_domain.getCategory(Indication.class)},
new int[] {0}, new Object[] {indication1});
TreeModelEvent expectedEvent2 = new TreeModelEvent(d_treeModel,
new Object[] {d_treeModel.getRoot(), d_domain.getCategory(Indication.class)},
new int[] {2}, new Object[] {indication2});
TreeModelEvent expectedEvent3 = new TreeModelEvent(d_treeModel,
new Object[] {d_treeModel.getRoot(), d_domain.getCategory(Indication.class)},
new int[] {3}, new Object[] {indication3});
TreeModelEvent expectedEvent4 = new TreeModelEvent(d_treeModel,
new Object[] {d_treeModel.getRoot(), d_domain.getCategory(Indication.class)},
new int[] {2}, null);
TreeModelListener listener = createStrictMock(TreeModelListener.class);
listener.treeNodesInserted(TreeModelEventMatcher.eqTreeModelEvent(expectedEvent1));
listener.treeNodesInserted(TreeModelEventMatcher.eqTreeModelEvent(expectedEvent2));
listener.treeNodesInserted(TreeModelEventMatcher.eqTreeModelEvent(expectedEvent3));
listener.treeNodesRemoved(TreeModelEventMatcher.eqTreeModelEvent(expectedEvent4));
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getIndications().add(indication1);
d_domain.getIndications().addAll(Arrays.asList(indication2, indication3));
d_domain.getIndications().remove(indication2);
verify(listener);
}
@Test
public void testAddEndpointFires() {
TreeModelListener listener = createMock(TreeModelListener.class);
listener.treeNodesInserted((TreeModelEvent)notNull());
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getEndpoints().add(new Endpoint("E", Endpoint.convertVarType(Variable.Type.RATE)));
verify(listener);
}
@Test
public void testAddAdeFires() {
TreeModelListener listener = createMock(TreeModelListener.class);
listener.treeNodesInserted((TreeModelEvent)notNull());
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getAdverseEvents().add(new AdverseEvent());
verify(listener);
}
@Test
public void testAddStudyFires() {
TreeModelListener listener = createMock(TreeModelListener.class);
listener.treeNodesInserted((TreeModelEvent)notNull());
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getStudies().add(new Study("X", d_firstIndication));
verify(listener);
}
@Test
public void testAddDrugFires() {
TreeModelListener listener = createMock(TreeModelListener.class);
listener.treeNodesInserted((TreeModelEvent)notNull());
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getDrugs().add(new Drug("X", "atc"));
verify(listener);
}
@Test
public void testAddPopCharFires() {
TreeModelListener listener = createMock(TreeModelListener.class);
listener.treeNodesInserted((TreeModelEvent)notNull());
replay(listener);
d_treeModel.addTreeModelListener(listener);
d_domain.getPopulationCharacteristics().add(new PopulationCharacteristic("X", new ContinuousVariableType()));
verify(listener);
}
@Test
public void testMetaStudyIsLeaf() throws NullPointerException, IllegalArgumentException, EntityIdExistsException {
RandomEffectsMetaAnalysis study = ExampleData.buildRandomEffectsMetaAnalysis("meta2", d_firstEndpoint, new ArrayList<Study>(Collections.singleton(d_firstStudy)), TreatmentDefinition.createTrivial(d_firstDrug), TreatmentDefinition.createTrivial(d_firstDrug));
d_domain.getMetaAnalyses().add(study);
assertTrue(d_treeModel.isLeaf(study));
assertTrue(d_treeModel.isLeaf(d_firstMetaAnalysis));
}
@Test
public void testGetPathToRoot() {
assertEquals(new TreePath(new Object[] { d_treeModel.getRoot() }),
d_treeModel.getPathTo(d_treeModel.getRoot()));
}
@Test
public void testGetPathToCategory() {
assertEquals(new TreePath(new Object[] { d_treeModel.getRoot(), d_domain.getCategory(Indication.class) }),
d_treeModel.getPathTo(d_domain.getCategory(Indication.class)));
assertEquals(new TreePath(new Object[] { d_treeModel.getRoot(), d_domain.getCategory(Endpoint.class) }),
d_treeModel.getPathTo(d_domain.getCategory(Endpoint.class)));
assertEquals(new TreePath(new Object[] { d_treeModel.getRoot(), d_domain.getCategory(MetaBenefitRiskAnalysis.class) }),
d_treeModel.getPathTo(d_domain.getCategory(MetaBenefitRiskAnalysis.class)));
}
@Test
public void testGetPathToEntity() {
assertEquals(
new TreePath(new Object[] {
d_treeModel.getRoot(), d_domain.getCategory(Indication.class), d_firstIndication}),
d_treeModel.getPathTo(d_firstIndication));
assertEquals(
new TreePath(new Object[] {
d_treeModel.getRoot(), d_domain.getCategory(PairWiseMetaAnalysis.class), d_firstMetaAnalysis}),
d_treeModel.getPathTo(d_firstMetaAnalysis));
}
}