File: test_predicates.py

package info (click to toggle)
python-cutadapt 4.7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,992 kB
  • sloc: python: 9,695; ansic: 177; makefile: 159
file content (71 lines) | stat: -rw-r--r-- 2,393 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""
Tests write output (should it return True or False or write)
"""
import pytest
from dnaio import SequenceRecord

from cutadapt.predicates import TooManyN, TooHighAverageErrorRate
from cutadapt.steps import PairedEndFilter


@pytest.mark.parametrize(
    "seq,count,expected",
    [
        ("AAA", 0, False),
        ("AAA", 1, False),
        ("AAACCTTGGN", 1, False),
        ("AAACNNNCTTGGN", 0.5, False),
        ("NNNNNN", 1, True),
        ("ANAAAA", 1 / 6, False),
        ("ANAAAA", 0, True),
    ],
)
def test_too_many_n(seq, count, expected):
    predicate = TooManyN(count=count)
    _seq = SequenceRecord("read1", seq, qualities="#" * len(seq))
    assert predicate.test(_seq, []) == expected


@pytest.mark.parametrize(
    "seq1,seq2,count,expected",
    [
        ("AAA", "AAA", 0, False),
        ("AAAN", "AAA", 0, True),
        ("AAA", "AANA", 0, True),
        ("ANAA", "AANA", 1, False),
    ],
)
def test_too_many_n_paired(seq1, seq2, count, expected):
    predicate = TooManyN(count=count)
    filter_legacy = PairedEndFilter(
        predicate, predicate, None, pair_filter_mode="first"
    )
    filter_any = PairedEndFilter(predicate, predicate, None, pair_filter_mode="any")
    read1 = SequenceRecord("read1", seq1, qualities="#" * len(seq1))
    read2 = SequenceRecord("read1", seq2, qualities="#" * len(seq2))
    assert (filter_legacy(read1, read2, [], []) is None) == predicate.test(read1, [])
    # True entire pair if one of the reads fulfills criteria
    assert (filter_any(read1, read2, [], []) is None) == expected


def test_invalid_pair_filter_mode():
    with pytest.raises(ValueError) as e:
        PairedEndFilter(None, None, None, "invalidmode")
    assert "pair_filter_mode must be" in e.value.args[0]


@pytest.mark.parametrize(
    "quals,rate,expected",
    [
        # 3 * 0.1 is larger than 0.3 due to floating point rounding.
        (chr(43) * 3, 0.1, True),
        (chr(43) * 3 + chr(33), 0.1, True),  # 3 * 0.1 + 1
        (chr(43) * 3 + chr(33), 0.33, False),  # 3 * 0.1 + 1
        (chr(43) * 3 + chr(33), 0.32, True),  # 3 * 0.1 + 1
        (chr(126) * 9 + chr(33), 0.1, True),  # 9 * 10^-9.3 + 1
    ],
)
def test_too_high_average_error_rate(quals, rate, expected):
    predicate = TooHighAverageErrorRate(rate)
    _seq = SequenceRecord("read1", "A" * len(quals), qualities=quals)
    assert predicate.test(_seq, []) == expected