OOSC - JMSAssertOOSC - JMSAssert
Design By ContractDesign By Contract A powerful technique for writing reliable
software. Specifying the software purpose with the
implementation. Key elements:
Invariant Preconditions Postconditions
Design By ContractDesign By Contract Precondition – The constraints under
which the routine will function properly. Postconditions – The state of the class after
the routine execution The Contract: If you call routine R() with
the preconditions satisfied, R() will return satisfying the postconditions.
Invariant – Always holds
When are condition checked?When are condition checked?
Event InvariantPre-
conditionPost-
conditionInstance Method Y Y -Constructor N Y -Private Method N Y -Static Method N Y -Instance Method Y - YConstructor Y - YPrivate Method N - YStatic Method N - Y
Method Entry
Method Exit
JMS Syntax - InvariantJMS Syntax - Invariant Invariant - @inv May access all class members or its
direct/indirect bases, including private members
May appear in any JavaDoc comment Preferable in the class comment
JMS Syntax - PreconditionsJMS Syntax - Preconditions Precondition - @pre JavaDoc preceding the respective method May reference class members and
arguments Multiple @pre markers are conjugated
(AND)
JMS Syntax - PostconditionsJMS Syntax - Postconditions Postconditions - @post JavaDoc preceding the respective method May use $prev(expression) to access the
value at the method entry. May use $ret to denote method’s return
value Multiple @post markers are conjugated
(AND)
ExampleExample/** * @pre !isEmpty() * @post (top == $prev(top- 1)) * @post $ret == elems[top] * @post !isFull*/
public synchronized Object pop() {return elems[--top];
}
Precondition
Postconditions
JMS Syntax - GeneralJMS Syntax - General Order has no meaning @macro – for complicated conditions Recursion – as expected, on every call Inner classes can access outer classes’
members Anonymous classes – specify invariant in
one of its methods
JMSAssert InstallationJMSAssert Installation Run the jmssetup-1.02.exe installation file The following lines are added to the path:REM Next two lines are added by JMSAssertSET CLASSPATH=%CLASSPATH%;C:\PROGRA~1\JMSASS~1.0\bin\mmsclasses.jar;SET PATH=%PATH%;C:\PROGRA~1\JMSASS~1.0\bin; Copy the “classic” directory from
“..\jdk1.3.1\jre\bin\” to the directory:“C:\Program Files\JavaSoft\JRE\1.3\bin\”
Setup Setup (cont.)(cont.)
Your JavaSoft directory should look like:
If you use jdk 1.2.2, you will have a 1.2 directory
JMSAssert – how does it workJMSAssert – how does it work Annotate source code with assertions Compile your code using javac (as usual) Preprocess the code using jmsassert: creates
contract files (*.jms) and a Startup.jms file. *.jms files contain java code for the assertions. Execute using: jmsjava Startup <filename>to check assertions.
jmsjava makes sure method assertions are called before/after the method invocation.
JMS ExecutionJMS Execution “jmsassert” – generates help text “jmsassert –s <filename.java>” – generate
assertions for a class file “jmsassert –r –s .” – generate assertions for
all class files in the directory and sub-dirs. (use for packages)
“javac <filename.java>” – compile “jmsjava Startup <main>” - execute and check
assertions
Annotate source with assertions
Preprocess to generate assertion
filesJmsassert –s <file.java>
Compile Java file
javac <file.java<
Execute using jmsjava
MyStack.java
Startup.jms
default_MyStack.jmsdefault_MyStack_StackEnum.jms
MyStack.classMyStack$StackEnum.classMyStack$StackEnum.classJmsjava Startup <file.java> StackTest.class
Stack Demo Stack Demo filesfiles
Execution Execution processprocess
NotesNotes Execute these steps form the command line! Make sure your CLASSPATH environment
variable contains the current directory.Add “CLASSPATH=%CLASSPATH%;.;” to autoexec.bat.