wesnoth/data/test/macros/wml_unit_test_macros.cfg
2024-01-08 12:04:45 -06:00

249 lines
5.7 KiB
INI

#textdomain wesnoth-test
#define RETURN X
[if]
[variable]
name=ended
boolean_not_equals=yes
[/variable]
[then]
[if]
{X}
[then]
{VARIABLE ended yes}
[endlevel]
test_result=pass
linger_mode = yes
[/endlevel]
[/then]
[else]
[test_condition]
result=no
{X}
[/test_condition]
{VARIABLE ended yes}
[endlevel]
test_result=fail
linger_mode = yes
[/endlevel]
[/else]
[/if]
[/then]
[/if]
#enddef
#define ASSERT X
[if]
[variable]
name=ended
boolean_not_equals=yes
[/variable]
[then]
[if]
{X}
[else]
[test_condition]
result=no
{X}
[/test_condition]
{VARIABLE ended yes}
[endlevel]
test_result=fail
linger_mode = yes
[/endlevel]
[/else]
[/if]
[/then]
[/if]
#enddef
#define FAIL
{RETURN ([false][/false])}
#enddef
#define SUCCEED
{RETURN ([true][/true])}
#enddef
#define FAIL_IF_NOT FLAG NOT_EQUALS
[if]
[variable]
name={FLAG}
not_equals={NOT_EQUALS}
[/variable]
[then]
{FAIL}
[/then]
[/if]
#enddef
# have one adjacent unit attack another adjacent unit
# each unit is given 1000 hp and their attack is made to 1x100, with a 100% chance of hitting
#define ATTACK_AND_VALIDATE DAMAGE1
#arg ID1
alice#endarg
#arg ID2
bob#endarg
#arg DAMAGE2
{DAMAGE1}#endarg
[modify_unit]
[filter]
id={ID1},{ID2}
[/filter]
[effect]
apply_to=attack
[set_specials]
mode=append
[attacks]
value=1
[/attacks]
[damage]
value=100
[/damage]
[chance_to_hit]
value=100
[/chance_to_hit]
[/set_specials]
[/effect]
hitpoints = 1000
max_hitpoints = 1000
[/modify_unit]
[test_do_attack_by_id]
attacker={ID1}
defender={ID2}
[/test_do_attack_by_id]
[store_unit]
[filter]
id={ID1}
[/filter]
variable={ID1}
[/store_unit]
[store_unit]
[filter]
id={ID2}
[/filter]
variable={ID2}
[/store_unit]
{ASSERT {VARIABLE_CONDITIONAL {ID1}.hitpoints numerical_equals "$(${ID1}.max_hitpoints-{DAMAGE1})"}}
{ASSERT {VARIABLE_CONDITIONAL {ID2}.hitpoints numerical_equals "$(${ID2}.max_hitpoints-{DAMAGE2})"}}
{CLEAR_VARIABLE {ID1}}
{CLEAR_VARIABLE {ID2}}
#enddef
# Takes a unit id, and checks that its hitpoints and experience are the expected values.
# Clobbers the variable "temp".
#define ASSERT_UNIT_HP_XP ID EXPECTED_HP EXPECTED_XP
[store_unit]
[filter]
id={ID}
[/filter]
variable=temp
[/store_unit]
{ASSERT ({VARIABLE_CONDITIONAL temp.length numerical_equals 1})}
{ASSERT ({VARIABLE_CONDITIONAL temp.hitpoints numerical_equals {EXPECTED_HP}})}
{ASSERT ({VARIABLE_CONDITIONAL temp.experience numerical_equals {EXPECTED_XP}})}
{CLEAR_VARIABLE temp}
#enddef
# checks the number of strikes of all weapons a unit has
# they are expected to have the same number of strikes on all weapons
#define CHECK_STRIKES WEAPONS STRIKES RESULT
#arg ID1
alice#endarg
#arg ID2
bob#endarg
#arg COMPARE
numerical_equals#endarg
[event]
name = start
[modify_unit]
[filter]
id={ID1},{ID2}
[/filter]
[effect]
apply_to=attack
[set_specials]
mode=append
[damage]
value=1
[/damage]
[chance_to_hit]
value=100
[/chance_to_hit]
[/set_specials]
[/effect]
[/modify_unit]
{VARIABLE {ID1}_{ID2}_count 0}
[for]
variable=i
start=0
step=1
end="$({WEAPONS}-1)"
[do]
[test_do_attack_by_id]
attacker={ID1}
defender={ID2}
weapon=$i
resupply_attacks_left=5
[/test_do_attack_by_id]
[/do]
[/for]
[/event]
[event]
name=pre attack
first_time_only=no
[filter]
id={ID1}
[/filter]
{VARIABLE {ID1}_{ID2}_strikes 0}
[/event]
[event]
name=attacker hits, attacker misses
first_time_only=no
[filter]
id={ID1}
[/filter]
{VARIABLE_OP {ID1}_{ID2}_strikes add 1}
[/event]
[event]
name=attack end
first_time_only=no
[filter]
id={ID1}
[/filter]
{ASSERT {VARIABLE_CONDITIONAL {ID1}_{ID2}_strikes {COMPARE} {STRIKES}}}
{VARIABLE_OP {ID1}_{ID2}_count add 1}
[if]
{VARIABLE_CONDITIONAL {ID1}_{ID2}_count numerical_equals {WEAPONS}}
[then]
{RESULT}
[/then]
[/if]
[/event]
#enddef