mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-22 08:25:45 -07:00
Add a hacky environment variable that lets me arrange a soak-test of a
solver I've just modified, by forcing every game generation to be instantly followed by an attempt to re-solve the same game _description_ without the aux_info. I've hacked similar changes in to midend.c several times in the last couple of months for one reason or another, and it's about time I arranged not to have to recompile to do it! [originally from svn r9549]
This commit is contained in:
49
midend.c
49
midend.c
@ -429,6 +429,55 @@ void midend_new_game(midend *me)
|
|||||||
sfree(movestr);
|
sfree(movestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Soak test, enabled by setting <gamename>_TESTSOLVE in the
|
||||||
|
* environment. This causes an immediate attempt to re-solve the
|
||||||
|
* game without benefit of aux_info. The effect is that (at least
|
||||||
|
* on Unix) you can run 'FOO_TESTSOLVE=1 foo --generate 10000
|
||||||
|
* <params>#12345' and it will generate a lot of game ids and
|
||||||
|
* instantly pass each one back to the solver.
|
||||||
|
*
|
||||||
|
* (It's worth putting in an explicit seed in any such test, so
|
||||||
|
* you can repeat it to diagnose a problem if one comes up!)
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char buf[80];
|
||||||
|
int j, k;
|
||||||
|
static int doing_test_solve = -1;
|
||||||
|
if (doing_test_solve < 0) {
|
||||||
|
sprintf(buf, "%s_TESTSOLVE", me->ourgame->name);
|
||||||
|
for (j = k = 0; buf[j]; j++)
|
||||||
|
if (!isspace((unsigned char)buf[j]))
|
||||||
|
buf[k++] = toupper((unsigned char)buf[j]);
|
||||||
|
buf[k] = '\0';
|
||||||
|
if (getenv(buf)) {
|
||||||
|
/*
|
||||||
|
* Since this is used for correctness testing, it's
|
||||||
|
* helpful to have a visual acknowledgment that the
|
||||||
|
* user hasn't mistyped the environment variable name.
|
||||||
|
*/
|
||||||
|
fprintf(stderr, "Running solver soak tests\n");
|
||||||
|
doing_test_solve = TRUE;
|
||||||
|
} else {
|
||||||
|
doing_test_solve = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (doing_test_solve) {
|
||||||
|
game_state *s;
|
||||||
|
char *msg, *movestr;
|
||||||
|
|
||||||
|
msg = NULL;
|
||||||
|
movestr = me->ourgame->solve(me->states[0].state,
|
||||||
|
me->states[0].state,
|
||||||
|
NULL, &msg);
|
||||||
|
assert(movestr && !msg);
|
||||||
|
s = me->ourgame->execute_move(me->states[0].state, movestr);
|
||||||
|
assert(s);
|
||||||
|
me->ourgame->free_game(s);
|
||||||
|
sfree(movestr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
me->states[me->nstates].movestr = NULL;
|
me->states[me->nstates].movestr = NULL;
|
||||||
me->states[me->nstates].movetype = NEWGAME;
|
me->states[me->nstates].movetype = NEWGAME;
|
||||||
me->nstates++;
|
me->nstates++;
|
||||||
|
Reference in New Issue
Block a user