@@ -45,6 +45,13 @@ TEST(CombineFactors, Simple) {
45
45
std::vector<int > levels { 1 , 3 , 5 , 7 , 9 };
46
46
EXPECT_EQ (combined.first [0 ], levels);
47
47
}
48
+
49
+ // Nothing at all.
50
+ {
51
+ auto combined = test_combine_factors (10 , std::vector<const int *>{});
52
+ EXPECT_EQ (combined.second , std::vector<int >(10 ));
53
+ EXPECT_TRUE (combined.first .empty ());
54
+ }
48
55
}
49
56
50
57
TEST (CombineFactors, Multiple) {
@@ -101,3 +108,93 @@ TEST(CombineFactors, Multiple) {
101
108
EXPECT_EQ (factor2, combined.first [1 ]);
102
109
}
103
110
}
111
+
112
+ template <typename Factor_, typename Number_>
113
+ std::pair<std::vector<std::vector<Factor_> >, std::vector<int > > test_combine_factors_unused (size_t n, const std::vector<std::pair<const Factor_*, Number_> >& factors) {
114
+ std::vector<int > combined (n);
115
+ auto levels = scran_aggregate::combine_factors_unused (n, factors, combined.data ());
116
+ return std::make_pair (std::move (levels), std::move (combined));
117
+ }
118
+
119
+ TEST (CombineFactorsUnused, Basic) {
120
+ std::vector<int > stuff{ 1 , 3 , 5 , 3 , 1 };
121
+ auto combined = test_combine_factors_unused (stuff.size (), std::vector<std::pair<const int *, int > >{ { stuff.data (), 7 } });
122
+ EXPECT_EQ (combined.second , stuff);
123
+ std::vector<int > levels{ 0 , 1 , 2 , 3 , 4 , 5 , 6 };
124
+ EXPECT_EQ (combined.first [0 ], levels);
125
+
126
+ auto combined2 = test_combine_factors_unused (10 , std::vector<std::pair<const int *, int > >{});
127
+ EXPECT_EQ (combined2.second , std::vector<int >(10 ));
128
+ EXPECT_TRUE (combined2.first .empty ());
129
+ }
130
+
131
+ TEST (CombineFactorsUnused, Multiple) {
132
+ std::vector<int > stuff1{ 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
133
+ std::vector<int > stuff2{ 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 };
134
+
135
+ {
136
+ auto combined = test_combine_factors_unused (stuff1.size (),
137
+ std::vector<std::pair<const int *, int > >{
138
+ { stuff1.data (), 3 },
139
+ { stuff2.data (), 3 }
140
+ }
141
+ );
142
+
143
+ std::vector<int > expected { 0 , 1 , 5 , 3 , 4 , 8 , 6 , 7 , 8 };
144
+ EXPECT_EQ (combined.second , expected);
145
+
146
+ EXPECT_EQ (combined.first .size (), 2 );
147
+ std::vector<int > levels1 { 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 };
148
+ std::vector<int > levels2 { 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 }; // (0, 2) is included even though it is not observed.
149
+ EXPECT_EQ (combined.first [0 ], levels1);
150
+ EXPECT_EQ (combined.first [1 ], levels2);
151
+ }
152
+
153
+ {
154
+ auto combined = test_combine_factors_unused (stuff1.size (),
155
+ std::vector<std::pair<const int *, int > >{
156
+ { stuff1.data (), 4 },
157
+ { stuff2.data (), 3 }
158
+ }
159
+ );
160
+
161
+ std::vector<int > expected { 0 , 1 , 5 , 3 , 4 , 8 , 6 , 7 , 8 };
162
+ EXPECT_EQ (combined.second , expected);
163
+
164
+ EXPECT_EQ (combined.first .size (), 2 );
165
+ std::vector<int > levels1 { 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 };
166
+ std::vector<int > levels2 { 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 }; // (0, 2) and (3, *) are included even though they are not observed.
167
+ EXPECT_EQ (combined.first [0 ], levels1);
168
+ EXPECT_EQ (combined.first [1 ], levels2);
169
+ }
170
+
171
+ // Multiple things at play here.
172
+ {
173
+ std::vector<int > mock{ 1 };
174
+ auto combined = test_combine_factors_unused (1 ,
175
+ std::vector<std::pair<const int *, int > >{
176
+ { mock.data (), 2 },
177
+ { mock.data (), 3 },
178
+ { mock.data (), 4 }
179
+ }
180
+ );
181
+
182
+ EXPECT_EQ (combined.second [0 ], 17 ); // i.e., 1*3*4 + 1*4 + 1.
183
+
184
+ auto create_mock_sequence = [](size_t nlevels, size_t inner, size_t outer) -> auto {
185
+ std::vector<int > output (nlevels * inner * outer);
186
+ auto oIt = output.begin ();
187
+ for (size_t o = 0 ; o < outer; ++o) {
188
+ for (size_t l = 0 ; l < nlevels; ++l) {
189
+ std::fill_n (oIt, inner, l);
190
+ oIt += inner;
191
+ }
192
+ }
193
+ return output;
194
+ };
195
+
196
+ EXPECT_EQ (combined.first [0 ], create_mock_sequence (2 , 12 , 1 ));
197
+ EXPECT_EQ (combined.first [1 ], create_mock_sequence (3 , 4 , 2 ));
198
+ EXPECT_EQ (combined.first [2 ], create_mock_sequence (4 , 1 , 6 ));
199
+ }
200
+ }
0 commit comments