diff --git a/test/gtest/DnaTest.cpp b/test/gtest/DnaTest.cpp index ecb205a111244b815099b55ce392be572e70d58f..d3f0d671217da4cba973a0ae3cc6aabff0dcda69 100644 --- a/test/gtest/DnaTest.cpp +++ b/test/gtest/DnaTest.cpp @@ -35,9 +35,11 @@ #include <array> #include <memory> #include <string> +#include <sstream> #include "Dna_7.h" #include "macros.h" +#include "Strand.h" using namespace aevol; @@ -103,3 +105,72 @@ TEST_F(DnaTest, TestDna) { // Check genome size EXPECT_EQ(genome1.size(), dna1->length()); } + + +struct subseq_test_params { + Strand strand; + size_t first; + size_t count; + bool spans_oriC = false; +}; +std::ostream& operator<<(std::ostream& os, const subseq_test_params& o) { + os << "strand: " << o.strand << " ; first: " << o.first << " ; count: " << o.count << " ; spans_oriC: " + << (o.spans_oriC ? "true" : "false"); + return os; +} + +TEST_F(DnaTest, Test_subseq) { + std::array<subseq_test_params, 4> tests_leading = {{ + {Strand::LEADING, 0, 10, false}, + {Strand::LEADING, 10, 42, false}, + {Strand::LEADING, 100, 42, true}, + {Strand::LEADING, 100, genome1.size(), true} // Whole genome + }}; + + for (const auto& test : tests_leading) { + auto subseq = dna1->subseq(test.first, test.count, test.strand); + + // Check subseq size + EXPECT_EQ(test.count, subseq.size()); + + // Check subseq content + if (test.spans_oriC) { + auto expected_subseq = genome1.substr(test.first); + expected_subseq += genome1.substr(0, test.count - expected_subseq.size()); + EXPECT_EQ(expected_subseq, subseq) + << "\tNote: testing (" << test << ')'; + + } else { + EXPECT_EQ(genome1.substr(test.first, test.count), subseq) + << "\tNote: testing (" << test << ')'; + } + } + + std::array<subseq_test_params, 3> tests_lagging = {{ + {Strand::LAGGING, 15, 12, false}, + {Strand::LAGGING, genome1.size() - 1, genome1.size(), false}, // Whole genome + {Strand::LAGGING, 4, 11, true} + }}; + + for (const auto& test : tests_lagging) { + auto subseq = dna1->subseq(test.first, test.count, test.strand); + + // Construct expected result (naïve mode) + std::string expected_subseq(test.count, '0'); + if (test.spans_oriC) { + for (size_t i = 0; i < test.first + 1; ++i) { + expected_subseq[i] = genome1[test.first - i] == '0' ? '1' : '0'; + } + for (size_t i = 1; i < test.count - test.first; ++i) { + expected_subseq[test.first + i] = genome1[genome1.size() - i] == '0' ? '1' : '0'; + } + } else { + for (size_t i = 0 ; i < test.count ; ++i) { + expected_subseq[i] = genome1[test.first - i] == '0' ? '1' : '0'; + } + } + + EXPECT_EQ(expected_subseq, subseq) + << "\tNote: testing (" << test << ')'; + } +}