Registro de cambios de estado en boost :: statechart

Para las pruebas unitarias, intento registrar todas las transacciones estatales después de iniciar un evento de máquina de estado.
Por ejemplo, si publico el evento A en el Fifo_scheduler de un async_state_machine, la máquina de estado pasará por los estados B, C y luego volverá a D. Sin poder registrar todos los estados del evento, solo puedo verificar que pasó al estado D después de se hizo al hacer una prueba unitaria :-(

Lo único que se me ocurre es modificar todos los métodos de reacción o constructores de todos los estados que creo (derivados de simple_state) para que hagan la grabación. Esto parece un poco complicado cuando realmente quiero conectarme a async_state_machine justo antes de que llame al método react () de un estado ...

preguntado el 16 de mayo de 11 a las 19:05

2 Respuestas

Esto parece un poco complicado cuando realmente quiero conectarme a async_state_machine justo antes de que llame al método react () de un estado ...

¿Por qué no lo haces tú? Crea una nueva clase que se extienda async_state_machine y agregue los ganchos que desee. Si el acceso es un problema (probablemente lo será), haga lo espectacular #define private public (o protected hackear antes de incluir statechart.

Hice algo similar para agregar variables locales al historial de un estado y agregar un nuevo tipo de state-ctor para tener un historial completo real.

contestado el 17 de mayo de 11 a las 08:05

Gracias, Kitsune. Ese es un buen truco alternativo. Todavía bastante hackish. Parece que el Statechart de Boost debería rediseñarse para que pueda obtener esta información más fácilmente. Si hiciste esta fea solución, parece que otros también querrán ... - Kenyee

Se agregó un truco diferente. Cada estado se crea antes de que lo use la máquina de estado de impulso (luego se destruye después de que pasa al siguiente estado ... parece tan ineficiente), por lo que cada estado se derivó de otra clase que tiene una devolución de llamada en su constructor. Todavía parece un poco hacker ... desearía que boost ++ tuviera una forma más limpia de hacer esto :-P

contestado el 18 de mayo de 11 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.