/* * 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.plugin.mongocollab; import com.google.common.collect.Lists; import com.mongodb.DBCollection; import org.broad.igv.AbstractHeadlessTest; import org.broad.igv.feature.BasicFeature; import org.broad.igv.feature.NamedFeature; import org.broad.igv.track.Track; import org.broad.igv.ui.action.SearchCommand; import org.broad.igv.util.TestUtils; import org.junit.*; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import static org.junit.Assert.*; /** * Starts a Mongo server instance, host must have mongo installed * See {@link MongoCollabPluginTest} * @author jacob * @date 2013-Sep-17 */ public class MongoFeatureSourceTest extends AbstractHeadlessTest{ private MongoCollabPlugin.Locator locator; private MongoFeatureSource source; private DBCollection collection; @BeforeClass public static void setUpClass() throws Exception{ MongoCollabPluginTest.setUpClass(); } @AfterClass public static void tearDownClass() throws Exception{ MongoCollabPluginTest.tearDownClass(); } @Before public void setUp() throws Exception { MongoCollabPluginTest.assumeTestDBRunning(); super.setUp(); this.locator = MongoCollabPluginTest.getTestLocator(); this.collection = MongoCollabPluginTest.emptyTestCollection(); this.source = new MongoFeatureSource(this.collection, true); } @After public void tearDown() throws Exception{ super.tearDown(); MongoCollabPlugin.closeMongo(locator.host, locator.port); } @Test public void testHasIndex() throws Exception{ assertTrue(this.source.hasLocusIndex()); this.source = new MongoFeatureSource(this.collection, false); assertTrue(this.source.hasLocusIndex()); this.collection.dropIndexes(); this.source = new MongoFeatureSource(this.collection, false); assertFalse(this.source.hasLocusIndex()); } @Test public void testGetFeatures_chr() throws Exception{ int inserted = MongoCollabPlugin.insertFeaturesFromFile(this.collection, TestUtils.DATA_DIR + "bed/test.bed"); Iterator<DBFeature.IGVFeat> features = this.source.getFeatures("chr1", 0, Integer.MAX_VALUE); List<DBFeature.IGVFeat> chr1List = Lists.newArrayList(features); features = this.source.getFeatures("chr2", 0, Integer.MAX_VALUE); List<DBFeature.IGVFeat> chr2List = Lists.newArrayList(features); assertEquals(inserted, chr1List.size() + chr2List.size()); TestUtils.assertFeatureIteratorSorted(chr1List.iterator()); TestUtils.assertFeatureIteratorSorted(chr2List.iterator()); } @Test public void testGetFeatures_start_01() throws Exception{ int inserted = MongoCollabPlugin.insertFeaturesFromFile(this.collection, TestUtils.DATA_DIR + "bed/test.bed"); Iterator<DBFeature.IGVFeat> features = this.source.getFeatures("chr1", 250, 100005); List<DBFeature.IGVFeat> list = Lists.newArrayList(features); assertEquals(2, list.size()); TestUtils.assertFeatureIteratorSorted(list.iterator()); } @Test public void testGetFeatures_start_02() throws Exception{ int inserted = MongoCollabPlugin.insertFeaturesFromFile(this.collection, TestUtils.DATA_DIR + "bed/test.bed"); Iterator<DBFeature.IGVFeat> features = this.source.getFeatures("chr1", 100005, 100008); List<DBFeature.IGVFeat> list_00 = Lists.newArrayList(features); assertEquals(1, list_00.size()); assertEquals(100000, list_00.get(0).getStart()); features = this.source.getFeatures("chr1", 100005, 200008); List<DBFeature.IGVFeat> list_01 = Lists.newArrayList(features); assertEquals(2, list_01.size()); assertEquals(100000, list_01.get(0).getStart()); } private void setupUnigene(){ collection.drop(); int inserted = MongoCollabPlugin.insertFeaturesFromFile(this.collection, TestUtils.DATA_DIR + "bed/Unigene.sample.bed"); assert inserted > 0; } private NamedFeature getUnigeneTestFeature(){ //Note the cases are incorrect, want to make sure matching is case-insensitive BasicFeature testFeat = new BasicFeature("chr2", 179908392, 179909870); testFeat.setName("hs.516555"); return testFeat; } @Test public void testGetFeaturesByName() throws Exception{ setupUnigene(); NamedFeature testFeat = getUnigeneTestFeature(); Collection<? extends NamedFeature> features = this.source.search(testFeat.getName(), 0); List<? extends NamedFeature> list = Lists.newArrayList(features); assertEquals(1, list.size()); NamedFeature resFeat = list.get(0); TestUtils.assertNamedFeaturesEqual(testFeat, resFeat); } @Test public void testSearchCommand() throws Exception{ setupUnigene(); NamedFeature testFeat = getUnigeneTestFeature(); //Need to call this to attach listener MongoFeatureSource.loadFeatureTrack(MongoCollabPluginTest.getTestLocator(), new ArrayList<Track>()); String searchStr = testFeat.getName(); SearchCommand cmd = new SearchCommand(null, searchStr, false); List<SearchCommand.SearchResult> list = cmd.runSearch(searchStr); assertEquals(1, list.size()); SearchCommand.SearchResult result = list.get(0); assertEquals(SearchCommand.ResultType.FEATURE, result.getType()); NamedFeature resFeat = result.getFeature(); TestUtils.assertNamedFeaturesEqual(testFeat, resFeat); } }