Software testing based on formal specifications: a theory and a tool | Synapse