Skip to content

Commit a472f51

Browse files
SteffengreinerSteffengreiner
authored andcommitted
Provide tests and data structure for bam and pod5 registration
1 parent d43dd4a commit a472f51

File tree

6 files changed

+345
-108
lines changed

6 files changed

+345
-108
lines changed

src/test/groovy/life/qbic/datamodel/datasets/datastructure/OxfordNanoporeExperimentSpec.groovy

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ class OxfordNanoporeExperimentSpec extends Specification {
6262
Map minimalDataStructurePooled
6363

6464
@Shared
65-
Map minimalDoradoDataStructure
65+
Map minimalPod5DoradoDataStructure
66+
67+
@Shared
68+
Map minimalBamDoradoDataStructure
6669

6770
@Shared
6871
Map fullDoradoDataStructure
@@ -96,8 +99,12 @@ class OxfordNanoporeExperimentSpec extends Specification {
9699
stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(folder+"valid-minimal-structure-pooled.json")
97100
minimalDataStructurePooled = (Map) new JsonSlurper().parse(stream)
98101
// read in minimal required example with dorado based basecalling
99-
stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(folder+"valid-minimal-structure-dorado-basecaller.json")
100-
minimalDoradoDataStructure = (Map) new JsonSlurper().parse(stream)
102+
stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(folder+"valid-minimal-structure-pod5-dorado-basecaller.json")
103+
minimalPod5DoradoDataStructure = (Map) new JsonSlurper().parse(stream)
104+
stream.close()
105+
// read in minimal required example with dorado based basecalling
106+
stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(folder+"valid-minimal-structure-bam-dorado-basecaller.json")
107+
minimalBamDoradoDataStructure = (Map) new JsonSlurper().parse(stream)
101108
stream.close()
102109
// read in minimal required example with dorado based basecalling
103110
stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(folder+"valid-example-dorado-basecaller.json")
@@ -210,9 +217,9 @@ class OxfordNanoporeExperimentSpec extends Specification {
210217
assert measurements[0].asicTemp == "32.631687"
211218
}
212219

213-
def "Create sample Oxford Nanopore experiment successfully for dorado basecaller generated minimal structure"() {
220+
def "Create sample Oxford Nanopore experiment successfully for pod5 generated minimal structure"() {
214221
given:
215-
final def example = minimalDoradoDataStructure
222+
final def example = minimalPod5DoradoDataStructure
216223

217224
when:
218225
final def experiment = OxfordNanoporeExperiment.create(example)
@@ -222,8 +229,24 @@ class OxfordNanoporeExperimentSpec extends Specification {
222229
assert experiment.sampleCode == "QABCD001AB"
223230
assert measurements.size() == 1
224231
assert measurements[0].asicTemp == "32.631687"
225-
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("pod5skip")
226-
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("fast5skip")
232+
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("pod5pass")
233+
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("pod5fail")
234+
}
235+
236+
def "Create sample Oxford Nanopore experiment successfully for bam generated minimal structure"() {
237+
given:
238+
final def example = minimalBamDoradoDataStructure
239+
240+
when:
241+
final def experiment = OxfordNanoporeExperiment.create(example)
242+
final def measurements = experiment.getMeasurements()
243+
244+
then:
245+
assert experiment.sampleCode == "QABCD001AB"
246+
assert measurements.size() == 1
247+
assert measurements[0].asicTemp == "32.631687"
248+
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("bampass")
249+
assert measurements[0].getRawDataPerSample(experiment).get("QABCD001AB").containsKey("bamfail")
227250
}
228251

229252
def "Create sample Oxford Nanopore experiment successfully for dorado basecaller generated full structure"() {

src/test/groovy/life/qbic/datamodel/datasets/datastructure/OxfordNanoporeMeasurementSpec.groovy

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package life.qbic.datamodel.datasets.datastructure
22

33
import life.qbic.datamodel.datasets.ExperimentFolder
44
import life.qbic.datamodel.datasets.OxfordNanoporeMeasurement
5+
import life.qbic.datamodel.datasets.datastructure.files.nanopore.BamFile
56
import life.qbic.datamodel.datasets.datastructure.files.nanopore.Fast5File
67
import life.qbic.datamodel.datasets.datastructure.files.nanopore.FastQFile
8+
import life.qbic.datamodel.datasets.datastructure.files.nanopore.Pod5File
79
import life.qbic.datamodel.datasets.datastructure.folders.DataFolder
810
import life.qbic.datamodel.datasets.datastructure.folders.nanopore.*
911
import spock.lang.Shared
@@ -38,9 +40,13 @@ class OxfordNanoporeMeasurementSpec extends Specification {
3840
@Shared
3941
UnclassifiedFastQFolder unclassifiedFastQFolder
4042
@Shared
41-
Pod5SkipFolder pod5SkipFolder
43+
Pod5PassFolder pod5PassedFolder
4244
@Shared
43-
Fast5SkipFolder fast5SkipFolder
45+
Pod5FailFolder pod5FailedFolder
46+
@Shared
47+
BamPassFolder bamPassedFolder
48+
@Shared
49+
BamFailFolder bamFailedFolder
4450

4551
@Shared
4652
Map metaData
@@ -62,6 +68,8 @@ class OxfordNanoporeMeasurementSpec extends Specification {
6268
]
6369
def fast5File = Fast5File.create("test.fast5", "root/test.fast5")
6470
def fastQFile = FastQFile.create("test.fastq", "root/test.fastq")
71+
def pod5File = Pod5File.create("test.pod5", "root/test.pod5")
72+
def bamFile = BamFile.create("test.bam", "root/test.bam")
6573
fast5FailedFolder = Fast5FailFolder.create("fast5_fail","root/fast5_fail", [fast5File])
6674
fast5PassedFolder = Fast5PassFolder.create("fast5_pass","root/fast5_pass", [fast5File])
6775
fastQFailedFolder = FastQFailFolder.create("fastq_fail", "root/fastq_fail", [fastQFile])
@@ -74,6 +82,10 @@ class OxfordNanoporeMeasurementSpec extends Specification {
7482
// Content for the pooled samples including unclassified folders
7583
unclassifiedFast5Folder = UnclassifiedFast5Folder.create("unclassified", "fast5_fail/unclassified", [fast5File])
7684
unclassifiedFastQFolder = UnclassifiedFastQFolder.create("unclassified", "fastq_pass/unclassified", [fastQFile])
85+
bamFailedFolder = BamFailFolder.create("bam_fail", "root/bam_fail", [bamFile])
86+
bamPassedFolder = BamPassFolder.create("bam_pass","root/bam_pass", [bamFile])
87+
pod5FailedFolder = Pod5FailFolder.create("pod5_fail", "root/pod5_fail", [pod5File])
88+
pod5PassedFolder = Pod5PassFolder.create("pod5_pass","root/pod5_pass", [pod5File])
7789
}
7890

7991
def "create simple measurement successfully"() {
@@ -235,16 +247,33 @@ class OxfordNanoporeMeasurementSpec extends Specification {
235247

236248
}
237249

238-
def "If both pod5 skip and fast5 skip folder are empty, an IllegalStateException shall be thrown"() {
250+
def "If both pod5 pass and pod5 fail folder are empty, an IllegalStateException shall be thrown"() {
239251
given:
240-
def emptyPod5SkipFolder = Pod5SkipFolder.create("pod5_skip","root/pod5_skip", [])
241-
def emptyFast5SkipFolder = Fast5SkipFolder.create("fast5_skip","root/fast5_skip", [])
252+
def emptyPod5PassFolder = Pod5PassFolder.create("pod5_pass","root/pod5_pass", [])
253+
def emptyPod5FailFolder = Pod5FailFolder.create("pod5_fail","root/pod5_fail", [])
242254

243255
when:
244256
OxfordNanoporeMeasurement.create(
245257
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
246258
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
247-
[emptyPod5SkipFolder, emptyFast5SkipFolder],
259+
[emptyPod5PassFolder, emptyPod5FailFolder],
260+
metaData)
261+
262+
then:
263+
thrown(IllegalStateException)
264+
265+
}
266+
267+
def "If both bam pass and bam fail folder are empty, an IllegalStateException shall be thrown"() {
268+
given:
269+
def emptyBamPassFolder = BamPassFolder.create("bam_pass","root/bam_pass", [])
270+
def emptyBamFailFolder = BamFailFolder.create("bam_fail","root/bam_fail", [])
271+
272+
when:
273+
OxfordNanoporeMeasurement.create(
274+
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
275+
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
276+
[emptyBamPassFolder, emptyBamFailFolder],
248277
metaData)
249278

250279
then:
@@ -282,6 +311,46 @@ class OxfordNanoporeMeasurementSpec extends Specification {
282311
noExceptionThrown()
283312
}
284313

314+
def "If either bam pass or bam folder is empty, no IllegalStateException shall be thrown"() {
315+
given:
316+
def emptyBamFailFolder = BamFailFolder.create("bam_fail","root/bam_fail", [])
317+
def emptyBamPassFolder = BamPassFolder.create("bam_pass","root/bam_pass", [])
318+
when:
319+
OxfordNanoporeMeasurement.create(
320+
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
321+
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
322+
[bamPassedFolder, emptyBamFailFolder],
323+
metaData)
324+
OxfordNanoporeMeasurement.create(
325+
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
326+
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
327+
[emptyBamPassFolder, bamFailedFolder],
328+
metaData)
329+
then:
330+
noExceptionThrown()
331+
}
332+
333+
def "If either pod5 pass or pod5 folder is empty, no IllegalStateException shall be thrown"() {
334+
given:
335+
def emptyPod5FailedFolder = Pod5FailFolder.create("pod5_fail","root/pod5_fail", [])
336+
def emptyPod5PassedFolder = Pod5PassFolder.create("pod5_pass","root/pod5_pass", [])
337+
when:
338+
OxfordNanoporeMeasurement.create(
339+
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
340+
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
341+
[pod5PassedFolder, emptyPod5FailedFolder],
342+
metaData)
343+
344+
OxfordNanoporeMeasurement.create(
345+
"20200219_1107_1-E3-H3_PAE26974_454b8dc6",
346+
"path/20200219_1107_1-E3-H3_PAE26974_454b8dc6",
347+
[emptyPod5PassedFolder, pod5FailedFolder],
348+
metaData)
349+
then:
350+
noExceptionThrown()
351+
}
352+
353+
285354
def "missing adapter metadata shall return an empty String and not be null"() {
286355
given:
287356
def metaData = [
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package life.qbic.datamodel.datasets.datastructure.files.nanopore
2+
3+
import spock.lang.Specification
4+
5+
/**
6+
* <add class description here>
7+
*
8+
*/
9+
class BamFileSpec extends Specification {
10+
11+
def "shall create a BamFile instance"() {
12+
given:
13+
final name = "test_file.bam"
14+
final relativePath = "root/test_file.bam"
15+
16+
when:
17+
def dataObject = BamFile.create(name, relativePath)
18+
19+
then:
20+
assert dataObject instanceof BamFile
21+
assert dataObject.relativePath == relativePath
22+
assert dataObject.name == name
23+
}
24+
25+
def "name not matching schema shall throw IllegalArgumentException"() {
26+
given:
27+
final name = "test_file.bum"
28+
final relativePath = "root/test_file.bum"
29+
30+
when:
31+
def dataObject = BamFile.create(name, relativePath)
32+
33+
then:
34+
thrown(IllegalArgumentException)
35+
}
36+
37+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package life.qbic.datamodel.datasets.datastructure.files.nanopore
2+
3+
import spock.lang.Specification
4+
5+
/**
6+
* <add class description here>
7+
*
8+
*/
9+
class Pod5FileSpec extends Specification {
10+
11+
def "shall create a Pod5 instance"() {
12+
given:
13+
final name = "test_file.pod5"
14+
final relativePath = "root/test_file.pod5"
15+
16+
when:
17+
def dataObject = Pod5File.create(name, relativePath)
18+
19+
then:
20+
assert dataObject instanceof Pod5File
21+
assert dataObject.relativePath == relativePath
22+
assert dataObject.name == name
23+
}
24+
25+
def "name not matching schema shall throw IllegalArgumentException"() {
26+
given:
27+
final name = "test_file.pad4"
28+
final relativePath = "root/test_file.pad4"
29+
30+
when:
31+
def dataObject = Pod5File.create(name, relativePath)
32+
33+
then:
34+
thrown(IllegalArgumentException)
35+
}
36+
37+
}

0 commit comments

Comments
 (0)