@@ -137,84 +137,82 @@ namespace catapult { namespace importance {
137
137
138
138
// region bucket creation
139
139
140
- TEST (TEST_CLASS, UpdateActivityCommitCreatesNewBucket) {
141
- // Arrange:
142
- TestContext context (observers::NotifyMode::Commit, Amount (1000 ));
143
- auto signerPublicKey = test::GenerateRandomByteArray<Key>();
144
- auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
140
+ namespace {
141
+ void AssertUpdateActivityDoesNotCreateNewBucket (observers::NotifyMode notifyMode) {
142
+ // Arrange:
143
+ TestContext context (notifyMode, Amount (1000 ));
144
+ auto signerPublicKey = test::GenerateRandomByteArray<Key>();
145
+ auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
145
146
146
- // Act:
147
- context.update (signerPublicKey);
147
+ // Act:
148
+ context.update (signerPublicKey);
149
+
150
+ // Assert: bucket was not created
151
+ const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
152
+ EXPECT_EQ (model::ImportanceHeight (), activityBucket.StartHeight );
153
+ }
154
+ }
148
155
149
- // Assert: bucket was created
150
- const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
151
- EXPECT_EQ (Importance_Height, activityBucket.StartHeight );
152
- EXPECT_EQ (2u , activityBucket.BeneficiaryCount );
156
+ TEST (TEST_CLASS, UpdateActivityCommitDoesNotCreateNewBucket) {
157
+ AssertUpdateActivityDoesNotCreateNewBucket (observers::NotifyMode::Commit);
153
158
}
154
159
155
160
TEST (TEST_CLASS, UpdateActivityRollbackDoesNotCreateNewBucket) {
156
- // Arrange:
157
- TestContext context (observers::NotifyMode::Rollback, Amount (1000 ));
158
- auto signerPublicKey = test::GenerateRandomByteArray<Key>();
159
- auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
160
-
161
- // Act:
162
- context.update (signerPublicKey);
163
-
164
- // Assert: bucket was not created
165
- const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
166
- EXPECT_EQ (model::ImportanceHeight (), activityBucket.StartHeight );
161
+ AssertUpdateActivityDoesNotCreateNewBucket (observers::NotifyMode::Rollback);
167
162
}
168
163
169
164
// endregion
170
165
171
166
// region bucket removal
172
167
173
- TEST (TEST_CLASS, UpdateActivityCommitDoesNotRemoveZeroBucket) {
174
- // Arrange:
175
- TestContext context (observers::NotifyMode::Commit, Amount (1000 ));
176
- auto signerPublicKey = test::GenerateRandomByteArray<Key>();
177
- auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
178
- signerAccountStateIter.get ().ActivityBuckets .update (Importance_Height, [](auto & bucket) {
179
- test::SetMaxValue (bucket.BeneficiaryCount );
180
- --bucket.BeneficiaryCount ;
181
- });
168
+ namespace {
169
+ size_t CountNonzeroFields (const state::AccountActivityBuckets::ActivityBucket& activityBucket) {
170
+ return (Amount () != activityBucket.TotalFeesPaid ? 1 : 0 )
171
+ + (0u != activityBucket.BeneficiaryCount ? 1 : 0 )
172
+ + (0u != activityBucket.RawScore ? 1 : 0 );
173
+ }
174
+
175
+ void AssertUpdateActivityDoesNotRemoveZeroBucket (observers::NotifyMode notifyMode, uint32_t initialBeneficiaryCount) {
176
+ // Arrange:
177
+ TestContext context (notifyMode, Amount (1000 ));
178
+ auto signerPublicKey = test::GenerateRandomByteArray<Key>();
179
+ auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
180
+ signerAccountStateIter.get ().ActivityBuckets .update (Importance_Height, [initialBeneficiaryCount](auto & bucket) {
181
+ bucket.BeneficiaryCount = initialBeneficiaryCount;
182
+ });
182
183
183
- // Act:
184
- context.update (signerPublicKey);
184
+ // Act:
185
+ context.update (signerPublicKey);
185
186
186
- // Assert: bucket was updated
187
- const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
188
- EXPECT_EQ (Importance_Height, activityBucket.StartHeight );
189
- EXPECT_EQ (0u , activityBucket.BeneficiaryCount );
187
+ // Assert: bucket was updated
188
+ const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
189
+ EXPECT_EQ (Importance_Height, activityBucket.StartHeight );
190
+ EXPECT_EQ (0u , activityBucket.BeneficiaryCount );
191
+ EXPECT_EQ (0u , CountNonzeroFields (activityBucket));
192
+ }
190
193
}
191
194
192
- TEST (TEST_CLASS, UpdateActivityRollbackRemovesZeroBucket) {
193
- // Arrange:
194
- TestContext context (observers::NotifyMode::Rollback, Amount (1000 ));
195
- auto signerPublicKey = test::GenerateRandomByteArray<Key>();
196
- auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
197
- signerAccountStateIter.get ().ActivityBuckets .update (Importance_Height, [](auto & bucket) {
198
- bucket.BeneficiaryCount = 2 ;
199
- });
200
-
201
- // Act:
202
- context.update (signerPublicKey);
195
+ TEST (TEST_CLASS, UpdateActivityCommitDoesNotRemoveZeroBucket) {
196
+ auto initialBeneficiaryCount = std::numeric_limits<uint32_t >::max () - 1 ; // max - 1 + 2 == 0
197
+ AssertUpdateActivityDoesNotRemoveZeroBucket (observers::NotifyMode::Commit, initialBeneficiaryCount);
198
+ }
203
199
204
- // Assert: bucket was removed
205
- const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
206
- EXPECT_EQ (model::ImportanceHeight (), activityBucket.StartHeight );
200
+ TEST (TEST_CLASS, UpdateActivityRollbackDoesNotRemoveZeroBucket) {
201
+ AssertUpdateActivityDoesNotRemoveZeroBucket (observers::NotifyMode::Rollback, 2 );
207
202
}
208
203
209
204
namespace {
210
- template <typename TUpdateBucket>
211
- void AssertUpdateActivityRollbackDoesNotRemoveNonzeroBucket (const char * message, TUpdateBucket updateBucket) {
205
+ void AssertUpdateActivityDoesNotRemoveNonzeroBucket (
206
+ observers::NotifyMode notifyMode,
207
+ uint32_t initialBeneficiaryCount,
208
+ const char * message,
209
+ const ActivityBucketConsumer& updateBucket) {
212
210
// Arrange:
213
- TestContext context (observers::NotifyMode::Rollback , Amount (1000 ));
211
+ TestContext context (notifyMode , Amount (1000 ));
214
212
auto signerPublicKey = test::GenerateRandomByteArray<Key>();
215
213
auto signerAccountStateIter = context.addAccount (signerPublicKey, Amount (1000 ));
216
- signerAccountStateIter.get ().ActivityBuckets .update (Importance_Height, [updateBucket](auto & bucket) {
217
- bucket.BeneficiaryCount = 2 ;
214
+ signerAccountStateIter.get ().ActivityBuckets .update (Importance_Height, [initialBeneficiaryCount, updateBucket](auto & bucket) {
215
+ bucket.BeneficiaryCount = initialBeneficiaryCount ;
218
216
updateBucket (bucket);
219
217
});
220
218
@@ -224,19 +222,29 @@ namespace catapult { namespace importance {
224
222
// Assert: bucket was updated
225
223
const auto & activityBucket = signerAccountStateIter.get ().ActivityBuckets .get (Importance_Height);
226
224
EXPECT_EQ (Importance_Height, activityBucket.StartHeight ) << message;
225
+ EXPECT_EQ (1u , CountNonzeroFields (activityBucket)) << message;
226
+ }
227
+
228
+ void AssertUpdateActivityDoesNotRemoveNonzeroBucketAll (observers::NotifyMode notifyMode, uint32_t initialBeneficiaryCount) {
229
+ AssertUpdateActivityDoesNotRemoveNonzeroBucket (notifyMode, initialBeneficiaryCount, " TotalFeesPaid" , [](auto & bucket) {
230
+ bucket.TotalFeesPaid = bucket.TotalFeesPaid + Amount (1 );
231
+ });
232
+ AssertUpdateActivityDoesNotRemoveNonzeroBucket (notifyMode, initialBeneficiaryCount, " BeneficiaryCount" , [](auto & bucket) {
233
+ ++bucket.BeneficiaryCount ;
234
+ });
235
+ AssertUpdateActivityDoesNotRemoveNonzeroBucket (notifyMode, initialBeneficiaryCount, " RawScore" , [](auto & bucket) {
236
+ ++bucket.RawScore ;
237
+ });
227
238
}
228
239
}
229
240
241
+ TEST (TEST_CLASS, UpdateActivityCommitDoesNotRemoveNonzeroBucket) {
242
+ auto initialBeneficiaryCount = std::numeric_limits<uint32_t >::max () - 1 ; // max - 1 + 2 == 0
243
+ AssertUpdateActivityDoesNotRemoveNonzeroBucketAll (observers::NotifyMode::Commit, initialBeneficiaryCount);
244
+ }
245
+
230
246
TEST (TEST_CLASS, UpdateActivityRollbackDoesNotRemoveNonzeroBucket) {
231
- AssertUpdateActivityRollbackDoesNotRemoveNonzeroBucket (" TotalFeesPaid" , [](auto & bucket) {
232
- bucket.TotalFeesPaid = bucket.TotalFeesPaid + Amount (1 );
233
- });
234
- AssertUpdateActivityRollbackDoesNotRemoveNonzeroBucket (" BeneficiaryCount" , [](auto & bucket) {
235
- ++bucket.BeneficiaryCount ;
236
- });
237
- AssertUpdateActivityRollbackDoesNotRemoveNonzeroBucket (" RawScore" , [](auto & bucket) {
238
- ++bucket.RawScore ;
239
- });
247
+ AssertUpdateActivityDoesNotRemoveNonzeroBucketAll (observers::NotifyMode::Rollback, 2 );
240
248
}
241
249
242
250
// endregion
0 commit comments