Skip to content

Commit

Permalink
Merge pull request #60 from ayamada/feature/add-tests-for-coverage-on…
Browse files Browse the repository at this point in the history
…ly-fixes-s

Add many tests / Remove unused codes about `slurp` fasta
  • Loading branch information
totakke committed Apr 20, 2017
2 parents e365309 + e566fee commit ff91c66
Show file tree
Hide file tree
Showing 21 changed files with 506 additions and 224 deletions.
9 changes: 1 addition & 8 deletions src/cljam/fasta/core.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(ns cljam.fasta.core
(:refer-clojure :exclude [read slurp])
(:refer-clojure :exclude [read])
(:require [clojure.java.io :as io]
[cljam.util :as util]
[cljam.fasta-index.core :as fasta-index]
Expand Down Expand Up @@ -55,13 +55,6 @@
[rdr]
(reader/reset rdr))

(defn slurp
"Opens a reader on a FASTA file and reads all its contents, returning
a sequence about the data."
[f]
(with-open [r (reader f)]
(doall (reader/read r))))

(defn sequential-read
[f]
(with-open [stream (util/compressor-input-stream f)]
Expand Down
2 changes: 1 addition & 1 deletion src/cljam/fasta/reader.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(ns cljam.fasta.reader
(:refer-clojure :exclude [read slurp])
(:refer-clojure :exclude [read])
(:require [clojure.string :as cstr]
[cljam.util :refer [graph?]]
[cljam.util.fasta :refer [header-line? parse-header-line]]
Expand Down
Binary file added test-resources/be-test-n.2bit
Binary file not shown.
Binary file added test-resources/be-test.2bit
Binary file not shown.
85 changes: 73 additions & 12 deletions test/cljam/t_bam.clj
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
(ns cljam.t-bam
(:require [clojure.test :refer :all]
[cljam.t-common :refer :all]
[clojure.java.io :refer [copy file]]
[clojure.java.io :refer [copy file delete-file]]
[cljam.bam :as bam]
[cljam.io :as io]
[cljam.sorter :as sorter]))
[cljam.bam-index.core :as bai-core]
[cljam.sorter :as sorter])
(:import [java.io IOException]))

(def temp-file (str temp-dir "/test.bam"))
(def temp-file-sorted (str temp-dir "/test.sorted.bam"))
(def not-found-file (str temp-dir "/not-found.bam"))
(def invalid-file-1 test-fa-file)
(def invalid-file-2 test-tabix-file)

(deftest slurp-bam
(is (= (slurp-bam-for-test test-bam-file) test-sam)))
Expand Down Expand Up @@ -40,23 +45,79 @@
;; (is (not-throw? (spit-bam-for-test temp-file
;; (slurp-bam-for-test large-bam-file))))))

(defn- shallow= [alns1 alns2]
(= (map #(select-keys % [:rname :pos]) alns1)
(map #(select-keys % [:rname :pos]) alns2)))

(defn- pointer= [alns1 alns2]
(= (map #(select-keys % [:rname :pos :flag]) alns1)
(map #(select-keys % [:rname :pos :flag]) alns2)))

(deftest bamreader
(with-before-after {:before (do (prepare-cache!)
(spit-bam-for-test temp-file test-sam))
:after (clean-cache!)}
(let [rdr (bam/reader temp-file :ignore-index true)]
(is (= (io/read-refs rdr) test-sam-refs)))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (= (io/read-alignments rdr) (:alignments test-sam))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (thrown? Exception (io/read-alignments rdr {:chr "ref2"}))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (= (io/read-alignments rdr {:depth :deep}) (:alignments test-sam))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (shallow= (io/read-alignments rdr {:depth :shallow})
(:alignments test-sam))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (pointer= (io/read-alignments rdr {:depth :pointer})
(:alignments test-sam))))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (= (data->clj (io/read-blocks rdr)) test-sam-data)))
(with-open [rdr (bam/reader temp-file :ignore-index false)]
(is (= (io/read-refs rdr) test-sam-refs))
(is (thrown? Exception (data->clj (io/read-blocks rdr {:chr "ref2"})))))))

(deftest-slow bamreader-medium-file
(with-before-after {:before (do (prepare-cache!)
(spit-bam-for-test temp-file test-sam))
:after (clean-cache!)})
(let [rdr (bam/reader medium-bam-file :ignore-index true)]
(is (= (io/read-refs rdr) medium-sam-refs))))
(deftest bamreader-with-index
(with-before-after {:before (prepare-cache!)
:after (clean-cache!)}
(with-open [rdr (bam/reader test-sorted-bam-file :ignore-index false)]
;; TODO: Does not works?
(is (= (io/read-alignments rdr {:chr "ref2"}) [])))
(with-open [rdr (bam/reader test-sorted-bam-file :ignore-index false)]
(is (= (data->clj (io/read-blocks rdr)) test-sorted-bam-data)))
(with-open [rdr (bam/reader test-sorted-bam-file :ignore-index false)]
;; TODO: Does not works?
(is (= (data->clj (io/read-blocks rdr {:chr "ref2"})) [])))))

(deftest bamreader-invalid-files
(with-before-after {:before (prepare-cache!)
:after (clean-cache!)}
(is (thrown? Exception (bam/reader invalid-file-1 :ignore-index true)))
(is (thrown? IOException (bam/reader invalid-file-2 :ignore-index true)))
(is (thrown? IOException (bam/reader not-found-file :ignore-index true)))))

(deftest bamreader-medium-file
(with-before-after {:before (prepare-cache!)
:after (clean-cache!)}
(with-open [rdr (bam/reader medium-bam-file :ignore-index true)]
(let [header (io/read-header rdr)
refs (io/read-refs rdr)
alns (io/read-alignments rdr)]
(is (= refs medium-sam-refs))
(with-open [w (bam/writer temp-file)]
(is (not-throw? (io/write-header w header)))
(is (not-throw? (io/write-refs w refs)))
(is (not-throw? (io/write-alignments w alns header)))
(same-file? medium-bam-file temp-file))))))

(deftest-slow-heavy bamreader-large-file
(with-before-after {:before (do (prepare-cache!)
(prepare-cavia!))
:after (clean-cache!)}
(let [rdr (bam/reader large-bam-file :ignore-index true)]
(is (= (io/read-refs rdr) large-sam-refs)))))
(with-open [rdr (bam/reader large-bam-file :ignore-index true)]
(is (= (io/read-refs rdr) large-sam-refs))
(is (not-throw? (io/read-alignments rdr))))))
10 changes: 5 additions & 5 deletions test/cljam/t_bam_index.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
;;; bin-index

(deftest bin-index-is-done-without-errors
(is (not-throw? (bai/bin-index test-bai-file 0))))
(is (not-throw? (bai/bin-index test-bai-file 0)))
(is (not-throw? (bai/bin-index test-bai-file 1))))
(deftest bin-index-throws-BoundsException-for-the-invalid-given-index
(is (thrown? Exception (bai/bin-index test-bai-file 2))))
(deftest bin-index-returns-vector
Expand Down Expand Up @@ -36,10 +37,9 @@
(deftest get-spans-returns-a-sequence-including-regions
(let [bai* (bai/bam-index test-bai-file)]
(is (seq? (bai/get-spans bai* 0 0 100)))
(is (every? #(and
(= 2 (count %))
(number? (first %))
(number? (second %)))
(is (every? #(and (= 2 (count %))
(number? (first %))
(number? (second %)))
(bai/get-spans bai* 0 0 100)))))
(deftest get-spans-returns-correct-regions
(let [bai* (bai/bam-index test-bai-file)]
Expand Down
41 changes: 24 additions & 17 deletions test/cljam/t_bam_indexer.clj
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@
(filter #(= "ref" (:rname %))
(:alignments test-sam-sorted-by-pos))))))

(deftest about-bam-indexer-invalid-files
(with-before-after {:before (prepare-cache!)
:after (clean-cache!)}
(is (thrown? Exception (bai/create-index "not-exists-file"
"not-exists-file.bai")))))

(deftest about-bam-indexer-for-incomplete-alignments
(let [f (str temp-dir "/test.incomplete.bam")
sorted-f (str temp-dir "/test.incomplete.sorted.bam")]
Expand All @@ -46,23 +52,24 @@
)))

(deftest about-bam-indexer-small-file
(with-before-after {:before (do (prepare-cache!)
(fs/copy small-bam-file temp-file-sorted))
:after (clean-cache!)}
(is (not-throw? (bai/create-index temp-file-sorted
(str temp-file-sorted ".bai"))))
(is (fs/exists? (str temp-file-sorted ".bai")))
(with-open [r (bam/reader temp-file-sorted)]
;; Random read with different number of spans.
(is (= (count (io/read-alignments r {:chr "chr1" :start 23000000 :end 25000000 :depth :deep}))
14858))
(is (= (count (io/read-alignments r {:chr "chr1" :start 23000000 :end 24500000 :depth :deep}))
11424))
(is (= (count (io/read-alignments r {:chr "chr1" :start 23000000 :end 24000000 :depth :deep}))
10010))
(is (= (count (io/read-alignments r {:chr "chr1" :start 23000000 :end 23500000 :depth :deep}))
3806))
(is (= (count (io/read-alignments r {:chr "*"})) 0)))))
(doseq [n-threads [1 4]]
(with-before-after {:before (do (prepare-cache!)
(fs/copy small-bam-file temp-file-sorted))
:after (clean-cache!)}
(is (not-throw? (bai/create-index temp-file-sorted
(str temp-file-sorted ".bai")
:n-threads n-threads)))
(is (fs/exists? (str temp-file-sorted ".bai")))
(with-open [r (bam/reader temp-file-sorted)]
;; Random read with different number of spans.
(are [?param ?counts] (= (count (io/read-alignments r ?param)) ?counts)
{:chr "chr1" :start 23000000 :end 25000000 :depth :shallow} 14858
{:chr "chr1" :start 23000000 :end 25000000 :depth :pointer} 14858
{:chr "chr1" :start 23000000 :end 25000000 :depth :deep} 14858
{:chr "chr1" :start 23000000 :end 24500000 :depth :deep} 11424
{:chr "chr1" :start 23000000 :end 24000000 :depth :deep} 10010
{:chr "chr1" :start 23000000 :end 23500000 :depth :deep} 3806
{:chr "*"} 0)))))

(deftest-slow about-bam-indexer-medium-file
(with-before-after {:before (do (prepare-cache!)
Expand Down
53 changes: 39 additions & 14 deletions test/cljam/t_bed.clj
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,25 @@
(.flush bw)
(.toString bao)))

(defn- raw-str->bed [^String s]
(with-open [bais (ByteArrayInputStream. (.getBytes s))
isr (InputStreamReader. bais)
br (BufferedReader. isr)]
(doall (bed/read-raw-fields br))))

(defn- bed->raw-str [xs]
(with-open [bao (ByteArrayOutputStream.)
osw (OutputStreamWriter. bao)
bw (BufferedWriter. osw)]
(bed/write-raw-fields bw xs)
(.flush bw)
(.toString bao)))

(deftest bed-file-reader-1
(is (= (raw-str->bed "1 0 100 N 0 + 0 0 255,0,0 2 10,90 0,10")
[{:chr "1" :start 0 :end 100 :name "N" :score 0 :strand :plus :thick-start 0 :thick-end 0
:item-rgb "255,0,0" :block-count 2 :block-sizes [10 90] :block-starts [0 10]}]))

(is (= (str->bed "1 0 100 N 0 + 0 0 255,0,0 2 10,90 0,10")
[{:chr "chr1" :start 1 :end 100 :name "N" :score 0 :strand :plus :thick-start 1 :thick-end 0
:item-rgb "255,0,0" :block-count 2 :block-sizes [10 90] :block-starts [0 10]}]))
Expand Down Expand Up @@ -124,27 +142,34 @@
(with-open [bam (bam/reader "test-resources/test.sorted.bam")]
(letfn [(ref-pos-end [m] {:rname (:rname m) :pos (:pos m) :end (sam-util/get-end m)})
(read-region [s] (->> (str->bed s) (mapcat #(cio/read-alignments bam %)) (map ref-pos-end)))]
(is (= (read-region "ref 0 6") []))
(is (= (read-region "ref 6 7") [{:rname "ref" :pos 7 :end 22}]))
(is (= (read-region "ref 7 8") [{:rname "ref" :pos 7 :end 22}]))
(is (= (read-region "ref 8 9")
[{:rname "ref" :pos 7 :end 22} {:rname "ref" :pos 9 :end 18} {:rname "ref" :pos 9 :end 14}]))
(is (= (read-region "ref 21 22")
[{:rname "ref" :pos 7 :end 22} {:rname "ref" :pos 16 :end 40}]))
(is (= (read-region "ref 22 23") [{:rname "ref" :pos 16 :end 40}]))
(is (= (read-region "ref 0 45")
[{:rname "ref" :pos 7 :end 22} {:rname "ref" :pos 9 :end 18} {:rname "ref" :pos 9 :end 14}
{:rname "ref" :pos 16 :end 40} {:rname "ref" :pos 29 :end 33} {:rname "ref" :pos 37 :end 45}])))))
(are [?region-str ?result] (= (read-region ?region-str) ?result)
"ref 0 6" []
"ref 6 7" [{:rname "ref" :pos 7 :end 22}]
"ref 7 8" [{:rname "ref" :pos 7 :end 22}]
"ref 8 9" [{:rname "ref" :pos 7 :end 22}
{:rname "ref" :pos 9 :end 18}
{:rname "ref" :pos 9 :end 14}]
"ref 21 22" [{:rname "ref" :pos 7 :end 22}
{:rname "ref" :pos 16 :end 40}]
"ref 22 23" [{:rname "ref" :pos 16 :end 40}]
"ref 0 45" [{:rname "ref" :pos 7 :end 22}
{:rname "ref" :pos 9 :end 18}
{:rname "ref" :pos 9 :end 14}
{:rname "ref" :pos 16 :end 40}
{:rname "ref" :pos 29 :end 33}
{:rname "ref" :pos 37 :end 45}]))))

(deftest bed-reader-and-fasta-reader
(with-open [fa (fa/reader "test-resources/medium.fa")]
(comment "chr1" "TAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCC...")
(letfn [(read-region [s] (->> (str->bed s) (map #(fa/read-sequence fa %))))]
(is (= (read-region "1 0 1") ["T"]))
(is (= (read-region "1 0 10") ["TAACCCTAAC"]))
(is (= (read-region "1 0 10\n1 10 20") ["TAACCCTAAC" "CCTAACCCTA"])))))
(are [?region-str ?result] (= (read-region ?region-str) ?result)
"1 0 1" ["T"]
"1 0 10" ["TAACCCTAAC"]
"1 0 10\n1 10 20" ["TAACCCTAAC" "CCTAACCCTA"]))))

(deftest bed-writer
(is (= (bed->raw-str (raw-str->bed "1 0 10")) "1 0 10"))
(is (= (bed->str (str->bed "1 0 1")) "chr1 0 1"))
(is (= (bed->str (str->bed "1 0 10")) "chr1 0 10"))
(is (= (bed->str (str->bed "1 0 1\n1 1 2")) "chr1 0 1\nchr1 1 2"))
Expand Down
Loading

0 comments on commit ff91c66

Please sign in to comment.