From 1ac972542c47ffdda95a648d1b1e0c62ed5e3c5e Mon Sep 17 00:00:00 2001
From: Peter van 't Hof <p.j.van_t_hof@lumc.nl>
Date: Sun, 15 May 2016 22:14:35 +0200
Subject: [PATCH] Added basic testing

---
 .../mapping/MultisampleMapping.scala          |   5 +-
 .../mapping/MultisampleMappingTest.scala      | 133 ++++++++++++++++++
 2 files changed, 135 insertions(+), 3 deletions(-)
 create mode 100644 mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingTest.scala

diff --git a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMapping.scala b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMapping.scala
index f0d3c7313..4c039383a 100644
--- a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMapping.scala
+++ b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMapping.scala
@@ -43,7 +43,7 @@ trait MultisampleMappingTrait extends MultiSampleQScript
   /** With this method the merge strategy for libraries to samples is defined. This can be overriden to fix the merge strategy. */
   def mergeStrategy: MergeStrategy.Value = {
     val value: String = config("merge_strategy", default = "preprocessmarkduplicates")
-    MergeStrategy.values.find(_.toString.toLowerCase == value) match {
+    MergeStrategy.values.find(_.toString.toLowerCase == value.toLowerCase) match {
       case Some(v) => v
       case _       => throw new IllegalArgumentException(s"merge_strategy '$value' does not exist")
     }
@@ -151,10 +151,9 @@ trait MultisampleMappingTrait extends MultiSampleQScript
               try {
                 header.getSequenceDictionary.assertSameDictionary(referenceFile.getSequenceDictionary)
               } catch {
-                case e: AssertionError => {
+                case e: AssertionError =>
                   logger.error(e.getMessage)
                   oke = false
-                }
               }
               oke
             }
diff --git a/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingTest.scala b/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingTest.scala
new file mode 100644
index 000000000..f0449a7e0
--- /dev/null
+++ b/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingTest.scala
@@ -0,0 +1,133 @@
+package nl.lumc.sasc.biopet.pipelines.mapping
+
+import java.io.{File, FileOutputStream}
+
+import com.google.common.io.Files
+import nl.lumc.sasc.biopet.extensions.picard.{MarkDuplicates, MergeSamFiles}
+import nl.lumc.sasc.biopet.utils.ConfigUtils
+import nl.lumc.sasc.biopet.utils.config.Config
+import org.broadinstitute.gatk.queue.QSettings
+import org.scalatest.Matchers
+import org.scalatest.testng.TestNGSuite
+import org.testng.annotations.{DataProvider, Test}
+
+/**
+  * Created by pjvanthof on 15/05/16.
+  */
+class MultisampleMappingTest extends TestNGSuite with Matchers {
+  def initPipeline(map: Map[String, Any]): MultisampleMapping = {
+    new MultisampleMapping() {
+      override def configNamespace = "multisamplemapping"
+      override def globalConfig = new Config(ConfigUtils.mergeMaps(map, MultisampleMappingTestTrait.config))
+      qSettings = new QSettings
+      qSettings.runName = "test"
+    }
+  }
+
+  def mergeStrategies = MultisampleMapping.MergeStrategy.values
+  def bamToFastq = false
+  def correctReadgroups = false
+
+  @DataProvider(name = "mappingOptions")
+  def mappingOptions = {
+    val bool = Array(true, false)
+    for (
+      merge <- mergeStrategies.toArray; sample2 <- bool
+    ) yield Array(merge, true, sample2)
+  }
+
+  @Test(dataProvider = "mappingOptions")
+  def testMultisampleMapping(merge: MultisampleMapping.MergeStrategy.Value, sample1: Boolean, sample2: Boolean): Unit = {
+    val map: Map[String, Any] = {
+      var m: Map[String, Any] = MultisampleMappingTestTrait.config
+      if (sample1) m = ConfigUtils.mergeMaps(MultisampleMappingTestTrait.sample1, m)
+      if (sample2) m = ConfigUtils.mergeMaps(MultisampleMappingTestTrait.sample2, m)
+      m ++ Map("merge_strategy" -> merge.toString, "bam_to_fastq" -> bamToFastq, "correct_readgroups" -> correctReadgroups)
+    }
+
+    if (!sample1 && !sample2) { // When no samples
+      intercept[IllegalArgumentException] {
+        initPipeline(map).script()
+      }
+    } else {
+      val pipeline = initPipeline(map)
+      pipeline.script()
+
+      val numberLibs = (if (sample1) 1 else 0) + (if (sample2) 2 else 0)
+      val numberSamples = (if (sample1) 1 else 0) + (if (sample2) 1 else 0)
+
+      import MultisampleMapping.MergeStrategy
+      pipeline.functions.count(_.isInstanceOf[MarkDuplicates]) shouldBe (numberLibs +
+        (if (sample2 && (merge == MergeStrategy.MarkDuplicates || merge == MergeStrategy.PreProcessMarkDuplicates)) 1 else 0))
+      pipeline.functions.count(_.isInstanceOf[MergeSamFiles]) shouldBe (
+        (if (sample2 && (merge == MergeStrategy.MergeSam || merge == MergeStrategy.PreProcessMergeSam)) 1 else 0))
+      pipeline.samples.foreach { case (sampleName, sample) =>
+        if (merge == MergeStrategy.None) sample.bamFile shouldBe None
+      }
+    }
+  }
+}
+
+object MultisampleMappingTestTrait {
+  val outputDir = Files.createTempDir()
+  outputDir.deleteOnExit()
+  new File(outputDir, "input").mkdirs()
+  def inputTouch(name: String): File = {
+    val file = new File(outputDir, "input" + File.separator + name).getAbsoluteFile
+    Files.touch(file)
+    file
+  }
+
+  private def copyFile(name: String): Unit = {
+    val is = getClass.getResourceAsStream("/" + name)
+    val os = new FileOutputStream(new File(outputDir, name))
+    org.apache.commons.io.IOUtils.copy(is, os)
+    os.close()
+  }
+
+  copyFile("ref.fa")
+  copyFile("ref.dict")
+  copyFile("ref.fa.fai")
+
+  val config = Map(
+    "name_prefix" -> "test",
+    "cache" -> true,
+    "dir" -> "test",
+    "vep_script" -> "test",
+    "output_dir" -> outputDir,
+    "reference_fasta" -> (outputDir + File.separator + "ref.fa"),
+    "fastqc" -> Map("exe" -> "test"),
+    "input_alleles" -> "test",
+    "fastqc" -> Map("exe" -> "test"),
+    "seqtk" -> Map("exe" -> "test"),
+    "sickle" -> Map("exe" -> "test"),
+    "cutadapt" -> Map("exe" -> "test"),
+    "bwa" -> Map("exe" -> "test"),
+    "samtools" -> Map("exe" -> "test"),
+    "igvtools" -> Map("exe" -> "test"),
+    "wigtobigwig" -> Map("exe" -> "test"),
+    "md5sum" -> Map("exe" -> "test")
+  )
+
+  val sample1 = Map(
+    "samples" -> Map("sample1" -> Map("libraries" -> Map(
+      "lib1" -> Map(
+        "R1" -> inputTouch("1_1_R1.fq"),
+        "R2" -> inputTouch("1_1_R2.fq")
+      )
+    )
+    )))
+
+  val sample2 = Map(
+    "samples" -> Map("sample3" -> Map("libraries" -> Map(
+      "lib1" -> Map(
+        "R1" -> inputTouch("2_1_R1.fq"),
+        "R2" -> inputTouch("2_1_R2.fq")
+      ),
+      "lib2" -> Map(
+        "R1" -> inputTouch("2_2_R1.fq"),
+        "R2" -> inputTouch("2_2_R2.fq")
+      )
+    )
+    )))
+}
-- 
GitLab