Merge branch 'pathfinding_tests'

This commit is contained in:
Chris Beck 2014-05-28 01:31:42 -04:00
commit 6c55e29a93
5 changed files with 2334 additions and 0 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,457 @@
### Change GENERATE_ANSWERS to 1 in the next line to generate the correct answers for the characterization test.
### The list of answers will appear in console when you run wesnoth, after debug: messages.
### Copy the lines to a text file ("foo") and use the following sed script to clean them,
###
### sed -n 's/^.*: \([ [:digit:]]*\) ,/\1/p' <foo | tr '\n' ','
###
### so you get a nice comma separated list. Then paste it in data/test/macros/pathfind_answers.cfg,
### and in this file change GENERATE_ANSWERS to 0 again.
#define GENERATE_ANSWERS
0
#enddef
#define IF_GEN_ANS T E
[if]
{VARIABLE_CONDITIONAL GEN_ANS equals 1}
[then]
{T}
[/then]
[else]
{E}
[/else]
[/if]
#enddef
#define SPLIT_COMMA_LIST LIST VAR
[set_variables]
name={VAR}
[split]
list={LIST}
key=val
separator=","
remove_empty=no
[/split]
[/set_variables]
#enddef
#define CHECK_ANSWER X
{IF_GEN_ANS
({VARIABLE observed_answer ${X}}
[wml_message]
message="$observed_answer ,"
logger=debug
to_chat=false
[/wml_message]
)
({VARIABLE current_answer $answers[$answer_counter|].val|}
{VARIABLE observed_answer ${X}}
[wml_message]
message="$current_answer , $observed_answer"
logger=debug
to_chat=false
[/wml_message]
{ASSERT ({VARIABLE_CONDITIONAL observed_answer equals $current_answer}) }
)
}
{VARIABLE_OP answer_counter add 1}
#enddef
#define INIT_ANSWERS LIST
{VARIABLE answer_counter 0}
{VARIABLE answers_list ("{{LIST}}")}
{SPLIT_COMMA_LIST $answers_list answers}
[wml_message]
message="Parsed: $answers.length| answers"
logger=debug
to_chat=false
[/wml_message]
#enddef
#define TEST_PATHFIND SRC DST
[find_path]
[traveler]
{SRC}
[/traveler]
[destination]
{DST}
[/destination]
allow_multiple_turns=yes
variable=path
[/find_path]
{VARIABLE nhexes $path.hexes}
{IF_VAR nhexes equals 0 (
[then]
#[wml_message]
# message="got no paths {SRC} {DST}"
# logger=error
# to_chat=false
#[/wml_message]
{CHECK_ANSWER nhexes}
[/then]
[else]
{CHECK_ANSWER path.movement_cost}
#{CHECK_ANSWER path.required_turns} Comment this out -- there may be multiple shortest paths, so finding a different shortest path is okay.
#{FOREACH path.steps step}
# {CHECK_ANSWER (path.steps[$step|].x)}
# {CHECK_ANSWER (path.steps[$step|].y)}
#{NEXT step}
[/else]
)}
#enddef
#define TEST_NEXT_UNIT TEST_MACRO DST
[store_locations]
{DST}
variable=tmp
[/store_locations]
[if]
[have_unit]
{DST}
[/have_unit]
[then]
[wml_message]
message="Destination {DST} was occupied!"
logger=error
to_chat=false
[/wml_message]
[/then]
[else]
[if]
{VARIABLE_CONDITIONAL tmp.terrain contains "X"}
[then]
[wml_message]
message="Destination {DST} was impassable!"
logger=error
to_chat=false
[/wml_message]
[/then]
[else]
{VARIABLE ID $units[$unit_counter|].id|}
{{TEST_MACRO} (id=$ID) ({DST})}
{VARIABLE_OP unit_counter add 1}
[/else]
[/if]
[/else]
[/if]
#enddef
#define MAKE_TEST ID MACRO INIT_MACRO
[test]
name="Unit Test {ID}"
id={ID}
{test/maps/pathfind_1.cfg}
[event]
name = side 1 turn 1
first_time_only=yes
{VARIABLE GEN_ANS {GENERATE_ANSWERS}}
{INIT_ANSWERS ({INIT_MACRO})}
[store_unit]
[filter]
[/filter]
variable=units
[/store_unit]
{VARIABLE unit_counter 0}
[wml_message]
message="$units.length| units"
logger=debug
to_chat=false
[/wml_message]
{TEST_NEXT_UNIT {MACRO} (x,y=9,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=42,16)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=33,27)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,5)}
{TEST_NEXT_UNIT {MACRO} (x,y=5,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=23,15)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,39)}
{TEST_NEXT_UNIT {MACRO} (x,y=31,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,12)}
{TEST_NEXT_UNIT {MACRO} (x,y=18,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=16,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=39,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,36)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,19)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=6,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,1)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,6)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,4)}
{TEST_NEXT_UNIT {MACRO} (x,y=9,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=42,16)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=33,27)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,5)}
{TEST_NEXT_UNIT {MACRO} (x,y=5,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=23,15)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,39)}
{TEST_NEXT_UNIT {MACRO} (x,y=31,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,12)}
{TEST_NEXT_UNIT {MACRO} (x,y=18,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,17)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,14)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=32,3)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,36)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,19)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=6,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,1)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,6)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,4)}
{TEST_NEXT_UNIT {MACRO} (x,y=9,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=42,16)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=33,27)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,5)}
{TEST_NEXT_UNIT {MACRO} (x,y=5,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=23,15)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,39)}
{TEST_NEXT_UNIT {MACRO} (x,y=31,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,12)}
{TEST_NEXT_UNIT {MACRO} (x,y=18,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=16,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=39,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,36)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,19)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=6,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,1)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,6)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,4)}
{TEST_NEXT_UNIT {MACRO} (x,y=9,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=42,16)}
{TEST_NEXT_UNIT {MACRO} (x,y=10,11)}
{TEST_NEXT_UNIT {MACRO} (x,y=33,27)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,5)}
{TEST_NEXT_UNIT {MACRO} (x,y=5,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=23,15)}
{TEST_NEXT_UNIT {MACRO} (x,y=3,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,39)}
{TEST_NEXT_UNIT {MACRO} (x,y=31,23)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,9)}
{TEST_NEXT_UNIT {MACRO} (x,y=12,8)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,12)}
{TEST_NEXT_UNIT {MACRO} (x,y=18,32)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=24,17)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=34,14)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,28)}
{TEST_NEXT_UNIT {MACRO} (x,y=19,2)}
{TEST_NEXT_UNIT {MACRO} (x,y=32,3)}
{TEST_NEXT_UNIT {MACRO} (x,y=35,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,36)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,19)}
{TEST_NEXT_UNIT {MACRO} (x,y=25,24)}
{TEST_NEXT_UNIT {MACRO} (x,y=26,7)}
{TEST_NEXT_UNIT {MACRO} (x,y=2,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=14,34)}
{TEST_NEXT_UNIT {MACRO} (x,y=16,18)}
{TEST_NEXT_UNIT {MACRO} (x,y=39,42)}
{TEST_NEXT_UNIT {MACRO} (x,y=1,32)}
[wml_message]
message="$answer_counter| answers made"
logger=debug
to_chat=false
[/wml_message]
{VARIABLE anslength $answers.length}
[wml_message]
message="$answers.length| anslength"
logger=debug
to_chat=false
[/wml_message]
{IF_GEN_ANS
({ASSERT ({VARIABLE_CONDITIONAL answer_counter equals $anslength})}
[wml_message]
message="unit counter = $unit_counter"
logger=debug
to_chat=false
[/wml_message]
{VARIABLE temp $units.length}
[wml_message]
message="units.length = $units.length"
logger=debug
to_chat=false
[/wml_message])
()}
[/event]
[event]
name = side 1 turn refresh
{RETURN ([true][/true])}
[/event]
[/test]
#enddef
{MAKE_TEST characterize_pathfinding_one TEST_PATHFIND GENERATED_FIND_PATH_ANSWERS}
#define MAKE_TEST_INIT_ONLY ID MACRO INIT_MACRO
[test]
name="Unit Test {ID}"
id={ID}
{test/maps/pathfind_1.cfg}
[event]
name = side 1 turn 1
first_time_only=yes
{VARIABLE GEN_ANS {GENERATE_ANSWERS}}
{INIT_ANSWERS ({INIT_MACRO})}
[/event]
[/test]
#enddef
{MAKE_TEST_INIT_ONLY characterize_pathfinding_init TEST_PATHFIND GENERATED_FIND_PATH_ANSWERS}
### Reach test goes below here ###
#define TEST_PATHREACH SRC DST
[store_reachable_locations]
[filter]
{SRC}
[/filter]
variable=r
[/store_reachable_locations]
{VARIABLE nlocs $r.length}
{CHECK_ANSWER nlocs}
{FOREACH r i}
{CHECK_ANSWER (r[$i|].x)}
{CHECK_ANSWER (r[$i|].y)}
{NEXT i}
#enddef
#define MAKE_SHORT_TEST ID MACRO INIT_MACRO INIT_COUNTER
[test]
name="Unit Test {ID}"
id={ID}
{test/maps/pathfind_1.cfg}
[event]
name = side 1 turn 1
first_time_only=yes
{VARIABLE GEN_ANS {GENERATE_ANSWERS}}
{INIT_ANSWERS ({INIT_MACRO})}
[store_unit]
[filter]
[/filter]
variable=units
[/store_unit]
{VARIABLE unit_counter {INIT_COUNTER}}
[wml_message]
message="$units.length| units"
logger=debug
to_chat=false
[/wml_message]
{REPEAT 5 (
{TEST_NEXT_UNIT {MACRO} (x,y=8,8)}
)}
[wml_message]
message="$answer_counter| answers made"
logger=debug
to_chat=false
[/wml_message]
{VARIABLE anslength $answers.length}
[wml_message]
message="$answers.length| anslength"
logger=debug
to_chat=false
[/wml_message]
{IF_GEN_ANS
({ASSERT ({VARIABLE_CONDITIONAL answer_counter equals $anslength})}
[wml_message]
message="unit counter = $unit_counter"
logger=debug
to_chat=false
[/wml_message]
{VARIABLE temp $units.length}
[wml_message]
message="units.length = $units.length"
logger=debug
to_chat=false
[/wml_message])
()}
[/event]
[event]
name = side 1 turn refresh
{RETURN ([true][/true])}
[/event]
[/test]
#enddef
{MAKE_SHORT_TEST characterize_pathfinding_reach_1 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_1 0}
{MAKE_SHORT_TEST characterize_pathfinding_reach_2 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_2 20}
{MAKE_SHORT_TEST characterize_pathfinding_reach_3 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_3 40}
{MAKE_SHORT_TEST characterize_pathfinding_reach_4 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_4 60}
{MAKE_SHORT_TEST characterize_pathfinding_reach_5 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_5 80}
{MAKE_SHORT_TEST characterize_pathfinding_reach_6 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_6 100}
{MAKE_SHORT_TEST characterize_pathfinding_reach_7 TEST_PATHREACH GENERATED_REACHABILITY_ANSWERS_7 120}

View file

@ -0,0 +1,10 @@
{GENERIC_UNIT_TEST "store_locations_one" (
[event]
name = start
[store_locations]
x,y=1,1
variable=tmp
[/store_locations]
{RETURN ({VARIABLE_CONDITIONAL tmp.terrain equals "Gg^Kov"})}
[/event]
)}

View file

@ -72,6 +72,18 @@
0 replace_schedule_prestart
0 modify_unit_facing
#
# Pathfinding
#
0 store_locations_one
0 characterize_pathfinding_one
0 characterize_pathfinding_reach_1
0 characterize_pathfinding_reach_2
0 characterize_pathfinding_reach_3
0 characterize_pathfinding_reach_4
0 characterize_pathfinding_reach_5
0 characterize_pathfinding_reach_6
0 characterize_pathfinding_reach_7
#
# Attack calculations & codepath tests
#
0 test_grunt_tod_damage