File: align_result_selector_test.cpp

package info (click to toggle)
seqan3 3.4.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,580 kB
  • sloc: cpp: 145,192; sh: 307; xml: 264; javascript: 95; makefile: 70; perl: 29; php: 15
file content (129 lines) | stat: -rw-r--r-- 5,547 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// SPDX-FileCopyrightText: 2006-2025 Knut Reinert & Freie Universität Berlin
// SPDX-FileCopyrightText: 2016-2025 Knut Reinert & MPI für molekulare Genetik
// SPDX-License-Identifier: BSD-3-Clause

#include <gtest/gtest.h>

#include <list>
#include <type_traits>
#include <utility>
#include <vector>

#include <seqan3/alignment/configuration/align_config_edit.hpp>
#include <seqan3/alignment/configuration/align_config_method.hpp>
#include <seqan3/alignment/configuration/align_config_output.hpp>
#include <seqan3/alignment/configuration/align_config_score_type.hpp>
#include <seqan3/alignment/pairwise/align_result_selector.hpp>
#include <seqan3/alphabet/gap/gapped.hpp>
#include <seqan3/alphabet/nucleotide/dna4.hpp>
#include <seqan3/utility/tuple/concept.hpp>
#include <seqan3/utility/views/type_reduce.hpp>

struct alignment_selector_test : public ::testing::Test
{
    using seq1_t = std::vector<seqan3::dna4>;
    using seq2_t = std::list<seqan3::dna4>;

    using gapped_seq1_t = seqan3::gap_decorator<seqan3::type_reduce_t<std::vector<seqan3::dna4> &>>;
    using gapped_seq2_t = std::vector<seqan3::gapped<seqan3::dna4>>;

    using alignment_t = std::tuple<gapped_seq1_t, gapped_seq2_t>;

    template <typename config_t>
    using alignment_result_value_t = typename seqan3::detail::align_result_selector<seq1_t, seq2_t, config_t>::type;

    template <typename config_t>
    using alignment_result_t = seqan3::alignment_result<alignment_result_value_t<config_t>>;

    static constexpr seqan3::configuration base_config = []()
    {
        return seqan3::align_cfg::method_global{} | seqan3::align_cfg::edit_scheme;
    }();
};

TEST_F(alignment_selector_test, align_result_selector_all)
{
    auto cfg = base_config | seqan3::align_cfg::output_score{} | seqan3::align_cfg::output_begin_position{}
             | seqan3::align_cfg::output_end_position{} | seqan3::align_cfg::output_alignment{}
             | seqan3::align_cfg::output_sequence1_id{} | seqan3::align_cfg::output_sequence2_id{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_id()), uint32_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_id()), uint32_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().score()), int32_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_end_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_end_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_begin_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_begin_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().alignment()), alignment_t const &>));
}

TEST_F(alignment_selector_test, align_result_selector_using_score_type)
{
    auto cfg = seqan3::align_cfg::method_global{} | // TODO: Change to base_config once using_score_type has been fixed.
               seqan3::align_cfg::edit_scheme | seqan3::align_cfg::output_score{}
             | seqan3::align_cfg::output_end_position{} | seqan3::align_cfg::score_type<double>{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().score()), double>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_end_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_end_position()), size_t>));
}

TEST_F(alignment_selector_test, output_score_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_score{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().score()), int32_t>));
}

TEST_F(alignment_selector_test, output_end_positions_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_end_position{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_end_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_end_position()), size_t>));
}

TEST_F(alignment_selector_test, output_begin_positions_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_begin_position{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_begin_position()), size_t>));
    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_begin_position()), size_t>));
}

TEST_F(alignment_selector_test, output_alignment_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_alignment{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().alignment()), alignment_t const &>));
}

TEST_F(alignment_selector_test, output_sequence1_id_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_sequence1_id{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence1_id()), uint32_t>));
}

TEST_F(alignment_selector_test, output_sequence2_id_only)
{
    auto cfg = base_config | seqan3::align_cfg::output_sequence2_id{};

    using result_t = alignment_result_t<decltype(cfg)>;

    EXPECT_TRUE((std::is_same_v<decltype(std::declval<result_t>().sequence2_id()), uint32_t>));
}