/** * In case you are curious: this treats the FSM like a recognizer. It * resets the FSM to a default state and then processes each character * in the input string. If at the end of the string it is in an * accepting state, it means the FSM matched that string. * * the 'exp' param tells us if we actually expect it to recognize it. * * the 'is_bogus' param tells us if we expect the FSM to go into a * terminally bogus state, meaning it absolutely won't recognize the * input, no matter what comes next. * * It is possible for it to be in an unaccepted state without being * bogus. For example the string "BA" is not accepted, but if the next * character is "G", then the FSM would be in an accepted state. **/ void recognize(FSM& fsm, string input, bool exp, bool is_bogus) { fsm.setState(fsm.getDefaultState()); State* st; st = fsm.getState(fsm.getCurrentState()); if (st == NULL) { IsTrue("Null", false, "Current State is NULL"); return; } // cout << "Initial state: " << st << endl; string::iterator it = input.begin(); for(; it != input.end(); it++) { char c = *it; int sig = (int) c; fsm.handleSignal(sig); st = fsm.getState(fsm.getCurrentState()); // cout << "After " << c << ", current state: " << st << endl; } IsTrue(input, fsm.isAcceptState() == exp, "Wrong Accept State"); if (is_bogus) { st = fsm.getState(fsm.getCurrentState()); IsTrue("Bogus", st->label == "Bogus State", "Should be in Bogus state"); } }
} SUITE_BEGIN("Finite State Machines") TEST_BEGIN("Defaults") { FSM fsm; int current = fsm.getCurrentState(); IsTrue("Current State", current == -1, "Default current state should be -1"); bool accept = fsm.isAcceptState(); IsTrue("Accept", accept == false, "Default accept state should be false"); State* bogus = fsm.getState(0); IsTrue("State", bogus == NULL, "Default getState should give NULL"); int defstate = fsm.getDefaultState(); IsTrue("DefState", defstate == -1, "Default default state should be -1"); bool handle = fsm.handleSignal(0); IsTrue("Handle Signal", handle == false, "Default fsm should not be able to handle signals"); bool numStates = fsm.countStates(); IsTrue("NumStates", numStates == 0, "Default num states should be 0"); bool numTrans = fsm.countTransitions(); IsTrue("NumTrans", numTrans == 0, "Default num transitions should be 0"); } TEST_END TEST_BEGIN("Add States") { FSM fsm; int even = fsm.addState("even", true); int odd = fsm.addState("odd"); IsTrue("Non-Negative IDs", (even >= 0 && odd >= 0),