/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.broad.igv.feature.genome; import org.broad.igv.AbstractHeadlessTest; import org.broad.igv.util.TestUtils; import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.junit.rules.Timeout; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import static junit.framework.Assert.*; /** * @author Jim Robinson * @date 10/31/11 */ public class GenomeTest extends AbstractHeadlessTest { @Rule public TestRule testTimeout = new Timeout((int) 60e3); /** * Test some aliases, both manually entered and automatic. * @throws Exception */ @Test public void testAlias_01() throws Exception { String genomeURL = "http://igv.broadinstitute.org/genomes/hg19.genome"; Genome genome = loadGenomeAssumeSuccess(genomeURL); assertEquals("chrUn_gl000229", genome.getCanonicalChrName("GL000229.1")); assertEquals("chr14", genome.getCanonicalChrName("14")); } @Test public void testAlias_02() throws Exception { // NCBI genome, test an auto-generated alias String genomeURL = "http://igvdata.broadinstitute.org/genomes/NC_000964.genome"; Genome genome = loadGenomeAssumeSuccess(genomeURL); assertEquals("gi|255767013|ref|NC_000964.3|", genome.getCanonicalChrName("NC_000964.3")); } /** * Loads a genome * @param genomeURL * @return */ private Genome loadGenomeAssumeSuccess(String genomeURL){ Genome genome = null; try { genome = GenomeManager.getInstance().loadGenome(genomeURL, null); } catch (Exception e) { e.printStackTrace(); } Assume.assumeNotNull(genome); return genome; } @Test public void testGetNCBIName() throws Exception { String ncbiID = "gi|125745044|ref|NC_002229.3|"; String ncbiName = "NC_002229.3"; assertEquals(ncbiName, Genome.getNCBIName(ncbiID)); } @Test public void testOrderChromos() throws Exception { //Scratch work for now, test methods for separating //contigs into "small" and "large" String indexPath = TestUtils.DATA_DIR + "fasta/CE.cns.all.fa.fai"; Sequence seq = new MockSequence(indexPath); Genome genome = new Genome("GenomeTest", "GenomeTest", seq, false); List<String> actNames = genome.getAllChromosomeNames(); String[] expNames = {"chr1", "chr2", "chr3", "chrX", "C121713571", "scaffold22502"}; int[] expInds = {0, 1, 2, 21, 22, actNames.size() - 1}; int counter = 0; for (int expInd : expInds) { String expName = expNames[counter]; String actName = actNames.get(expInd); assertEquals(expName, actName); counter++; } } @Test public void testGetLongChromosomeNames_manySmall() throws Exception { String mockIndexPath = TestUtils.DATA_DIR + "fasta/mock_many_small.fa.fai"; Sequence sequence = new MockSequence(mockIndexPath); Genome genome = new Genome("mock_many_small", "mock_many_small", sequence, true); assertNotNull(genome.getLongChromosomeNames()); assertTrue("No 'Long' chromosome names found", genome.getLongChromosomeNames().size() > 0); } /** * Class which loads FastaIndex and returns information contained therein, * but doesn't actually load full fasta file. For testing */ private class MockSequence implements Sequence { private FastaIndex index; private ArrayList<String> chromoNames; public MockSequence(String fastaIndexPath) throws IOException { this.index = new FastaIndex(fastaIndexPath); this.chromoNames = new ArrayList<String>(index.getSequenceNames()); } @Override public byte[] getSequence(String chr, int start, int end) { return new byte[0]; } @Override public byte getBase(String chr, int position) { return 0; } @Override public List<String> getChromosomeNames() { return chromoNames; } @Override public int getChromosomeLength(String chrname) { return index.getSequenceSize(chrname); } } public static void generateJunkIndex() throws Exception { //Generate index file with many small contigs int numContigs = 10000; int contigMeanSize = 3000; int contigSizeRange = 400; PrintWriter writer = new PrintWriter(new FileWriter(TestUtils.DATA_DIR + "fasta/mock_many_small.fa.fai")); int position = -1; int basesPerLine = 80; int bytesPerLine = 81; for (int ci = 0; ci < numContigs; ci++) { String chr = "" + ci; int size = contigMeanSize + (int) (contigSizeRange * (Math.random() - 0.5)); String line = String.format("%s\t%d\t%d\t%d\t%d", chr, size, position, basesPerLine, bytesPerLine); writer.println(line); } writer.flush(); writer.close(); } public static void main(String[] args) throws Exception { //generateJunkIndex(); } }