/*
* Eoulsan development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public License version 2.1 or
* later and CeCILL-C. This should be distributed with the code.
* If you do not have a copy, see:
*
* http://www.gnu.org/licenses/lgpl-2.1.txt
* http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt
*
* Copyright for this code is held jointly by the Genomic platform
* of the Institut de Biologie de l'École normale supérieure and
* the individual authors. These should be listed in @author doc
* comments.
*
* For more information on the Eoulsan project and its aims,
* or to join the Eoulsan Google group, visit the home page
* at:
*
* http://outils.genomique.biologie.ens.fr/eoulsan
*
*/
package fr.ens.biologie.genomique.eoulsan.bio;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import fr.ens.biologie.genomique.eoulsan.bio.GenomicArray;
import fr.ens.biologie.genomique.eoulsan.bio.GenomicInterval;
/**
* TODO: finish the test class.
* @since 1.2
* @author Laurent Jourdren
* @author Claire Wallon
*/
public class GenomicArrayTest {
private class FastGenomicInterval {
final String chromosome;
final char strand;
GenomicInterval iv(final int start, final int end) {
return new GenomicInterval(this.chromosome, start, end, this.strand);
}
FastGenomicInterval(final String chromosome, final char strand) {
this.chromosome = chromosome;
this.strand = strand;
}
}
private GenomicArray<String> ga;
private FastGenomicInterval fgi;
private FastGenomicInterval fgi_stranded;
private Map<GenomicInterval, Set<String>> r;
// /**
// * @throws java.lang.Exception
// */
@Before
public void setUp() throws Exception {
this.ga = new GenomicArray<>();
this.fgi = new FastGenomicInterval("chr1", '.');
this.fgi_stranded = new FastGenomicInterval("chr1", '-');
}
/**
* Test method for
* {fr.ens.biologie.genomique.eoulsan.bio.GenomicArray#addEntry(fr.ens
* .biologie.genomique.eoulsan.bio.GenomicInterval, java.lang.Object)}.
*/
@Test
public void testAddEntry() {
/*
* In comments of this function, the order of intervals that is indicated is
* defined by the starting positions of each intervals on the chromosome.
* For example, "the first interval is before the second one" means that the
* starting position of the first interval is less than the starting
* position of the second interval.
*/
/*
* The two intervals are non-overlapping and the first one is before the
* second one.
*/
// Add [10,50]=a
GenomicInterval iv1 = this.fgi.iv(10, 50);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 50)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [60,70]=b
this.ga.addEntry(this.fgi.iv(60, 70), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(60, 70)));
/*
* The two intervals are non overlapping and the first one is after the
* second.
*/
this.ga.clear();
// Add [15,20]=a
iv1 = this.fgi.iv(15, 20);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(15, 20)));
assertEquals(1, this.r.get(this.fgi.iv(15, 20)).size());
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [5,10]=b
this.ga.addEntry(this.fgi.iv(5, 10), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(15, 20)));
assertEquals(1, this.r.get(this.fgi.iv(15, 20)).size());
assertTrue(this.r.containsKey(this.fgi.iv(5, 10)));
assertEquals(1, this.r.get(this.fgi.iv(5, 10)).size());
/*
* The two intervals are overlapping and the first one is before the second
* one.
*/
this.ga.clear();
// Add [10,20]=a
iv1 = this.fgi_stranded.iv(10, 20);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi_stranded.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi_stranded.iv(10, 20)));
assertFalse(this.r.containsKey(this.fgi_stranded.iv(60, 70)));
// Add [15,25]=b
this.ga.addEntry(this.fgi_stranded.iv(15, 25), "b");
this.r = this.ga.getEntries(this.fgi_stranded.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi_stranded.iv(10, 14)));
assertEquals(1, this.r.get(this.fgi_stranded.iv(10, 14)).size());
assertTrue(this.r.containsKey(this.fgi_stranded.iv(15, 20)));
assertEquals(2, this.r.get(this.fgi_stranded.iv(15, 20)).size());
assertTrue(this.r.containsKey(this.fgi_stranded.iv(21, 25)));
assertEquals(1, this.r.get(this.fgi_stranded.iv(21, 25)).size());
/*
* The two intervals are overlapping and the first one is after the second
* one.
*/
this.ga.clear();
// Add [10,40]=a
iv1 = this.fgi.iv(10, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [5,30]=b
this.ga.addEntry(this.fgi.iv(5, 30), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(5, 9)));
assertEquals(1, this.r.get(this.fgi.iv(5, 9)).size());
assertTrue(this.r.containsKey(this.fgi.iv(10, 30)));
assertEquals(2, this.r.get(this.fgi.iv(10, 30)).size());
assertTrue(this.r.containsKey(this.fgi.iv(31, 40)));
assertEquals(1, this.r.get(this.fgi.iv(31, 40)).size());
/*
* The two intervals are overlapping on only one base and the first interval
* is before the second one.
*/
this.ga.clear();
// Add [10,20]=a
iv1 = this.fgi.iv(10, 20);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 20)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [20,30]=b
this.ga.addEntry(this.fgi.iv(20, 30), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 19)));
assertEquals(1, this.r.get(this.fgi.iv(10, 19)).size());
assertTrue(this.r.containsKey(this.fgi.iv(20, 20)));
assertEquals(2, this.r.get(this.fgi.iv(20, 20)).size());
assertTrue(this.r.containsKey(this.fgi.iv(21, 30)));
assertEquals(1, this.r.get(this.fgi.iv(21, 30)).size());
/*
* The two intervals are overlapping on only one base and the first interval
* is after the second one.
*/
this.ga.clear();
// Add [20,30]=a
iv1 = this.fgi.iv(20, 30);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 30)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [10,20]=b
this.ga.addEntry(this.fgi.iv(10, 20), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 19)));
assertEquals(1, this.r.get(this.fgi.iv(10, 19)).size());
assertTrue(this.r.containsKey(this.fgi.iv(20, 20)));
assertEquals(2, this.r.get(this.fgi.iv(20, 20)).size());
assertTrue(this.r.containsKey(this.fgi.iv(21, 30)));
assertEquals(1, this.r.get(this.fgi.iv(21, 30)).size());
/*
* The first interval is included in the second one and they have the same
* starting position.
*/
this.ga.clear();
// Add [20,40]=a
iv1 = this.fgi.iv(20, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [20,55]=b
this.ga.addEntry(this.fgi.iv(20, 55), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 40)));
assertEquals(2, this.r.get(this.fgi.iv(20, 40)).size());
assertTrue(this.r.containsKey(this.fgi.iv(41, 55)));
assertEquals(1, this.r.get(this.fgi.iv(41, 55)).size());
/*
* The second interval is included in the first one and they have the same
* starting position.
*/
this.ga.clear();
// Add [20,40]=a
iv1 = this.fgi.iv(20, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [20,35]=b
this.ga.addEntry(this.fgi.iv(20, 35), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 35)));
assertEquals(2, this.r.get(this.fgi.iv(20, 35)).size());
assertTrue(this.r.containsKey(this.fgi.iv(36, 40)));
assertEquals(1, this.r.get(this.fgi.iv(36, 40)).size());
/*
* The first interval is included in the second one and they have the same
* ending position.
*/
this.ga.clear();
// Add [10,40]=a
iv1 = this.fgi.iv(10, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [5,40]=b
this.ga.addEntry(this.fgi.iv(5, 40), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(5, 9)));
assertEquals(1, this.r.get(this.fgi.iv(5, 9)).size());
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertEquals(2, this.r.get(this.fgi.iv(10, 40)).size());
/*
* The second interval is included in the first one and they have the same
* ending position.
*/
this.ga.clear();
// Add [5,40]=a
iv1 = this.fgi.iv(5, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(5, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [10,40]=b
this.ga.addEntry(this.fgi.iv(10, 40), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(5, 9)));
assertEquals(1, this.r.get(this.fgi.iv(5, 9)).size());
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertEquals(2, this.r.get(this.fgi.iv(10, 40)).size());
/*
* The second interval is included in the first one.
*/
this.ga.clear();
// Add [20,40]=a
iv1 = this.fgi.iv(20, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [25,35]=b
this.ga.addEntry(this.fgi.iv(25, 35), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 24)));
assertEquals(1, this.r.get(this.fgi.iv(20, 24)).size());
assertTrue(this.r.containsKey(this.fgi.iv(25, 35)));
assertEquals(2, this.r.get(this.fgi.iv(25, 35)).size());
assertTrue(this.r.containsKey(this.fgi.iv(36, 40)));
assertEquals(1, this.r.get(this.fgi.iv(36, 40)).size());
/*
* The first interval is included in the second one.
*/
this.ga.clear();
// Add [25,35]=a
iv1 = this.fgi.iv(25, 35);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(25, 35)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [20,40]=b
this.ga.addEntry(this.fgi.iv(20, 40), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(20, 24)));
assertEquals(1, this.r.get(this.fgi.iv(20, 24)).size());
assertTrue(this.r.containsKey(this.fgi.iv(25, 35)));
assertEquals(2, this.r.get(this.fgi.iv(25, 35)).size());
assertTrue(this.r.containsKey(this.fgi.iv(36, 40)));
assertEquals(1, this.r.get(this.fgi.iv(36, 40)).size());
/*
* The two intervals are identical.
*/
this.ga.clear();
// Add [10,40]=a
iv1 = this.fgi.iv(10, 40);
this.ga.addEntry(iv1, "a");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertFalse(this.r.containsKey(this.fgi.iv(60, 70)));
// Add [10,40]=b
this.ga.addEntry(this.fgi.iv(10, 40), "b");
this.r = this.ga.getEntries(this.fgi.chromosome, 1, 100);
assertTrue(this.r.containsKey(this.fgi.iv(10, 40)));
assertEquals(2, this.r.get(this.fgi.iv(10, 40)).size());
}
//
// /**
// * Test method for
// * {fr.ens.biologie.genomique.eoulsan.bio.GenomicArray#getEntries(fr
// * .ens.biologie.genomique.eoulsan.bio.GenomicInterval)}.
// */
// @Test
// public void testGetEntriesGenomicInterval() {
// fail("Not yet implemented");
// }
//
// /**
// * Test method for
// *
// {fr.ens.biologie.genomique.eoulsan.bio.GenomicArray#getEntries(java.lang.String,
// * int, int)}.
// */
// @Test
// public void testGetEntriesStringIntInt() {
// fail("Not yet implemented");
// }
//
// /**
// * Test method for
// * {fr.ens.biologie.genomique.eoulsan.bio.GenomicArray#containsChromosome
// * (java.lang.String)}.
// */
// @Test
// public void testContainsChromosome() {
// fail("Not yet implemented");
// }
}