···11+use bevy_ecs::prelude::*;
22+use bevy_status_effects::relation::Effecting;
33+use bevy_status_effects::timer::{Delay, EffectTimer, Lifetime, TimerMergeMode};
44+use bevy_status_effects::*;
55+use bevy_time::*;
66+use std::time::Duration;
77+88+#[derive(StatusEffect, Component, Debug, Eq, PartialEq, Default)]
99+struct MyEffect;
1010+1111+#[test]
1212+fn stack() {
1313+ let mut world = World::new();
1414+ init_effect_hook::<MyEffect>(&mut world);
1515+1616+ let target = world.spawn_empty().id();
1717+ let first = world.spawn((MyEffect, Effecting(target))).id();
1818+ let second = world.spawn((MyEffect, Effecting(target))).id();
1919+2020+ world.flush();
2121+2222+ assert_eq!(world.get::<MyEffect>(first), Some(&MyEffect));
2323+ assert_eq!(world.get::<MyEffect>(second), Some(&MyEffect));
2424+}
2525+2626+#[test]
2727+fn refresh() {
2828+ let mut world = World::new();
2929+ init_effect_hook::<MyEffect>(&mut world);
3030+3131+ let target = world.spawn_empty().id();
3232+ let first = world
3333+ .spawn((MyEffect, Effecting(target), EffectMode::Replace))
3434+ .id();
3535+ let second = world
3636+ .spawn((MyEffect, Effecting(target), EffectMode::Replace))
3737+ .id();
3838+3939+ world.flush();
4040+4141+ assert_eq!(world.get::<MyEffect>(first), None);
4242+ assert_eq!(world.get::<MyEffect>(second), Some(&MyEffect));
4343+}
4444+4545+#[test]
4646+fn mixed() {
4747+ let mut world = World::new();
4848+ init_effect_hook::<MyEffect>(&mut world);
4949+5050+ let target = world.spawn_empty().id();
5151+5252+ let stack_1 = world.spawn((MyEffect, Effecting(target))).id();
5353+ let stack_2 = world
5454+ .spawn((MyEffect, Effecting(target), EffectMode::Stack))
5555+ .id();
5656+5757+ let replace_1 = world
5858+ .spawn((MyEffect, Effecting(target), EffectMode::Replace))
5959+ .id();
6060+ let replace_2 = world
6161+ .spawn((MyEffect, Effecting(target), EffectMode::Replace))
6262+ .id();
6363+6464+ world.flush();
6565+6666+ assert_eq!(world.get::<MyEffect>(stack_1), Some(&MyEffect));
6767+ assert_eq!(world.get::<MyEffect>(stack_2), Some(&MyEffect));
6868+6969+ assert_eq!(world.get::<MyEffect>(replace_1), None);
7070+ assert_eq!(world.get::<MyEffect>(replace_2), Some(&MyEffect));
7171+}
7272+7373+#[test]
7474+fn timer_replace() {
7575+ let mut world = World::new();
7676+ init_effect_hook::<MyEffect>(&mut world);
7777+7878+ let target = world.spawn_empty().id();
7979+ let second_lifetime = Lifetime::from_seconds(2.0).with_mode(TimerMergeMode::Replace);
8080+ world.spawn((
8181+ MyEffect,
8282+ Effecting(target),
8383+ EffectMode::Replace,
8484+ Lifetime::from_seconds(1.0).with_mode(TimerMergeMode::Replace),
8585+ ));
8686+ let second = world
8787+ .spawn((
8888+ MyEffect,
8989+ Effecting(target),
9090+ EffectMode::Replace,
9191+ second_lifetime.clone(),
9292+ ))
9393+ .id();
9494+9595+ world.flush();
9696+9797+ assert_eq!(world.get::<Lifetime>(second), Some(&second_lifetime));
9898+}
9999+100100+#[test]
101101+fn timer_inherit() {
102102+ let mut world = World::new();
103103+ init_effect_hook::<MyEffect>(&mut world);
104104+105105+ let target = world.spawn_empty().id();
106106+ let first_delay = Delay::from_seconds(1.0).with_mode(TimerMergeMode::Inherit);
107107+108108+ world.spawn((
109109+ MyEffect,
110110+ Effecting(target),
111111+ EffectMode::Replace,
112112+ first_delay.clone(),
113113+ ));
114114+ let second = world
115115+ .spawn((
116116+ MyEffect,
117117+ Effecting(target),
118118+ EffectMode::Replace,
119119+ Delay::from_seconds(2.0).with_mode(TimerMergeMode::Inherit),
120120+ ))
121121+ .id();
122122+123123+ world.flush();
124124+125125+ assert_eq!(world.get::<Delay>(second), Some(&first_delay));
126126+}
127127+128128+#[test]
129129+fn timer_fraction() {
130130+ let mut world = World::new();
131131+ init_effect_hook::<MyEffect>(&mut world);
132132+133133+ let target = world.spawn_empty().id();
134134+135135+ let mut first_timer = Timer::from_seconds(2.0, TimerMode::Once);
136136+ first_timer.tick(Duration::from_secs_f32(1.0));
137137+138138+ world.spawn((
139139+ MyEffect,
140140+ Effecting(target),
141141+ EffectMode::Replace,
142142+ Delay {
143143+ timer: first_timer,
144144+ mode: TimerMergeMode::Fraction,
145145+ },
146146+ ));
147147+ let second = world
148148+ .spawn((
149149+ MyEffect,
150150+ Effecting(target),
151151+ EffectMode::Replace,
152152+ Delay::from_seconds(10.0).with_mode(TimerMergeMode::Fraction),
153153+ ))
154154+ .id();
155155+156156+ world.flush();
157157+158158+ let mut expected_timer = Timer::from_seconds(10.0, TimerMode::Repeating);
159159+ expected_timer.tick(Duration::from_secs_f32(5.0));
160160+161161+ assert_eq!(
162162+ world.get::<Delay>(second),
163163+ Some(&Delay {
164164+ timer: expected_timer,
165165+ mode: TimerMergeMode::Fraction,
166166+ })
167167+ );
168168+}
169169+170170+#[test]
171171+fn timer_max() {
172172+ let mut world = World::new();
173173+ init_effect_hook::<MyEffect>(&mut world);
174174+175175+ let target = world.spawn_empty().id();
176176+ let max = Delay::from_seconds(3.0).with_mode(TimerMergeMode::Max);
177177+178178+ world.spawn((
179179+ MyEffect,
180180+ Effecting(target),
181181+ EffectMode::Replace,
182182+ Delay::from_seconds(1.0).with_mode(TimerMergeMode::Max),
183183+ ));
184184+ world.spawn((
185185+ MyEffect,
186186+ Effecting(target),
187187+ EffectMode::Replace,
188188+ max.clone(),
189189+ ));
190190+ let third = world
191191+ .spawn((
192192+ MyEffect,
193193+ Effecting(target),
194194+ EffectMode::Replace,
195195+ Delay::from_seconds(2.0).with_mode(TimerMergeMode::Max),
196196+ ))
197197+ .id();
198198+199199+ world.flush();
200200+201201+ assert_eq!(world.get::<Delay>(third), Some(&max));
202202+}
+44
bevy_status_effects/tests/timer.rs
···11+use bevy_status_effects::timer::{EffectTimer, Lifetime, TimerMergeMode};
22+33+#[test]
44+fn merge_replace() {
55+ let first = Lifetime::from_seconds(1.0).with_mode(TimerMergeMode::Replace);
66+ let second = Lifetime::from_seconds(2.0).with_mode(TimerMergeMode::Replace);
77+ let mut result = second.clone();
88+ result.merge(&first);
99+1010+ assert_eq!(result, second);
1111+}
1212+1313+#[test]
1414+fn merge_inherit() {
1515+ let first = Lifetime::from_seconds(1.0).with_mode(TimerMergeMode::Inherit);
1616+ let second = Lifetime::from_seconds(2.0).with_mode(TimerMergeMode::Inherit);
1717+ let mut result = second.clone();
1818+ result.merge(&first);
1919+2020+ assert_eq!(result, first);
2121+}
2222+2323+#[test]
2424+fn merge_fraction() {
2525+ let first = Lifetime::from_seconds(1.0).with_mode(TimerMergeMode::Fraction);
2626+ let second = Lifetime::from_seconds(2.0).with_mode(TimerMergeMode::Fraction);
2727+ let mut result = second.clone();
2828+ result.merge(&first);
2929+3030+ assert_eq!(result, second);
3131+}
3232+3333+#[test]
3434+fn merge_max() {
3535+ let first = Lifetime::from_seconds(1.0).with_mode(TimerMergeMode::Max);
3636+ let mut second = Lifetime::from_seconds(3.0).with_mode(TimerMergeMode::Max);
3737+ second.merge(&first);
3838+ let third = Lifetime::from_seconds(2.0).with_mode(TimerMergeMode::Max);
3939+4040+ let mut result = third.clone();
4141+ result.merge(&second);
4242+4343+ assert_eq!(result, second);
4444+}