import junit.framework.Assert; import nz.ac.waikato.modeljunit.Action; import nz.ac.waikato.modeljunit.AllRoundTester; import nz.ac.waikato.modeljunit.GreedyTester; import nz.ac.waikato.modeljunit.LookaheadTester; import nz.ac.waikato.modeljunit.RandomTester; import nz.ac.waikato.modeljunit.Tester; import nz.ac.waikato.modeljunit.VerboseListener; import nz.ac.waikato.modeljunit.coverage.ActionCoverage; import nz.ac.waikato.modeljunit.coverage.StateCoverage; import nz.ac.waikato.modeljunit.coverage.TransitionCoverage; /** * An adapter for the Calculator3 EFSM * @author Erik Lindqvist * */ public class CalcAdapter extends CalcFsm{ private Calculator3 sut_; public CalcAdapter(Calculator3 sut) { sut_ = sut; } @Override public Object getState() { return super.getState(); } @Override public void reset(boolean arg0) { super.reset(arg0); sut_.pressReset(); } /* * Transitions from state I */ @Action public void addDigitI() { super.addDigitI(); sut_.pressDigit('2'); checkSut(); } @Action public void openBracketI() { super.openBracketI(); sut_.pressOpenBracket(); checkSut(); } @Action public void closeBracketI() { super.closeBracketI(); sut_.pressCloseBracket(); checkSut(); } @Action public void opI() { super.opI(); sut_.pressPlus(); checkSut(); } /* * Transitions from state N */ @Action public void addDigitN1() { super.addDigitN1(); sut_.pressDigit('1'); checkSut(); } @Action public void addDigitN2() { super.addDigitN2(); sut_.pressDigit('4'); checkSut(); } @Action public void openBracketN() { super.openBracketN(); sut_.pressOpenBracket(); checkSut(); } @Action public void closeBracketN1() { super.closeBracketN1(); sut_.pressCloseBracket(); checkSut(); } @Action public void closeBracketN2() { super.closeBracketN2(); sut_.pressCloseBracket(); checkSut(); } @Action public void pressOpN() { super.pressOpN(); sut_.pressPlus(); checkSut(); } @Action public void equalN() { super.equalN(); sut_.pressEqual(); checkSut(); } /* * Transitions from state O */ @Action public void pressOpO() { super.pressOpO(); sut_.pressMinus(); } @Action public void addDigitO() { super.addDigitO(); sut_.pressDigit('5'); checkSut(); } @Action public void closeBracketO() { super.closeBracketO(); sut_.pressCloseBracket(); checkSut(); } @Action public void openBracketO() { super.openBracketO(); sut_.pressOpenBracket(); checkSut(); } /* * Transition from any state */ @Action public void pressReset() { super.pressReset(); sut_.pressReset(); } /* * Adapter methods */ /** * Checks that the SUT and model states are equal */ private void checkSut(){ State model = (State) getState(); State sut = getSutState(); Assert.assertTrue("States are not equal! model: "+model+" sut: "+sut, ((State) getState()) == getSutState()); } /** * Returns the state of the SUT * * @return the SUT state. */ private State getSutState(){ String state = sut_.CalcState(); if (state.compareTo("I") == 0) { return State.I; } else if (state.compareTo("N") == 0){ return State.N; } else if (state.compareTo("O") == 0){ return State.O; } else if (state.compareTo("E") == 0){ return State.E; } else { return State.E; } } public static void main(String[] args) { Calculator3 sut = new Calculator3(); //Tester tester = new RandomTester(new CalcAdapter(sut)); //Tester tester = new AllRoundTester(new CalcAdapter(sut)); //Tester tester = new GreedyTester(new CalcAdapter(sut)); Tester tester = new LookaheadTester(new CalcAdapter(sut)); tester.buildGraph(); tester.addListener(new VerboseListener()); tester.addCoverageMetric(new TransitionCoverage()); tester.addCoverageMetric(new StateCoverage()); tester.addCoverageMetric(new ActionCoverage()); tester.generate(20); tester.printCoverage(); } }