manabrew_engine/ability/effects/
change_zone_resolve_effect.rs1use super::EffectContext;
8
9#[manabrew_engine_macros::spell_effect(ChangeZoneResolveEffect)]
16fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
17 if let Some(table) = sa.change_zone_table.as_ref() {
18 table.trigger_changes_zone_all(ctx.trigger_handler, ctx.game, Some(sa));
19 return;
20 }
21 if let Some(table) = ctx.game.pending_change_zone_table.clone() {
22 table.trigger_changes_zone_all(ctx.trigger_handler, ctx.game, Some(sa));
23 ctx.game.clear_pending_change_zone_table();
24 }
25}
26
27#[cfg(test)]
28mod tests {
29 use crate::ability::spell_ability_effect::SpellAbilityEffect;
30 use std::collections::HashMap;
31
32 use forge_foundation::{CardTypeLine, ColorSet, ManaCost, ZoneType};
33
34 use crate::ability::effects::change_zone_effect;
35 use crate::ability::effects::EffectContext;
36 use crate::agent::{PassAgent, PlayerAgent};
37 use crate::card::Card;
38 use crate::game::GameState;
39 use crate::ids::{CardId, PlayerId};
40 use crate::mana::ManaPool;
41 use crate::spellability::SpellAbility;
42 use crate::trigger::handler::TriggerHandler;
43
44 #[test]
45 fn change_zone_resolve_clears_pending_table() {
46 let mut game = GameState::new(&["A", "B"], 20);
47 let p0 = PlayerId(0);
48 let c = Card::new(
49 CardId(0),
50 "X".to_string(),
51 p0,
52 CardTypeLine::parse("Creature"),
53 ManaCost::parse(""),
54 ColorSet::COLORLESS,
55 Some(1),
56 Some(1),
57 vec![],
58 vec![],
59 );
60 let cid = game.create_card(c);
61 game.ensure_pending_change_zone_table();
62 game.move_card(cid, ZoneType::Battlefield, p0);
63
64 let sa = SpellAbility::new_simple(Some(cid), p0, "DB$ ChangeZoneResolve");
65 let mut th = TriggerHandler::new();
66 let mut agents: Vec<Box<dyn PlayerAgent>> = vec![Box::new(PassAgent), Box::new(PassAgent)];
67 let mut pools = vec![ManaPool::default(), ManaPool::default()];
68 let templates = HashMap::new();
69 let templates_variants = HashMap::new();
70 let token_fallback = HashMap::new();
71 let edition_dates: HashMap<String, String> = HashMap::new();
72 let mut rng = crate::game_rng::ThreadRngAdapter;
73 let mut ctx = EffectContext {
74 game: &mut game,
75 combat: None,
76 agents: &mut agents,
77 trigger_handler: &mut th,
78 token_templates: &templates,
79 token_art_variants: &templates_variants,
80 token_fallback: &token_fallback,
81 edition_dates: &edition_dates,
82 mana_pools: &mut pools,
83 parent_target_card: None,
84 rng: &mut rng,
85 };
86
87 super::ChangeZoneResolveEffect::resolve(&mut ctx, &sa);
88 assert!(ctx.game.pending_change_zone_table.is_none());
89 }
90}