Skip to content

Commit cc199f8

Browse files
committed
Add unit tests
1 parent ccb6a0c commit cc199f8

File tree

3 files changed

+408
-0
lines changed

3 files changed

+408
-0
lines changed

tests/testthat/test_digestFastqs_primers.R

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,4 +228,151 @@ test_that("digestFastqs works as expected for primer experiments", {
228228
expect_equal(sum(res1$summaryTable[-idx, "nbrReads"]),
229229
res2$summaryTable[res2$summaryTable$mutantName ==
230230
paste0(names(leu2)[1], ".0.WT_r.0.WT"), "nbrReads"])
231+
232+
## ---------------------------------------------------------------------------
233+
## Swap forward and reverse reads, specify max nbr of mutated bases
234+
## ---------------------------------------------------------------------------
235+
Ldef <- list(
236+
fastqForward = fqt2, fastqReverse = fqt1,
237+
mergeForwardReverse = FALSE,
238+
minOverlap = 0, maxOverlap = 0, maxFracMismatchOverlap = 0, greedyOverlap = TRUE,
239+
revComplForward = FALSE, revComplReverse = FALSE,
240+
elementsForward = "SPSS", elementsReverse = "SPV",
241+
elementLengthsForward = c(-1, -1, 96, -1),
242+
elementLengthsReverse = c(-1, -1, -1),
243+
adapterForward = "",
244+
adapterReverse = "",
245+
primerForward = "GAAAAAGGAAGCTGGAGAGA",
246+
primerReverse = "GTCAGGTGGAGGCGGATCC",
247+
wildTypeForward = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCTT",
248+
wildTypeReverse = leu,
249+
constantForward = "",
250+
constantReverse = "",
251+
avePhredMinForward = 20.0, avePhredMinReverse = 20.0,
252+
variableNMaxForward = 0, variableNMaxReverse = 0,
253+
umiNMax = 0,
254+
nbrMutatedCodonsMaxForward = -1,
255+
nbrMutatedCodonsMaxReverse = -1,
256+
nbrMutatedBasesMaxForward = 0,
257+
nbrMutatedBasesMaxReverse = 0,
258+
forbiddenMutatedCodonsForward = "NNW",
259+
forbiddenMutatedCodonsReverse = "",
260+
useTreeWTmatch = FALSE,
261+
mutatedPhredMinForward = 0.0, mutatedPhredMinReverse = 0.0,
262+
mutNameDelimiter = ".",
263+
constantMaxDistForward = -1,
264+
constantMaxDistReverse = -1,
265+
umiCollapseMaxDist = 0,
266+
filteredReadsFastqForward = "",
267+
filteredReadsFastqReverse = "",
268+
maxNReads = -1, verbose = FALSE,
269+
nThreads = 1, chunkSize = 1000,
270+
maxReadLength = 1024
271+
)
272+
res1 <- do.call(digestFastqs, Ldef)
273+
leu2 <- leu
274+
names(leu2)[1:5] <- "ATF2"
275+
Ldef$wildTypeReverse <- leu2
276+
res2 <- do.call(digestFastqs, Ldef)
277+
278+
expect_identical(res1$filterSummary, res2$filterSummary)
279+
expect_identical(res1$errorStatistics, res2$errorStatistics)
280+
expect_equal(nrow(res1$summaryTable), nrow(res2$summaryTable) + 4)
281+
idx <- which(!res1$summaryTable$mutantName %in% paste0("f.0.WT_", names(leu)[1:5], ".0.WT"))
282+
expect_identical(res1$summaryTable[idx, ],
283+
res2$summaryTable[match(res1$summaryTable$mutantName[idx],
284+
res2$summaryTable$mutantName), ],
285+
ignore_attr = TRUE)
286+
expect_equal(sum(res1$summaryTable[-idx, "nbrReads"]),
287+
res2$summaryTable[res2$summaryTable$mutantName ==
288+
paste0("f.0.WT_", names(leu2)[1], ".0.WT"), "nbrReads"])
289+
290+
## ---------------------------------------------------------------------------
291+
## Too many WT hits, reverse reads
292+
## ---------------------------------------------------------------------------
293+
Ldef <- list(
294+
fastqForward = fqt1, fastqReverse = fqt2,
295+
mergeForwardReverse = FALSE,
296+
minOverlap = 0, maxOverlap = 0, maxFracMismatchOverlap = 0, greedyOverlap = TRUE,
297+
revComplForward = FALSE, revComplReverse = FALSE,
298+
elementsForward = "SPV", elementsReverse = "SPSS",
299+
elementLengthsForward = c(-1, -1, -1),
300+
elementLengthsReverse = c(-1, -1, 96, -1),
301+
adapterForward = "",
302+
adapterReverse = "",
303+
primerForward = "GTCAGGTGGAGGCGGATCC",
304+
primerReverse = "GAAAAAGGAAGCTGGAGAGA",
305+
wildTypeForward = leu,
306+
wildTypeReverse = c(A = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCTT", B = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCTTA"),
307+
constantForward = "",
308+
constantReverse = "",
309+
avePhredMinForward = 20.0, avePhredMinReverse = 20.0,
310+
variableNMaxForward = 0, variableNMaxReverse = 0,
311+
umiNMax = 0,
312+
nbrMutatedCodonsMaxForward = 0,
313+
nbrMutatedCodonsMaxReverse = 0,
314+
nbrMutatedBasesMaxForward = -1,
315+
nbrMutatedBasesMaxReverse = -1,
316+
forbiddenMutatedCodonsForward = "",
317+
forbiddenMutatedCodonsReverse = "NNW",
318+
useTreeWTmatch = FALSE,
319+
mutatedPhredMinForward = 0.0, mutatedPhredMinReverse = 0.0,
320+
mutNameDelimiter = ".",
321+
constantMaxDistForward = -1,
322+
constantMaxDistReverse = -1,
323+
umiCollapseMaxDist = 0,
324+
filteredReadsFastqForward = "",
325+
filteredReadsFastqReverse = "",
326+
maxNReads = -1, verbose = FALSE,
327+
nThreads = 1, chunkSize = 1000,
328+
maxReadLength = 1024
329+
)
330+
res1 <- do.call(digestFastqs, Ldef)
331+
332+
expect_identical(res1$filterSummary$f8_nbrTooManyBestWTHits, 809L)
333+
334+
## ---------------------------------------------------------------------------
335+
## Too short WT hit, reverse reads
336+
## ---------------------------------------------------------------------------
337+
Ldef <- list(
338+
fastqForward = fqt1, fastqReverse = fqt2,
339+
mergeForwardReverse = FALSE,
340+
minOverlap = 0, maxOverlap = 0, maxFracMismatchOverlap = 0, greedyOverlap = TRUE,
341+
revComplForward = FALSE, revComplReverse = FALSE,
342+
elementsForward = "SPV", elementsReverse = "SPVS",
343+
elementLengthsForward = c(-1, -1, -1),
344+
elementLengthsReverse = c(-1, -1, 96, -1),
345+
adapterForward = "",
346+
adapterReverse = "",
347+
primerForward = "GTCAGGTGGAGGCGGATCC",
348+
primerReverse = "GAAAAAGGAAGCTGGAGAGA",
349+
wildTypeForward = leu,
350+
wildTypeReverse = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCT",
351+
constantForward = "",
352+
constantReverse = "",
353+
avePhredMinForward = 20.0, avePhredMinReverse = 20.0,
354+
variableNMaxForward = 0, variableNMaxReverse = 0,
355+
umiNMax = 0,
356+
nbrMutatedCodonsMaxForward = 0,
357+
nbrMutatedCodonsMaxReverse = 1,
358+
nbrMutatedBasesMaxForward = -1,
359+
nbrMutatedBasesMaxReverse = -1,
360+
forbiddenMutatedCodonsForward = "",
361+
forbiddenMutatedCodonsReverse = "NNW",
362+
useTreeWTmatch = FALSE,
363+
mutatedPhredMinForward = 0.0, mutatedPhredMinReverse = 0.0,
364+
mutNameDelimiter = ".",
365+
constantMaxDistForward = -1,
366+
constantMaxDistReverse = -1,
367+
umiCollapseMaxDist = 0,
368+
filteredReadsFastqForward = "",
369+
filteredReadsFastqReverse = "",
370+
maxNReads = -1, verbose = FALSE,
371+
nThreads = 1, chunkSize = 1000,
372+
maxReadLength = 1024
373+
)
374+
res1 <- do.call(digestFastqs, Ldef)
375+
376+
expect_identical(res1$filterSummary$f3_nbrReadWrongLength, 439L)
377+
expect_identical(res1$filterSummary$nbrRetained, 0L)
231378
})

tests/testthat/test_digestFastqs_trans.R

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,3 +1261,153 @@ test_that("digestFastqs works as expected for trans experiments, if collapsing t
12611261
expect_equal(res$summaryTable$varLengths, "80,16_16,80")
12621262
})
12631263

1264+
test_that("reads are filtered out if there are too many constant hits", {
1265+
fqt1 <- system.file("extdata/transInput_1.fastq.gz", package = "mutscan")
1266+
fqt2 <- system.file("extdata/transInput_2.fastq.gz", package = "mutscan")
1267+
## default arguments
1268+
Ldef <- list(
1269+
fastqForward = fqt1, fastqReverse = fqt2,
1270+
mergeForwardReverse = FALSE,
1271+
minOverlap = 0, maxOverlap = 0, maxFracMismatchOverlap = 0, greedyOverlap = TRUE,
1272+
revComplForward = FALSE, revComplReverse = FALSE,
1273+
elementsForward = "SUCVV", elementsReverse = "SUCVV",
1274+
elementLengthsForward = c(1, 10, 18, 80, 16),
1275+
elementLengthsReverse = c(1, 8, 20, 16, 80),
1276+
adapterForward = "GGAAGAGCACACGTC",
1277+
adapterReverse = "GGAAGAGCGTCGTGT",
1278+
primerForward = "",
1279+
primerReverse = "",
1280+
wildTypeForward = "ACTGATACACTCCAAGCGGAGACAGACCAACTAGAAGATGAGAAGTCTGCTTTGCAGACCGAGATTGCCAACCTGCTGAAGGAGAAGGAAAAACTA",
1281+
wildTypeReverse = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCTT",
1282+
constantForward = "AACCGGAGGAGGGAGCTG",
1283+
constantReverse = "GAAAAAGGAAGCTGGAGAGA",
1284+
avePhredMinForward = 20.0, avePhredMinReverse = 20.0,
1285+
variableNMaxForward = 0, variableNMaxReverse = 0,
1286+
umiNMax = 0,
1287+
nbrMutatedCodonsMaxForward = 1,
1288+
nbrMutatedCodonsMaxReverse = 1,
1289+
nbrMutatedBasesMaxForward = -1,
1290+
nbrMutatedBasesMaxReverse = -1,
1291+
forbiddenMutatedCodonsForward = "NNW",
1292+
forbiddenMutatedCodonsReverse = "NNW",
1293+
useTreeWTmatch = FALSE,
1294+
collapseToWTForward = TRUE,
1295+
collapseToWTReverse = TRUE,
1296+
mutatedPhredMinForward = 0.0, mutatedPhredMinReverse = 0.0,
1297+
mutNameDelimiter = ".",
1298+
constantMaxDistForward = -1,
1299+
constantMaxDistReverse = -1,
1300+
umiCollapseMaxDist = 0,
1301+
filteredReadsFastqForward = "",
1302+
filteredReadsFastqReverse = "",
1303+
maxNReads = -1, verbose = FALSE,
1304+
nThreads = 1, chunkSize = 1000,
1305+
maxReadLength = 1024
1306+
)
1307+
1308+
## Forward
1309+
Ldef1 <- Ldef; Ldef1$constantForward <- c(c1 = "AACCGGAGGAGGGAGCTA", c2 = "AACCGGAGGAGGGAGCTC")
1310+
res1 <- do.call(digestFastqs, Ldef1)
1311+
1312+
expect_equal(res1$filterSummary$nbrTotal, 1000L)
1313+
expect_equal(res1$filterSummary$f1_nbrAdapter, 314L)
1314+
expect_equal(res1$filterSummary$f2_nbrNoPrimer, 0L)
1315+
expect_equal(res1$filterSummary$f3_nbrReadWrongLength, 0L)
1316+
expect_equal(res1$filterSummary$f4_nbrNoValidOverlap, 0L)
1317+
expect_equal(res1$filterSummary$f5_nbrAvgVarQualTooLow, 7L)
1318+
expect_equal(res1$filterSummary$f6_nbrTooManyNinVar, 0L)
1319+
expect_equal(res1$filterSummary$f7_nbrTooManyNinUMI, 0L)
1320+
expect_equal(res1$filterSummary$f8_nbrTooManyBestWTHits, 0L)
1321+
expect_equal(res1$filterSummary$f9_nbrMutQualTooLow, 0L)
1322+
expect_equal(res1$filterSummary$f10a_nbrTooManyMutCodons, 192L + 95L + 68L + 37L)
1323+
expect_equal(res1$filterSummary$f10b_nbrTooManyMutBases, 0L)
1324+
expect_equal(res1$filterSummary$f11_nbrForbiddenCodons, 6L + 2L)
1325+
expect_equal(res1$filterSummary$f12_nbrTooManyMutConstant, 0L)
1326+
expect_equal(res1$filterSummary$f13_nbrTooManyBestConstantHits, 279L)
1327+
expect_equal(res1$filterSummary$nbrRetained, 0L)
1328+
1329+
## Reverse
1330+
Ldef1 <- Ldef; Ldef1$constantReverse <- c(c1 = "GAAAAAGGAAGCTGGAGAGG", c2 = "GAAAAAGGAAGCTGGAGAGT")
1331+
res1 <- do.call(digestFastqs, Ldef1)
1332+
1333+
expect_equal(res1$filterSummary$nbrTotal, 1000L)
1334+
expect_equal(res1$filterSummary$f1_nbrAdapter, 314L)
1335+
expect_equal(res1$filterSummary$f2_nbrNoPrimer, 0L)
1336+
expect_equal(res1$filterSummary$f3_nbrReadWrongLength, 0L)
1337+
expect_equal(res1$filterSummary$f4_nbrNoValidOverlap, 0L)
1338+
expect_equal(res1$filterSummary$f5_nbrAvgVarQualTooLow, 7L)
1339+
expect_equal(res1$filterSummary$f6_nbrTooManyNinVar, 0L)
1340+
expect_equal(res1$filterSummary$f7_nbrTooManyNinUMI, 0L)
1341+
expect_equal(res1$filterSummary$f8_nbrTooManyBestWTHits, 0L)
1342+
expect_equal(res1$filterSummary$f9_nbrMutQualTooLow, 0L)
1343+
expect_equal(res1$filterSummary$f10a_nbrTooManyMutCodons, 192L + 95L + 68L + 37L)
1344+
expect_equal(res1$filterSummary$f10b_nbrTooManyMutBases, 0L)
1345+
expect_equal(res1$filterSummary$f11_nbrForbiddenCodons, 6L + 2L)
1346+
expect_equal(res1$filterSummary$f12_nbrTooManyMutConstant, 0L)
1347+
expect_equal(res1$filterSummary$f13_nbrTooManyBestConstantHits, 279L)
1348+
expect_equal(res1$filterSummary$nbrRetained, 0L)
1349+
})
1350+
1351+
test_that("digestFastqs runs with revComplForward = TRUE", {
1352+
fqt1 <- system.file("extdata/transInput_1.fastq.gz", package = "mutscan")
1353+
fqt2 <- system.file("extdata/transInput_2.fastq.gz", package = "mutscan")
1354+
## default arguments
1355+
Ldef <- list(
1356+
fastqForward = fqt1, fastqReverse = fqt2,
1357+
mergeForwardReverse = FALSE,
1358+
minOverlap = 0, maxOverlap = 0, maxFracMismatchOverlap = 0, greedyOverlap = TRUE,
1359+
revComplForward = TRUE, revComplReverse = FALSE,
1360+
elementsForward = "SUCVV", elementsReverse = "SUCVV",
1361+
elementLengthsForward = c(1, 10, 18, 80, 16),
1362+
elementLengthsReverse = c(1, 8, 20, 16, 80),
1363+
adapterForward = "GGAAGAGCACACGTC",
1364+
adapterReverse = "GGAAGAGCGTCGTGT",
1365+
primerForward = "",
1366+
primerReverse = "",
1367+
wildTypeForward = "TAGTTTTTCCTTCTCCTTCAGCAGGTTGGCAATCTCGGTCTGCAAAGCAGACTTCTCATCTTCTAGTTGGTCTGTCTCCGCTTGGAGTGTATCAGT",
1368+
wildTypeReverse = "ATCGCCCGGCTGGAGGAAAAAGTGAAAACCTTGAAAGCTCAGAACTCGGAGCTGGCGTCCACGGCCAACATGCTCAGGGAACAGGTGGCACAGCTT",
1369+
constantForward = "CAGCTCCCTCCTCCGGTT",
1370+
constantReverse = "GAAAAAGGAAGCTGGAGAGA",
1371+
avePhredMinForward = 20.0, avePhredMinReverse = 20.0,
1372+
variableNMaxForward = 0, variableNMaxReverse = 0,
1373+
umiNMax = 0,
1374+
nbrMutatedCodonsMaxForward = 1,
1375+
nbrMutatedCodonsMaxReverse = 1,
1376+
nbrMutatedBasesMaxForward = -1,
1377+
nbrMutatedBasesMaxReverse = -1,
1378+
forbiddenMutatedCodonsForward = "",
1379+
forbiddenMutatedCodonsReverse = "",
1380+
useTreeWTmatch = FALSE,
1381+
collapseToWTForward = TRUE,
1382+
collapseToWTReverse = TRUE,
1383+
mutatedPhredMinForward = 0.0, mutatedPhredMinReverse = 0.0,
1384+
mutNameDelimiter = ".",
1385+
constantMaxDistForward = -1,
1386+
constantMaxDistReverse = -1,
1387+
umiCollapseMaxDist = 0,
1388+
filteredReadsFastqForward = "",
1389+
filteredReadsFastqReverse = "",
1390+
maxNReads = -1, verbose = FALSE,
1391+
nThreads = 1, chunkSize = 1000,
1392+
maxReadLength = 1024
1393+
)
1394+
1395+
res <- do.call(digestFastqs, Ldef)
1396+
1397+
expect_equal(res$filterSummary$nbrTotal, 1000L)
1398+
expect_equal(res$filterSummary$f1_nbrAdapter, 314L)
1399+
expect_equal(res$filterSummary$f2_nbrNoPrimer, 0L)
1400+
expect_equal(res$filterSummary$f3_nbrReadWrongLength, 0L)
1401+
expect_equal(res$filterSummary$f4_nbrNoValidOverlap, 0L)
1402+
expect_equal(res$filterSummary$f5_nbrAvgVarQualTooLow, 7L)
1403+
expect_equal(res$filterSummary$f6_nbrTooManyNinVar, 0L)
1404+
expect_equal(res$filterSummary$f7_nbrTooManyNinUMI, 0L)
1405+
expect_equal(res$filterSummary$f8_nbrTooManyBestWTHits, 0L)
1406+
expect_equal(res$filterSummary$f9_nbrMutQualTooLow, 0L)
1407+
expect_equal(res$filterSummary$f10a_nbrTooManyMutCodons, 394L)
1408+
expect_equal(res$filterSummary$f10b_nbrTooManyMutBases, 0L)
1409+
expect_equal(res$filterSummary$f11_nbrForbiddenCodons, 0L)
1410+
expect_equal(res$filterSummary$f12_nbrTooManyMutConstant, 0L)
1411+
expect_equal(res$filterSummary$f13_nbrTooManyBestConstantHits, 0L)
1412+
expect_equal(res$filterSummary$nbrRetained, 285L)
1413+
})

0 commit comments

Comments
 (0)