From 03a748430f0454d1433dfab825cca464b1f15f8b Mon Sep 17 00:00:00 2001 From: LTLA Date: Sat, 12 Aug 2023 18:15:36 -0700 Subject: [PATCH] Restored all tests. --- include/kaori/handlers/DualBarcodes.hpp | 1 + .../handlers/DualBarcodesWithDiagnostics.hpp | 6 +- tests/CMakeLists.txt | 4 +- tests/src/handlers/DualBarcodes.cpp | 239 ++++++++++++++---- .../handlers/DualBarcodesWithDiagnostics.cpp | 13 +- 5 files changed, 200 insertions(+), 63 deletions(-) diff --git a/include/kaori/handlers/DualBarcodes.hpp b/include/kaori/handlers/DualBarcodes.hpp index 9cf34a5..c8ec34e 100644 --- a/include/kaori/handlers/DualBarcodes.hpp +++ b/include/kaori/handlers/DualBarcodes.hpp @@ -25,6 +25,7 @@ namespace kaori { */ template class DualBarcodes { +public: /** * @brief Optional parameters for `SingleBarcodeSingleEnd`. */ diff --git a/include/kaori/handlers/DualBarcodesWithDiagnostics.hpp b/include/kaori/handlers/DualBarcodesWithDiagnostics.hpp index c1de01a..d126d20 100644 --- a/include/kaori/handlers/DualBarcodesWithDiagnostics.hpp +++ b/include/kaori/handlers/DualBarcodesWithDiagnostics.hpp @@ -44,7 +44,7 @@ class DualBarcodesWithDiagnostics { DualBarcodesWithDiagnostics( const char* template_seq1, size_t template_length1, const BarcodePool& barcode_pool1, const char* template_seq2, size_t template_length2, const BarcodePool& barcode_pool2, - const DualBarcodes::Options& options + const typename DualBarcodes::Options& options ) : dual_handler(template_seq1, template_length1, barcode_pool1, template_seq2, template_length2, barcode_pool2, options), @@ -56,7 +56,7 @@ class DualBarcodesWithDiagnostics { template_length2, barcode_pool2, [&]{ - CombinatorialBarcodesPairedEnd::Options combopt; + typename CombinatorialBarcodesPairedEnd::Options combopt; combopt.use_first = options.use_first; combopt.max_mismatches1 = options.max_mismatches1; @@ -65,7 +65,7 @@ class DualBarcodesWithDiagnostics { combopt.max_mismatches2 = options.max_mismatches2; combopt.search_forward2 = !options.search_reverse2; - combopt.search_forward2 = options.search_reverse2; + combopt.search_reverse2 = options.search_reverse2; // we allow duplicates in the trie for each individual barcode, as only the pairs are unique in the dual barcode setup. combopt.duplicates = DuplicateAction::FIRST; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6cc8002..a9b0ca5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -26,8 +26,8 @@ add_executable( src/handlers/SingleBarcodePairedEnd.cpp src/handlers/CombinatorialBarcodesSingleEnd.cpp src/handlers/CombinatorialBarcodesPairedEnd.cpp -# src/handlers/DualBarcodes.cpp -# src/handlers/DualBarcodesWithDiagnostics.cpp + src/handlers/DualBarcodes.cpp + src/handlers/DualBarcodesWithDiagnostics.cpp src/handlers/RandomBarcodeSingleEnd.cpp ) diff --git a/tests/src/handlers/DualBarcodes.cpp b/tests/src/handlers/DualBarcodes.cpp index 5972a96..faee88c 100644 --- a/tests/src/handlers/DualBarcodes.cpp +++ b/tests/src/handlers/DualBarcodes.cpp @@ -17,12 +17,16 @@ class DualBarcodesTest : public testing::Test { std::string constant1, constant2; std::vector variables1; std::vector variables2; + + template + using Options = typename kaori::DualBarcodes::Options; }; TEST_F(DualBarcodesTest, BasicFirst) { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); // Works in the simple case. @@ -79,8 +83,13 @@ TEST_F(DualBarcodesTest, ReverseComplementFirst) { // Works in the simple case. { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.search_reverse1 = true; + return opt; + }() ); auto state = stuff.initialize(); @@ -96,8 +105,13 @@ TEST_F(DualBarcodesTest, ReverseComplementFirst) { // And now the other one. { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.search_reverse2 = true; + return opt; + }() ); auto state = stuff.initialize(); @@ -118,8 +132,9 @@ TEST_F(DualBarcodesTest, Iupac) { // Forward. { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); auto state = stuff.initialize(); @@ -135,8 +150,14 @@ TEST_F(DualBarcodesTest, Iupac) { // Reverse-complement. { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.search_reverse1 = true; + opt.search_reverse2 = true; + return opt; + }() ); auto state = stuff.initialize(); @@ -152,14 +173,42 @@ TEST_F(DualBarcodesTest, Iupac) { TEST_F(DualBarcodesTest, MismatchFirst) { - kaori::DualBarcodes<32> stuff00(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0); - kaori::DualBarcodes<32> stuff10(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0); - kaori::DualBarcodes<32> stuff11(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1); - kaori::DualBarcodes<32> stuff20(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 2, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0); + kaori::DualBarcodes<32> stuff00( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() + ); + + kaori::DualBarcodes<32> stuff10( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + return opt; + }() + ); + + kaori::DualBarcodes<32> stuff11( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + return opt; + }() + ); + + kaori::DualBarcodes<32> stuff20( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 2; + return opt; + }() + ); // One mismatch. { @@ -206,27 +255,46 @@ TEST_F(DualBarcodesTest, AmbiguityFirst) { variables2.push_back("AAAAAG"); variables1.push_back("AAAA"); variables2.push_back("AAAAAT"); - kaori::DualBarcodes<32> stuff(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1); + + kaori::DualBarcodes<32> stuff( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches2 = 1; + return opt; + }() + ); { std::string seq1 = "AAAAAAAACGGC", seq2 = "AGCTAAAAACTTTT"; auto state = stuff.initialize(); stuff.process(state, bounds(seq1), bounds(seq2)); - EXPECT_EQ(state.counts, std::vector(variables1.size())); + EXPECT_EQ(state.counts, std::vector(variables1.size())); // nothing detected. - seq2 = "AGCTAAAAATTTTT"; + seq2 = "AGCTAAAAATTTTT"; // as a control. stuff.process(state, bounds(seq1), bounds(seq2)); EXPECT_EQ(state.counts[5], 1); } } TEST_F(DualBarcodesTest, RandomizedFirst) { - kaori::DualBarcodes<32> nonrandom(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0); - kaori::DualBarcodes<32> random(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0, true); + kaori::DualBarcodes<32> nonrandom( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() + ); + + kaori::DualBarcodes<32> random( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.random = true; + return opt; + }() + ); std::string seq1 = "AAAATTTTCGGCcacacacaAGCTTGTGTGTTTT"; std::string seq2 = "AGCTCTCTCTTTTTcgtacgacAAAACCCCCGGC"; @@ -245,19 +313,32 @@ TEST_F(DualBarcodesTest, RandomizedFirst) { TEST_F(DualBarcodesTest, BasicBest) { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + opt.use_first = false; + return opt; + }() ); - stuff.set_first(false); kaori::DualBarcodes<32> fstuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + return opt; + }() ); kaori::DualBarcodes<32> fstuff0( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); // Keeps searching for the best. @@ -306,14 +387,30 @@ TEST_F(DualBarcodesTest, BasicBest) { TEST_F(DualBarcodesTest, ReverseComplementBest) { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 1 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.search_reverse1 = true; + opt.search_reverse2 = true; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + opt.use_first = false; + return opt; + }() ); - stuff.set_first(false); kaori::DualBarcodes<32> fstuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 1 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.search_reverse1 = true; + opt.search_reverse2 = true; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + return opt; + }() ); std::string seq1 = "GCCGCCACTTTTcacacacacGCCGAAAATTTT"; // (GGGG, TTTT) @@ -331,12 +428,26 @@ TEST_F(DualBarcodesTest, ReverseComplementBest) { TEST_F(DualBarcodesTest, RandomizedBest) { // No mismatches. { - kaori::DualBarcodes<32> nonrandom(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0); - nonrandom.set_first(false); - kaori::DualBarcodes<32> random(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0, true); - random.set_first(false); + kaori::DualBarcodes<32> nonrandom( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.use_first = false; + return opt; + }() + ); + + kaori::DualBarcodes<32> random( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.use_first = false; + opt.random = true; + return opt; + }() + ); std::string seq1 = "AAAATTTTCGGCcacacacaAGCTTGTGTGTTTT"; std::string seq2 = "AGCTCTCTCTTTTTcgtacgacAAAACCCCCGGC"; @@ -352,12 +463,30 @@ TEST_F(DualBarcodesTest, RandomizedBest) { // One mismatch. { - kaori::DualBarcodes<32> nonrandom(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1); - nonrandom.set_first(false); - kaori::DualBarcodes<32> random(constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 1, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 1, true); - random.set_first(false); + kaori::DualBarcodes<32> nonrandom( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + opt.use_first = false; + return opt; + }() + ); + + kaori::DualBarcodes<32> random( + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + [&]{ + Options<32> opt; + opt.max_mismatches1 = 1; + opt.max_mismatches2 = 1; + opt.use_first = false; + opt.random = true; + return opt; + }() + ); std::string seq1 = "AAAATTATCGGCcacacacaAGCTTGTGTGTTTT"; std::string seq2 = "AGCTCTCTCTTTTTcgtacgacAAAACCCCCGGC"; @@ -378,8 +507,9 @@ TEST_F(DualBarcodesTest, Error) { EXPECT_ANY_THROW({ try { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); } catch (std::exception& e) { EXPECT_TRUE(std::string(e.what()).find("should be the same") != std::string::npos); @@ -391,8 +521,9 @@ TEST_F(DualBarcodesTest, Error) { EXPECT_ANY_THROW({ try { kaori::DualBarcodes<32> stuff( - constant1.c_str(), constant1.size(), true, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), true, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); } catch (std::exception& e) { EXPECT_TRUE(std::string(e.what()).find("expected one variable region") != std::string::npos); diff --git a/tests/src/handlers/DualBarcodesWithDiagnostics.cpp b/tests/src/handlers/DualBarcodesWithDiagnostics.cpp index 24920de..d108b85 100644 --- a/tests/src/handlers/DualBarcodesWithDiagnostics.cpp +++ b/tests/src/handlers/DualBarcodesWithDiagnostics.cpp @@ -17,6 +17,9 @@ class DualBarcodesWithDiagnosticsTest : public testing::Test { std::string constant1, constant2; std::vector variables1; std::vector variables2; + + template + using Options = typename kaori::DualBarcodes::Options; }; TEST_F(DualBarcodesWithDiagnosticsTest, BasicFirst) { @@ -42,8 +45,9 @@ TEST_F(DualBarcodesWithDiagnosticsTest, BasicFirst) { byteme::RawBufferReader reader2(reinterpret_cast(fq2.c_str()), fq2.size()); kaori::DualBarcodesWithDiagnostics<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); kaori::process_paired_end_data(&reader1, &reader2, stuff); @@ -88,8 +92,9 @@ TEST_F(DualBarcodesWithDiagnosticsTest, WithDuplicates) { byteme::RawBufferReader reader2(reinterpret_cast(fq2.c_str()), fq2.size()); kaori::DualBarcodesWithDiagnostics<32> stuff( - constant1.c_str(), constant1.size(), false, kaori::BarcodePool(variables1), 0, - constant2.c_str(), constant2.size(), false, kaori::BarcodePool(variables2), 0 + constant1.c_str(), constant1.size(), kaori::BarcodePool(variables1), + constant2.c_str(), constant2.size(), kaori::BarcodePool(variables2), + Options<32>() ); kaori::process_paired_end_data(&reader1, &reader2, stuff);