Skip to content

Commit 6a3d10b

Browse files
raymondkfcheunggithub-actions[bot]bkonturbkchr
authored
Simplify event assertion with predicate-based check (#7734)
A follow-up PR to simplify event assertions by introducing `contains_event`, allowing event checks without needing exact field matches. This reduces redundancy and makes tests more flexible. Partially addresses #6119 by providing an alternative way to assert events. Reference: [PR #7594 - Discussion](#7594 (comment)) --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Branislav Kontur <[email protected]> Co-authored-by: Bastian Köcher <[email protected]>
1 parent cc83fba commit 6a3d10b

File tree

2 files changed

+34
-44
lines changed

2 files changed

+34
-44
lines changed

polkadot/xcm/xcm-simulator/example/src/tests.rs

+26-44
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ fn buy_execution<C>(fees: impl Into<Asset>) -> Instruction<C> {
2626
BuyExecution { fees: fees.into(), weight_limit: Unlimited }
2727
}
2828

29+
/// Helper macro to check if a system event exists in the event list.
30+
///
31+
/// Example usage:
32+
/// ```ignore
33+
/// assert!(system_contains_event!(parachain, System(frame_system::Event::Remarked { .. })));
34+
/// assert!(system_contains_event!(relay_chain, XcmPallet(pallet_xcm::Event::Attempted { .. })));
35+
/// ```
36+
macro_rules! system_contains_event {
37+
($runtime:ident, $variant:ident($($pattern:tt)*)) => {
38+
$runtime::System::events().iter().any(|e| {
39+
matches!(e.event, $runtime::RuntimeEvent::$variant($($pattern)*))
40+
})
41+
};
42+
}
43+
2944
#[test]
3045
fn remote_account_ids_work() {
3146
child_account_account_id(1, ALICE);
@@ -53,11 +68,7 @@ fn dmp() {
5368
});
5469

5570
ParaA::execute_with(|| {
56-
use parachain::{RuntimeEvent, System};
57-
assert!(System::events().iter().any(|r| matches!(
58-
r.event,
59-
RuntimeEvent::System(frame_system::Event::Remarked { .. })
60-
)));
71+
assert!(system_contains_event!(parachain, System(frame_system::Event::Remarked { .. })));
6172
});
6273
}
6374

@@ -81,11 +92,7 @@ fn ump() {
8192
});
8293

8394
Relay::execute_with(|| {
84-
use relay_chain::{RuntimeEvent, System};
85-
assert!(System::events().iter().any(|r| matches!(
86-
r.event,
87-
RuntimeEvent::System(frame_system::Event::Remarked { .. })
88-
)));
95+
assert!(system_contains_event!(relay_chain, System(frame_system::Event::Remarked { .. })));
8996
});
9097
}
9198

@@ -109,11 +116,7 @@ fn xcmp() {
109116
});
110117

111118
ParaB::execute_with(|| {
112-
use parachain::{RuntimeEvent, System};
113-
assert!(System::events().iter().any(|r| matches!(
114-
r.event,
115-
RuntimeEvent::System(frame_system::Event::Remarked { .. })
116-
)));
119+
assert!(system_contains_event!(parachain, System(frame_system::Event::Remarked { .. })));
117120
});
118121
}
119122

@@ -137,18 +140,12 @@ fn reserve_transfer() {
137140
INITIAL_BALANCE + withdraw_amount
138141
);
139142
// Ensure expected events were emitted
140-
let events = relay_chain::System::events();
141-
let attempted_count = count_relay_chain_events(&events, |event| {
142-
matches!(
143-
event,
144-
relay_chain::RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { .. })
145-
)
146-
});
147-
let sent_count = count_relay_chain_events(&events, |event| {
148-
matches!(event, relay_chain::RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }))
149-
});
150-
assert_eq!(attempted_count, 1, "Expected one XcmPallet::Attempted event");
151-
assert_eq!(sent_count, 1, "Expected one XcmPallet::Sent event");
143+
let attempted_emitted =
144+
system_contains_event!(relay_chain, XcmPallet(pallet_xcm::Event::Attempted { .. }));
145+
let sent_emitted =
146+
system_contains_event!(relay_chain, XcmPallet(pallet_xcm::Event::Sent { .. }));
147+
assert!(attempted_emitted, "Expected XcmPallet::Attempted event emitted");
148+
assert!(sent_emitted, "Expected XcmPallet::Sent event emitted");
152149
});
153150

154151
ParaA::execute_with(|| {
@@ -193,13 +190,8 @@ fn reserve_transfer_with_error() {
193190
assert!(log_capture.contains("XCM validate_send failed"));
194191

195192
// Verify that XcmPallet::Attempted was NOT emitted (rollback happened)
196-
let events = relay_chain::System::events();
197-
let xcm_attempted_emitted = events.iter().any(|e| {
198-
matches!(
199-
e.event,
200-
relay_chain::RuntimeEvent::XcmPallet(pallet_xcm::Event::Attempted { .. })
201-
)
202-
});
193+
let xcm_attempted_emitted =
194+
system_contains_event!(relay_chain, XcmPallet(pallet_xcm::Event::Attempted { .. }));
203195
assert!(
204196
!xcm_attempted_emitted,
205197
"Expected no XcmPallet::Attempted event due to rollback, but it was emitted"
@@ -580,13 +572,3 @@ fn query_holding() {
580572
);
581573
});
582574
}
583-
584-
fn count_relay_chain_events<F>(
585-
events: &[frame_system::EventRecord<relay_chain::RuntimeEvent, sp_core::H256>],
586-
predicate: F,
587-
) -> usize
588-
where
589-
F: Fn(&relay_chain::RuntimeEvent) -> bool,
590-
{
591-
events.iter().filter(|e| predicate(&e.event)).count()
592-
}

prdoc/pr_7734.prdoc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
title: Simplify event assertion with predicate-based check
2+
doc:
3+
- audience: Runtime Dev
4+
description: |-
5+
Simplify event assertions by introducing `contains_event`, reducing duplicated code.
6+
crates:
7+
- name: xcm-simulator-example
8+
bump: patch

0 commit comments

Comments
 (0)