@Grab('org.gcontracts:gcontracts-core:1.2.10') import org.gcontracts.annotations.* @Contracted @Invariant({ myspeed >= 0 }) class Rocket { boolean moving = false int myspeed = 0 @Requires({ !moving && myspeed == 0 }) void start() { moving = true } @Requires({ moving && myspeed == 0 }) void stop() { moving = false } @Requires({ moving }) @Ensures({ old.myspeed < myspeed }) void accelerate(Integer inc) { println ">>$inc" this.myspeed += inc ?: 1 } @Requires({ isStarted() }) @Ensures({ old.myspeed > myspeed }) void deccelerate(Integer inc) { println "<<$inc" this.myspeed -= inc ?: 1 } private boolean isStarted() { return moving } private int speed() { return myspeed } } def r = new Rocket() //r.accelerate() //THIS WOULD FAIL r.start() r.accelerate() println '==' + r.speed() r.accelerate(2) println '==' + r.speed() //r.accelerate(-2) //THIS WOULD FAIL r.deccelerate(2) println '==' + r.speed() //r.deccelerate(2) //THIS WOULD FAIL //r.stop() //THIS WOULD FAIL //r.start() //THIS WOULD FAIL r.deccelerate(1) r.stop() r.start() //r.deccelerate(1) //THIS WOULD FAIL r.stop()
see: http://groovyconsole.appspot.com/script/449003
No comments:
Post a Comment