Skip to content

Commit fdea447

Browse files
committed
test(gcta/makebksparse): harden basename contract coverage
1 parent 99724b4 commit fdea447

3 files changed

Lines changed: 100 additions & 74 deletions

File tree

modules/nf-core/gcta/makebksparse/meta.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ input:
1919
description: |
2020
Groovy map containing dense GRM metadata
2121
e.g. `[ id:'plink_simulated' ]`
22+
`meta.id` is required and is the dense GRM basename contract used by `gcta --grm`.
23+
Input files must therefore be staged as `<meta.id>.grm.id`, `<meta.id>.grm.bin`, and `<meta.id>.grm.N.bin`.
2224
- grm_id:
2325
type: file
2426
description: Dense GRM sample identifier file
@@ -45,6 +47,7 @@ output:
4547
description: |
4648
Groovy map containing dense GRM metadata
4749
e.g. `[ id:'plink_simulated' ]`
50+
`meta.id` is preserved from the input dense GRM basename contract.
4851
- "*_sp.grm.id":
4952
type: file
5053
description: Sparse GRM sample identifier file

modules/nf-core/gcta/makebksparse/tests/main.nf.test

Lines changed: 62 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,62 +8,76 @@ nextflow_process {
88
tag "modules_nfcore"
99
tag "gcta"
1010
tag "gcta/makebksparse"
11-
tag "gcta/makegrmpart"
1211

13-
setup {
14-
run("GCTA_MAKEGRMPART", alias: "GCTA_MAKEGRMPART_DENSE") {
15-
script "../../makegrmpart/main.nf"
12+
test("homo_sapiens popgen - create sparse GRM") {
13+
config "./nextflow.config"
14+
15+
when {
1616
process {
1717
"""
18-
file('plink_simulated.mbfile').text = 'plink_simulated\\n'
19-
20-
input[0] = [
21-
[ id:'plink_simulated_dense', part_gcta_job:1, nparts_gcta:1 ],
22-
file('plink_simulated.mbfile'),
23-
[
24-
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bed', checkIfExists: true)
25-
],
26-
[
27-
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.bim', checkIfExists: true)
28-
],
29-
[
30-
file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/plink_simulated.fam', checkIfExists: true)
31-
]
32-
]
33-
input[1] = [[ id:'all_variants' ], []]
18+
file('contract_dense.grm.id').text = "fid1 iid1\\n"
19+
20+
grmBuffer = java.nio.ByteBuffer.allocate(4).order(java.nio.ByteOrder.LITTLE_ENDIAN)
21+
grmBuffer.putFloat(1.0f)
22+
file('contract_dense.grm.bin').bytes = grmBuffer.array()
23+
24+
grmNBuffer = java.nio.ByteBuffer.allocate(4).order(java.nio.ByteOrder.LITTLE_ENDIAN)
25+
grmNBuffer.putFloat(100.0f)
26+
file('contract_dense.grm.N.bin').bytes = grmNBuffer.array()
27+
28+
input[0] = Channel.value([
29+
[ id:'contract_dense' ],
30+
file('contract_dense.grm.id'),
31+
file('contract_dense.grm.bin'),
32+
file('contract_dense.grm.N.bin')
33+
])
34+
input[1] = Channel.value(0.05)
3435
"""
3536
}
3637
}
38+
39+
then {
40+
assertAll(
41+
{ assert process.success },
42+
{ assert process.out.sparse_grm_files.size() == 1 },
43+
{ assert process.out.sparse_grm_files.get(0).get(0).id == "contract_dense" },
44+
{ assert snapshot(process.out.sparse_grm_files).match("sparse_grm_files") },
45+
{ assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match("versions") }
46+
)
47+
}
3748
}
3849

39-
test("homo_sapiens popgen - create sparse GRM") {
50+
test("homo_sapiens popgen - fail when meta id does not match dense GRM basename") {
4051
config "./nextflow.config"
4152

4253
when {
4354
process {
4455
"""
45-
dense_grm = GCTA_MAKEGRMPART_DENSE.out.grm_files.map { meta, grm_id, grm_bin, grm_n_bin ->
46-
def prefix = meta.id + '.part_' + meta.nparts_gcta + '_' + meta.part_gcta_job
47-
[[ id:prefix ], grm_id, grm_bin, grm_n_bin]
48-
}
56+
file('contract_dense.grm.id').text = "fid1 iid1\\n"
4957

50-
input[0] = dense_grm
58+
grmBuffer = java.nio.ByteBuffer.allocate(4).order(java.nio.ByteOrder.LITTLE_ENDIAN)
59+
grmBuffer.putFloat(1.0f)
60+
file('contract_dense.grm.bin').bytes = grmBuffer.array()
61+
62+
grmNBuffer = java.nio.ByteBuffer.allocate(4).order(java.nio.ByteOrder.LITTLE_ENDIAN)
63+
grmNBuffer.putFloat(100.0f)
64+
file('contract_dense.grm.N.bin').bytes = grmNBuffer.array()
65+
66+
input[0] = Channel.value([
67+
[ id:'contract_dense_mismatch' ],
68+
file('contract_dense.grm.id'),
69+
file('contract_dense.grm.bin'),
70+
file('contract_dense.grm.N.bin')
71+
])
5172
input[1] = Channel.value(0.05)
5273
"""
5374
}
5475
}
5576

5677
then {
5778
assertAll(
58-
{ assert process.success },
59-
{ assert process.out.sparse_grm_files.size() == 1 },
60-
{ assert process.out.sparse_grm_files.get(0).get(0).id == "plink_simulated_dense.part_1_1" },
61-
{
62-
assert snapshot(
63-
process.out.sparse_grm_files,
64-
process.out.findAll { key, val -> key.startsWith('versions') }
65-
).match()
66-
}
79+
{ assert !process.success },
80+
{ assert process.exitStatus != 0 }
6781
)
6882
}
6983
}
@@ -75,12 +89,16 @@ nextflow_process {
7589
when {
7690
process {
7791
"""
78-
dense_grm = GCTA_MAKEGRMPART_DENSE.out.grm_files.map { meta, grm_id, grm_bin, grm_n_bin ->
79-
def prefix = meta.id + '.part_' + meta.nparts_gcta + '_' + meta.part_gcta_job
80-
[[ id:prefix ], grm_id, grm_bin, grm_n_bin]
81-
}
92+
file('stub_dense.grm.id').text = "fid1 iid1\\n"
93+
file('stub_dense.grm.bin').bytes = []
94+
file('stub_dense.grm.N.bin').bytes = []
8295

83-
input[0] = dense_grm
96+
input[0] = Channel.value([
97+
[ id:'stub_dense' ],
98+
file('stub_dense.grm.id'),
99+
file('stub_dense.grm.bin'),
100+
file('stub_dense.grm.N.bin')
101+
])
84102
input[1] = Channel.value(0.05)
85103
"""
86104
}
@@ -89,7 +107,10 @@ nextflow_process {
89107
then {
90108
assertAll(
91109
{ assert process.success },
92-
{ assert snapshot(process.out).match() }
110+
{ assert process.out.sparse_grm_files.size() == 1 },
111+
{ assert process.out.sparse_grm_files.get(0).get(0).id == "stub_dense" },
112+
{ assert snapshot(process.out.sparse_grm_files).match("stub_sparse_grm_files") },
113+
{ assert snapshot(process.out.findAll { key, val -> key.startsWith('versions') }).match("stub_versions") }
93114
)
94115
}
95116
}
Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
{
2-
"homo_sapiens popgen - create sparse GRM": {
2+
"stub_sparse_grm_files": {
33
"content": [
44
[
55
[
66
{
7-
"id": "plink_simulated_dense.part_1_1"
7+
"id": "stub_dense"
88
},
9-
"plink_simulated_dense.part_1_1_sp.grm.id:md5,4f9aa36c44a417ff6d7caa9841e66ad9",
10-
"plink_simulated_dense.part_1_1_sp.grm.sp:md5,1b78fe4b14c8690943d7687dd22ba85a"
9+
"stub_dense_sp.grm.id:md5,d41d8cd98f00b204e9800998ecf8427e",
10+
"stub_dense_sp.grm.sp:md5,d41d8cd98f00b204e9800998ecf8427e"
1111
]
12-
],
12+
]
13+
],
14+
"meta": {
15+
"nf-test": "0.9.3",
16+
"nextflow": "25.10.4"
17+
},
18+
"timestamp": "2026-03-21T00:30:48.770909526"
19+
},
20+
"versions": {
21+
"content": [
1322
{
1423
"versions_gcta": [
1524
[
@@ -24,36 +33,29 @@
2433
"nf-test": "0.9.3",
2534
"nextflow": "25.10.4"
2635
},
27-
"timestamp": "2026-03-13T15:36:15.829559344"
36+
"timestamp": "2026-03-21T00:30:38.045354436"
37+
},
38+
"sparse_grm_files": {
39+
"content": [
40+
[
41+
[
42+
{
43+
"id": "contract_dense"
44+
},
45+
"contract_dense_sp.grm.id:md5,c1fd3a827b108cf8b749e4fced7b7a52",
46+
"contract_dense_sp.grm.sp:md5,9c1256f576632d254861b63586e7a3da"
47+
]
48+
]
49+
],
50+
"meta": {
51+
"nf-test": "0.9.3",
52+
"nextflow": "25.10.4"
53+
},
54+
"timestamp": "2026-03-21T00:30:38.025448523"
2855
},
29-
"homo_sapiens popgen - create sparse GRM - stub": {
56+
"stub_versions": {
3057
"content": [
3158
{
32-
"0": [
33-
[
34-
{
35-
"id": "plink_simulated_dense.part_1_1"
36-
},
37-
"plink_simulated_dense.part_1_1_sp.grm.id:md5,d41d8cd98f00b204e9800998ecf8427e",
38-
"plink_simulated_dense.part_1_1_sp.grm.sp:md5,d41d8cd98f00b204e9800998ecf8427e"
39-
]
40-
],
41-
"1": [
42-
[
43-
"GCTA_MAKEBKSPARSE",
44-
"gcta",
45-
"1.94.1"
46-
]
47-
],
48-
"sparse_grm_files": [
49-
[
50-
{
51-
"id": "plink_simulated_dense.part_1_1"
52-
},
53-
"plink_simulated_dense.part_1_1_sp.grm.id:md5,d41d8cd98f00b204e9800998ecf8427e",
54-
"plink_simulated_dense.part_1_1_sp.grm.sp:md5,d41d8cd98f00b204e9800998ecf8427e"
55-
]
56-
],
5759
"versions_gcta": [
5860
[
5961
"GCTA_MAKEBKSPARSE",
@@ -67,6 +69,6 @@
6769
"nf-test": "0.9.3",
6870
"nextflow": "25.10.4"
6971
},
70-
"timestamp": "2026-03-13T15:36:22.049066879"
72+
"timestamp": "2026-03-21T00:30:48.775770627"
7173
}
7274
}

0 commit comments

Comments
 (0)