diff --git a/public/shiva/.gitignore b/public/shiva/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..eb5a316cbd195d26e3f768c7dd8e1b47299e17f8
--- /dev/null
+++ b/public/shiva/.gitignore
@@ -0,0 +1 @@
+target
diff --git a/public/shiva/pom.xml b/public/shiva/pom.xml
index 301fa2b0a56be94a4897dd337785fc17e9645e16..fd5e2e191e777c6fba475739f9c79525a00e2d28 100644
--- a/public/shiva/pom.xml
+++ b/public/shiva/pom.xml
@@ -23,6 +23,18 @@
Mapping
${project.version}
+
+ org.testng
+ testng
+ 6.8
+ test
+
+
+ org.scalatest
+ scalatest_2.11
+ 2.2.1
+ test
+
\ No newline at end of file
diff --git a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
index 0c7c0acc570a39cc97c3112aaecc9367ec91b7c4..d71379a9ff3d925f88991140bd831a2d6c7594e9 100644
--- a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
+++ b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
@@ -40,6 +40,9 @@ trait ShivaVariantcallingTrait extends SummaryQScript with SampleLibraryTag {
def biopetScript: Unit = {
val callers = usedCallers.sortBy(_.prio)
+ require(!inputBams.isEmpty, "No input bams found")
+ require(callers.exists(_.use), "must select atleast 1 variantcaller")
+
val cv = new CombineVariants(qscript)
cv.outputFile = finalFile
cv.setKey = "VariantCaller"
diff --git a/public/shiva/src/test/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTest.scala b/public/shiva/src/test/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTest.scala
new file mode 100644
index 0000000000000000000000000000000000000000..52db1b61651b0a55ab37ba5eedccb13bf25a8366
--- /dev/null
+++ b/public/shiva/src/test/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTest.scala
@@ -0,0 +1,84 @@
+package nl.lumc.sasc.biopet.pipelines.shiva
+
+import java.io.File
+
+import com.google.common.io.Files
+import nl.lumc.sasc.biopet.core.config.Config
+import nl.lumc.sasc.biopet.extensions.bcftools.Bcftools
+import nl.lumc.sasc.biopet.extensions.gatk.CombineVariants
+import nl.lumc.sasc.biopet.tools.{VcfFilter, MpileupToVcf}
+import nl.lumc.sasc.biopet.utils.ConfigUtils
+import org.apache.commons.io.FileUtils
+import org.broadinstitute.gatk.queue.QSettings
+import org.scalatest.Matchers
+import org.scalatest.testng.TestNGSuite
+import org.testng.annotations.{ AfterClass, Test, DataProvider }
+
+/**
+ * Created by pjvan_thof on 3/2/15.
+ */
+class ShivaVariantcallingTest extends TestNGSuite with Matchers {
+ def initPipeline(map: Map[String, Any]): ShivaVariantcalling = {
+ new ShivaVariantcalling {
+ override def configName = "shivavariantcalling"
+ override def globalConfig = new Config(ConfigUtils.mergeMaps(map, ShivaVariantcallingTest.config))
+ qSettings = new QSettings
+ qSettings.runName = "test"
+ }
+ }
+
+ @DataProvider(name = "shivaVariantcallingOptions")
+ def mappingOptions = {
+ val raw = Array(true, false)
+ val bcftools = Array(true, false)
+
+ (for (
+ bams <- 0 to 3;
+ raw <- raw;
+ bcftools <- bcftools
+ ) yield Array[Any](bams, raw, bcftools)
+ ).toArray
+ }
+
+ @Test(dataProvider = "shivaVariantcallingOptions")
+ def testShivaVariantcalling(bams: Int, raw: Boolean, bcftools: Boolean) = {
+ val map = Map("use_raw" -> raw, "use_bcftools" -> bcftools)
+ val pipeline = initPipeline(map)
+
+ pipeline.inputBams = (for (n <- 1 to bams) yield new File("bam_" + n + ".bam")).toList
+
+ val illegalArgumentException = pipeline.inputBams.isEmpty || !raw && !bcftools
+
+ if (illegalArgumentException) intercept[IllegalArgumentException] {
+ pipeline.script()
+ }
+
+ if (!illegalArgumentException) {
+ pipeline.script()
+
+ pipeline.functions.count(_.isInstanceOf[CombineVariants]) shouldBe 1 + (if (raw) 1 else 0)
+ //pipeline.functions.count(_.isInstanceOf[Bcftools]) shouldBe (if (bcftools) 1 else 0)
+ //FIXME: Can not check for bcftools because of piping
+ pipeline.functions.count(_.isInstanceOf[MpileupToVcf]) shouldBe (if (raw) bams else 0)
+ pipeline.functions.count(_.isInstanceOf[VcfFilter]) shouldBe (if (raw) bams else 0)
+ }
+ }
+
+ @AfterClass def removeTempOutputDir() = {
+ FileUtils.deleteDirectory(ShivaVariantcallingTest.outputDir)
+ }
+
+}
+
+object ShivaVariantcallingTest {
+ val outputDir = Files.createTempDir()
+
+ val config = Map(
+ "name_prefix" -> "test",
+ "output_dir" -> outputDir,
+ "reference" -> "test",
+ "gatk_jar" -> "test",
+ "samtools" -> Map("exe" -> "test"),
+ "bcftools" -> Map("exe" -> "test")
+ )
+}
\ No newline at end of file