From 36641e26f122ca810fb372f53509df807c102ff8 Mon Sep 17 00:00:00 2001
From: Peter van 't Hof <p.j.van_t_hof@lumc.nl>
Date: Thu, 12 Feb 2015 21:02:10 +0100
Subject: [PATCH] Added 128 unit tests to mapping pipeline

---
 public/mapping/pom.xml                        |  12 ++
 .../pipelines/mapping/MappingTest.scala       | 115 ++++++++++++++++++
 2 files changed, 127 insertions(+)
 create mode 100644 public/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MappingTest.scala

diff --git a/public/mapping/pom.xml b/public/mapping/pom.xml
index 345678a7a..0b8400af8 100644
--- a/public/mapping/pom.xml
+++ b/public/mapping/pom.xml
@@ -49,5 +49,17 @@
             <artifactId>BamMetrics</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>6.8</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scalatest</groupId>
+            <artifactId>scalatest_2.11</artifactId>
+            <version>2.2.1</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/public/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MappingTest.scala b/public/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MappingTest.scala
new file mode 100644
index 000000000..cd4eaea9b
--- /dev/null
+++ b/public/mapping/src/test/scala/nl/lumc/sasc/biopet/pipelines/mapping/MappingTest.scala
@@ -0,0 +1,115 @@
+package nl.lumc.sasc.biopet.pipelines.mapping
+
+import java.io.File
+
+import nl.lumc.sasc.biopet.core.config.Config
+import nl.lumc.sasc.biopet.extensions.bwa.{ BwaSamse, BwaSampe, BwaAln, BwaMem }
+import nl.lumc.sasc.biopet.extensions.picard.{ MergeSamFiles, AddOrReplaceReadGroups, MarkDuplicates, SortSam }
+import nl.lumc.sasc.biopet.extensions._
+import nl.lumc.sasc.biopet.pipelines.flexiprep.Cutadapt
+import nl.lumc.sasc.biopet.pipelines.flexiprep.Fastqc
+import nl.lumc.sasc.biopet.pipelines.flexiprep.Sickle
+import nl.lumc.sasc.biopet.pipelines.flexiprep._
+import nl.lumc.sasc.biopet.tools.FastqSync
+import nl.lumc.sasc.biopet.utils.ConfigUtils
+import org.broadinstitute.gatk.queue.QSettings
+import org.scalatest.Matchers
+import org.scalatest.testng.TestNGSuite
+import org.testng.annotations.{ DataProvider, Test }
+
+/**
+ * Created by pjvan_thof on 2/12/15.
+ */
+class MappingTest extends TestNGSuite with Matchers {
+  def initPipeline(map: Map[String, Any]): Mapping = {
+    new Mapping {
+      override def configName = "mapping"
+      override def globalConfig = new Config(map)
+      qSettings = new QSettings
+      qSettings.runName = "test." + System.currentTimeMillis
+    }
+  }
+
+  @DataProvider(name = "mappingOptions", parallel = true)
+  def mappingOptions = {
+    val aligners = Array("bwa", "bwa-aln", "star", "bowtie")
+    val paired = Array(true, false)
+    val chunks = Array(1, 5, 10, 100)
+    val skipMarkDuplicates = Array(true, false)
+    val skipFlexipreps = Array(true, false)
+
+    for (
+      aligner <- aligners;
+      pair <- paired;
+      chunk <- chunks;
+      skipMarkDuplicate <- skipMarkDuplicates;
+      skipFlexiprep <- skipFlexipreps
+    ) yield Array(aligner, pair, chunk, skipMarkDuplicate, skipFlexiprep)
+  }
+
+  @Test(dataProvider = "mappingOptions")
+  def testMapping(aligner: String, paired: Boolean, chunks: Int, skipMarkDuplicate: Boolean, skipFlexiprep: Boolean) = {
+    val map = ConfigUtils.mergeMaps(Map("output_dir" -> MappingTest.outputDir,
+      "aligner" -> aligner,
+      "number_chunks" -> chunks,
+      "skip_markduplicates" -> skipMarkDuplicate,
+      "skip_flexiprep" -> skipFlexiprep
+    ), Map(MappingTest.excutables.toSeq: _*))
+    val mapping: Mapping = initPipeline(map)
+
+    mapping.input_R1 = new File(mapping.outputDir, "bla_R1.fq")
+    if (paired) mapping.input_R2 = Some(new File(mapping.outputDir, "bla_R2.fq"))
+    mapping.sampleId = "1"
+    mapping.libId = "1"
+    mapping.script()
+
+    //Flexiprep
+    mapping.functions.count(_.isInstanceOf[Fastqc]) shouldBe (if (skipFlexiprep) 0 else if (paired) 4 else 2)
+    mapping.functions.count(_.isInstanceOf[Zcat]) shouldBe 0
+    mapping.functions.count(_.isInstanceOf[SeqtkSeq]) shouldBe ((if (skipFlexiprep) 0 else if (paired) 2 else 1) * chunks)
+    mapping.functions.count(_.isInstanceOf[Cutadapt]) shouldBe ((if (skipFlexiprep) 0 else if (paired) 2 else 1) * chunks)
+    mapping.functions.count(_.isInstanceOf[FastqSync]) shouldBe ((if (skipFlexiprep) 0 else if (paired && !skipFlexiprep) 1 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[Sickle]) shouldBe ((if (skipFlexiprep) 0 else 1) * chunks)
+    mapping.functions.count(_.isInstanceOf[Gzip]) shouldBe (if (skipFlexiprep) 0 else if (paired) 2 else 1)
+
+    //aligners
+    mapping.functions.count(_.isInstanceOf[BwaMem]) shouldBe ((if (aligner == "bwa") 1 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[BwaAln]) shouldBe ((if (aligner == "bwa-aln") (if (paired) 2 else 1) else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[BwaSampe]) shouldBe ((if (aligner == "bwa-aln") (if (paired) 1 else 0) else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[BwaSamse]) shouldBe ((if (aligner == "bwa-aln") (if (paired) 0 else 1) else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[Star]) shouldBe ((if (aligner == "star") 1 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[Star]) shouldBe ((if (aligner == "star") 1 else if (aligner == "star-2pass") 3 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[Bowtie]) shouldBe ((if (aligner == "bowtie") 1 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[Stampy]) shouldBe ((if (aligner == "stampy") 1 else 0) * chunks)
+
+    // Sort sam or replace readgroup
+    val sort = aligner match {
+      case "bwa" | "bwa-aln" | "stampy"     => "sortsam"
+      case "star" | "star-2pass" | "bowtie" => "replacereadgroups"
+      case _                                => throw new IllegalArgumentException("aligner: " + aligner + " does not exist")
+    }
+
+    mapping.functions.count(_.isInstanceOf[SortSam]) shouldBe ((if (sort == "sortsam") 1 else 0) * chunks)
+    mapping.functions.count(_.isInstanceOf[AddOrReplaceReadGroups]) shouldBe ((if (sort == "replacereadgroups") 1 else 0) * chunks)
+
+    mapping.functions.count(_.isInstanceOf[MergeSamFiles]) shouldBe (if (skipMarkDuplicate && chunks > 1) 1 else 0)
+    mapping.functions.count(_.isInstanceOf[MarkDuplicates]) shouldBe (if (skipMarkDuplicate) 0 else 1)
+  }
+}
+
+object MappingTest {
+  val outputDir = System.getProperty("java.io.tmpdir") + File.separator + "flexiprep"
+
+  val excutables = Map(
+    "reference" -> "test",
+    "seqstat" -> Map("exe" -> "test"),
+    "fastqc" -> Map("exe" -> "test"),
+    "seqtk" -> Map("exe" -> "test"),
+    "sickle" -> Map("exe" -> "test"),
+    "bwa" -> Map("exe" -> "test"),
+    "star" -> Map("exe" -> "test"),
+    "bowtie" -> Map("exe" -> "test"),
+    "stampy" -> Map("exe" -> "test"),
+    "samtools" -> Map("exe" -> "test")
+  )
+}
\ No newline at end of file
-- 
GitLab