gov.nih.nci.caintegrator.application.study.deployment.AffymetrixCopyNumberMappingFileHandlerTest.java Source code

Java tutorial

Introduction

Here is the source code for gov.nih.nci.caintegrator.application.study.deployment.AffymetrixCopyNumberMappingFileHandlerTest.java

Source

/**
 * Copyright 5AM Solutions Inc, ESAC, ScenPro & SAIC
 *
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.com/caintegrator/LICENSE.txt for details.
 */
package gov.nih.nci.caintegrator.application.study.deployment;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import gov.nih.nci.caintegrator.TestDataFiles;
import gov.nih.nci.caintegrator.application.arraydata.PlatformDataTypeEnum;
import gov.nih.nci.caintegrator.application.study.DnaAnalysisDataConfiguration;
import gov.nih.nci.caintegrator.application.study.GenomicDataSourceConfiguration;
import gov.nih.nci.caintegrator.application.study.StudyConfiguration;
import gov.nih.nci.caintegrator.application.study.ValidationException;
import gov.nih.nci.caintegrator.data.CaIntegrator2DaoStub;
import gov.nih.nci.caintegrator.domain.genomic.ArrayData;
import gov.nih.nci.caintegrator.domain.genomic.DnaAnalysisReporter;
import gov.nih.nci.caintegrator.domain.genomic.Platform;
import gov.nih.nci.caintegrator.domain.genomic.ReporterList;
import gov.nih.nci.caintegrator.domain.genomic.ReporterTypeEnum;
import gov.nih.nci.caintegrator.domain.genomic.Sample;
import gov.nih.nci.caintegrator.external.ConnectionException;
import gov.nih.nci.caintegrator.external.DataRetrievalException;
import gov.nih.nci.caintegrator.external.caarray.CaArrayFacade;
import gov.nih.nci.caintegrator.mockito.AbstractMockitoTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import affymetrix.calvin.data.CHPMultiDataData.MultiDataType;
import affymetrix.calvin.data.ProbeSetMultiDataCopyNumberData;
import affymetrix.calvin.exception.UnsignedOutOfLimitsException;
import affymetrix.fusion.chp.FusionCHPDataReg;
import affymetrix.fusion.chp.FusionCHPMultiDataData;

/**
 * Tests for Affymetrix Copy Number Mapping file handler.
 *
 * @author Abraham J. Evans-EL <aevansel@5amsolutions.com>
 */
public class AffymetrixCopyNumberMappingFileHandlerTest extends AbstractMockitoTest {

    /**
     * Expected Exception.
     */
    @Rule
    public ExpectedException expectedException = ExpectedException.none();
    private CaArrayFacade caArrayFacade;

    /**
     * Sets up the test.
     * @throws Exception on error
     */
    @Before
    public void setUp() throws Exception {
        caArrayFacade = mock(CaArrayFacade.class);
        when(caArrayFacade.retrieveFile(any(GenomicDataSourceConfiguration.class), anyString()))
                .thenReturn(FileUtils.readFileToByteArray(TestDataFiles.HIND_COPY_NUMBER_CHP_FILE));
    }

    /**
     * Tests loading copy number data.
     * @throws DataRetrievalException on error
     * @throws ConnectionException on error
     * @throws ValidationException on error
     * @throws FileNotFoundException on error
     */
    @Test
    public void testLoadCopyNumberData()
            throws DataRetrievalException, ConnectionException, ValidationException, FileNotFoundException {
        CaIntegrator2DaoStub dao = new LocalCaIntegrator2DaoStub();
        GenomicDataSourceConfiguration source = new GenomicDataSourceConfiguration();
        StudyConfiguration studyConfiguration = new StudyConfiguration();
        studyConfiguration.getOrCreateSubjectAssignment("E09176");

        Sample sample = new Sample();
        sample.setName("E09176");

        source.getSamples().add(sample);
        source.setStudyConfiguration(studyConfiguration);
        source.setDataType(PlatformDataTypeEnum.COPY_NUMBER);
        source.setDnaAnalysisDataConfiguration(new DnaAnalysisDataConfiguration());
        source.getDnaAnalysisDataConfiguration()
                .setMappingFilePath(TestDataFiles.SHORT_COPY_NUMBER_FILE.getAbsolutePath());
        AbstractAffymetrixDnaAnalysisMappingFileHandler handler = new AffymetrixCopyNumberMappingFileHandler(source,
                caArrayFacade, arrayDataService, dao);
        handler.loadArrayData();

        Set<ArrayData> arrayDatas = studyConfiguration.getStudy()
                .getArrayDatas(ReporterTypeEnum.DNA_ANALYSIS_REPORTER, null);
        assertEquals(1, arrayDatas.size());
        for (ArrayData arrayData : arrayDatas) {
            checkArrayData(arrayData);
        }
    }

    /**
     * Test loading copy number data without a mapping file.
     * @throws DataRetrievalException on error
     * @throws ConnectionException on error
     * @throws ValidationException on error
     * @throws FileNotFoundException on expected error
     */
    @Test
    public void testLoadCopyNumberDataNoFile()
            throws DataRetrievalException, ConnectionException, ValidationException, FileNotFoundException {
        expectedException.expect(DataRetrievalException.class);
        expectedException.expectMessage("DNA analysis mapping file not found");

        CaIntegrator2DaoStub dao = new LocalCaIntegrator2DaoStub();
        GenomicDataSourceConfiguration source = new GenomicDataSourceConfiguration();
        StudyConfiguration studyConfiguration = new StudyConfiguration();
        studyConfiguration.getOrCreateSubjectAssignment("E09176");
        source.setStudyConfiguration(studyConfiguration);
        source.setDataType(PlatformDataTypeEnum.COPY_NUMBER);
        source.setDnaAnalysisDataConfiguration(new DnaAnalysisDataConfiguration());
        // test if file not found
        source.getDnaAnalysisDataConfiguration()
                .setMappingFilePath(TestDataFiles.INVALID_FILE_DOESNT_EXIST.getAbsolutePath());
        AbstractAffymetrixDnaAnalysisMappingFileHandler handler = new AffymetrixCopyNumberMappingFileHandler(source,
                caArrayFacade, arrayDataService, dao);
        handler.loadArrayData();
    }

    private void checkArrayData(ArrayData arrayData) {
        assertNotNull(arrayData.getArray());
        assertNotNull(arrayData.getArray().getPlatform());
        assertTrue(arrayData.getArray().getArrayDataCollection().contains(arrayData));
        assertNotNull(arrayData.getSample());
        assertTrue(arrayData.getSample().getArrayDataCollection().contains(arrayData));
        assertTrue(arrayData.getSample().getArrayCollection().contains(arrayData.getArray()));
    }

    /**
     * Local implementation for dao stub.
     *
     * @author Abraham J. Evans-EL <aevansel@5amsolutions.com>
     */
    private static class LocalCaIntegrator2DaoStub extends CaIntegrator2DaoStub {

        private Platform platform;

        @Override
        public Platform getPlatform(String name) {
            return getPlatform();
        }

        private Platform getPlatform() {
            if (platform != null) {
                return platform;
            }
            try {
                Platform platform = new Platform();
                FusionCHPMultiDataData.registerReader();
                addReporterList(platform, TestDataFiles.HIND_COPY_NUMBER_CHP_FILE, "Mapping50K_Hind240");
                addReporterList(platform, TestDataFiles.XBA_COPY_NUMBER_CHP_FILE, "Mapping50K_Xba240");
                return platform;
            } catch (Exception e) {
                throw new IllegalStateException(e);
            }
        }

        private void addReporterList(Platform platform, File chpFile, String reporterListName)
                throws IOException, UnsignedOutOfLimitsException {
            FusionCHPMultiDataData chpData = FusionCHPMultiDataData
                    .fromBase(FusionCHPDataReg.read(chpFile.getAbsolutePath()));
            ReporterList reporterList = platform.addReporterList(reporterListName,
                    ReporterTypeEnum.DNA_ANALYSIS_REPORTER);
            int numProbeSets = chpData.getEntryCount(MultiDataType.CopyNumberMultiDataType);
            for (int i = 0; i < numProbeSets; i++) {
                ProbeSetMultiDataCopyNumberData probeSetData = chpData
                        .getCopyNumberEntry(MultiDataType.CopyNumberMultiDataType, i);
                DnaAnalysisReporter reporter = new DnaAnalysisReporter();
                reporter.setName(probeSetData.getName());
                reporterList.getReporters().add(reporter);
            }
        }

        @Override
        public ReporterList getReporterList(String name) {
            for (ReporterList reporterList : getPlatform().getReporterLists()) {
                if (name.equals(reporterList.getName())) {
                    return reporterList;
                }
            }
            return null;
        }

    }
}