blob: 41a185e004b4f455b31af37de2950c5b333d3b4e [file] [log] [blame]
import org.checkerframework.checker.calledmethods.qual.*;
/** Test for postcondition support via @EnsureCalledMethods. */
public class Postconditions {
void build(@CalledMethods({"a", "b", "c"}) Postconditions this) {}
void a() {}
void b() {}
void c() {}
@EnsuresCalledMethods(value = "#1", methods = "b")
static void callB(Postconditions x) {
x.b();
}
@EnsuresCalledMethods(value = "#1", methods = "b")
// :: error: contracts.postcondition
static void doesNotCallB(Postconditions x) {}
@EnsuresCalledMethods(
value = "#1",
methods = {"b", "c"})
static void callBAndC(Postconditions x) {
x.b();
x.c();
}
static void allInOneMethod() {
Postconditions y = new Postconditions();
y.a();
y.b();
y.c();
y.build();
}
static void invokeCallB() {
Postconditions y = new Postconditions();
y.a();
callB(y);
y.c();
y.build();
}
static void invokeCallBLast() {
Postconditions y = new Postconditions();
y.a();
y.c();
callB(y);
y.build();
}
static void invokeCallBAndC() {
Postconditions y = new Postconditions();
y.a();
callBAndC(y);
y.build();
}
static void invokeCallBAndCWrong() {
Postconditions y = new Postconditions();
callBAndC(y);
// :: error: finalizer.invocation
y.build();
}
@EnsuresCalledMethodsIf(
expression = "#1",
methods = {"a", "b", "c"},
result = true)
static boolean ensuresABCIfTrue(Postconditions p, boolean b) {
if (b) {
p.a();
p.b();
p.c();
return true;
}
return false;
}
static void testEnsuresCalledMethodsIf(Postconditions p, boolean b) {
if (ensuresABCIfTrue(p, b)) {
p.build();
} else {
// :: error: finalizer.invocation
p.build();
}
}
@EnsuresCalledMethods(value = "#1", methods = "a")
static void callWithException(Postconditions p) {
try {
p.a();
throw new java.io.IOException();
} catch (java.io.IOException e) {
}
}
}