import nz.ac.waikato.modeljunit.Action; import nz.ac.waikato.modeljunit.FsmModel; /** * An EFSM for Calculator3 * @author Erik Lindqvist * */ public class CalcFsm implements FsmModel{ public enum State { I, N, O, E}; private State mCurrentState; private int mBrackets = 0; private boolean bracketClosed = false; @Override public Object getState() { return mCurrentState; } public void reset(boolean arg0) { mCurrentState = State.I; mBrackets = 0; bracketClosed = false; } public int getBrackets(){ return mBrackets; } /* * Transitions from state I */ public boolean addDigitIGuard(){ return mCurrentState == State.I; } @Action public void addDigitI(){ mCurrentState = State.N; } public boolean openBracketIGuard(){ return mCurrentState == State.I; } @Action public void openBracketI(){ mBrackets++; mCurrentState = State.I; } public boolean opIGuard(){ return mCurrentState == State.I; } @Action public void opI(){ mCurrentState = State.E; } public boolean closeBracketIGuard(){ return mCurrentState == State.I; } @Action public void closeBracketI(){ mCurrentState = State.E; } /* * Transitions from state N * */ public boolean equalNGuard(){ return mCurrentState == State.N && mBrackets == 0; } @Action public void equalN(){ mCurrentState = State.I; bracketClosed = false; } public boolean closeBracketN1Guard(){ return mCurrentState == State.N && mBrackets > 0; } @Action public void closeBracketN1(){ bracketClosed = true; mCurrentState = State.N; mBrackets--; } public boolean closeBracketN2Guard(){ return mCurrentState == State.N && mBrackets <= 0; } @Action public void closeBracketN2(){ mCurrentState = State.E; } public boolean addDigitN1Guard(){ return mCurrentState == State.N && bracketClosed == false; } @Action public void addDigitN1(){ mCurrentState = State.N; } public boolean addDigitN2Guard(){ return mCurrentState == State.N && bracketClosed == true; } @Action public void addDigitN2(){ mCurrentState = State.E; bracketClosed = false; } public boolean pressOpNGuard(){ return mCurrentState == State.N; } @Action public void pressOpN(){ mCurrentState = State.O; bracketClosed = false; } public boolean openBracketNGuard(){ return mCurrentState == State.N; } @Action public void openBracketN(){ mCurrentState = State.E; } /* * Transitions from state O */ public boolean pressOpOGuard(){ return mCurrentState == State.O; } @Action public void pressOpO(){ mCurrentState = State.O; } public boolean addDigitOGuard(){ return mCurrentState == State.O; } @Action public void addDigitO(){ mCurrentState = State.N; } public boolean closeBracketOGuard(){ return mCurrentState == State.O; } @Action public void closeBracketO(){ mCurrentState = State.E; } public boolean openBracketOGuard(){ return mCurrentState == State.O; } @Action public void openBracketO(){ mCurrentState = State.I; mBrackets++; } /* * Transition from any state */ @Action public void pressReset(){ reset(true); } }