SE450: Examples [13/24] ![]() ![]() ![]() |
Some examples:
/**
* @invariant y >= 0
*/
public class Test {
private int y;
public static void main(String args[]) {
Test t = new Test();
t.run();
}
/**
* a simple non static test function
*/
void run() {
try {
for(int i = 2; i > -9; i-=3) {
this.command2(i);
}
} catch (Error e) {
// don't want to do a try/catch, just here so we
// can show it works!
e.printStackTrace();
}
try {
this.command("hey");
this.command(null); // throws an IllegalArumentException
} catch(Exception e) {
// don't need to catch this, it's a RuntimeException!
e.printStackTrace();
}
}
/**
* a command
* @pre arg != null
* @param arg a String arument
*/
public void command(String arg) {
if(arg == null) {
throw new IllegalArgumentException("arg can't be null");
}
System.out.println("arg set to " + arg);
// a little extra (y didn't change, but run it anyway)
assert(invariant() == true);
}
/**
* another command
* @post arg = arg@pre + 1
* @param arg an int to increment
*/
public void command2(int i) {
int i_old = i;
i++;
y += i; // so we can test invariant
System.out.println("i is " + i + ", y is " + y);
// post condition
assert(i == i_old + 1);
// invariant
assert(invariant() == true);
}
/**
* an example of an invariant method
* @return whether the class invariant has been violated
*/
boolean invariant() {
if(y < 0) {
return false;
}
return true;
}
}
When run from the command line, the above prints
D:\>java -ea -classpath . Test
i is 3, y is 3
i is 0, y is 3
i is -3, y is 0
i is -6, y is -6
java.lang.AssertionError
at Test.command2(Test.java:61)
at Test.run(Test.java:19)
at Test.main(Test.java:10)
arg set to hey
Exception in thread "main" java.lang.AssertionError
at Test.command(Test.java:47)
at Test.run(Test.java:28)
at Test.main(Test.java:10)
Note that the AssertionError won't show up unless assertions are enabled. (java -ea)
/**
* @invariant size() >= 0
*/
public interface Queue {
// commands
/**
* @post size() == size()@pre + 1
* @post elements().get( size() -1) == o
*/
public void add( Object o );
/**
* @pre size() >= 1
* @post size() == size()@pre - 1
* @post forall int i in 0 .. size() -1 |
* elements().get(i) ==
* elements()@pre.get(i + 1)
*
*/
public Object remove();
/**
* @post return == elements().size()
*/
public int size();
/**
* @pre size() >= 1
* @post @result == elements().get(0)
*/
public Object head();
/**
* Check if queue is empty - derived query
*
* @post @result == (size() == 0)
*/
public boolean isEmpty();
public Vector elements();
}