blob: ab3a85701c3c3134f406a7f69c9586e014d8a9ee [file] [log] [blame]
import org.checkerframework.common.value.qual.*;
/** Test subtyping, LUB and annotation replacement in special cases. */
@SuppressWarnings("deprecation")
public class Basics {
public void boolTest() {
boolean a = false;
if (true) {
a = true;
}
@BoolVal({true, false}) boolean b = a;
// :: error: (assignment)
@BoolVal({false}) boolean c = a;
}
public void CharacterTest() {
Character a = 'a';
if (true) {
a = 'b';
}
@IntVal({'a', 'b'}) Character b = a;
// :: error: (assignment)
@IntVal({'a'}) Character c = a;
}
public void charTest() {
char a = 'a';
if (true) {
a = 'b';
}
@IntVal({'a', 'b'}) char b = a;
// :: error: (assignment)
@IntVal({'a'}) char c = a;
}
public void DoubleTest() {
Double a = new Double(0.0);
if (true) {
a = 2.0;
}
@DoubleVal({0, 2}) Double b = a;
// :: error: (assignment)
@DoubleVal({0}) Double c = a;
}
public void doubleTest() {
double a = 0.0;
if (true) {
a = 2.0;
}
@DoubleVal({0, 2}) double b = a;
// :: error: (assignment)
@DoubleVal({0}) double c = a;
}
public void FloatTest() {
Float a = new Float(0.0f);
if (true) {
a = 2.0f;
}
@DoubleVal({0, 2}) Float b = a;
// :: error: (assignment)
@DoubleVal({0}) Float c = a;
}
public void floatTest() {
float a = 0.0f;
if (true) {
a = 2.0f;
}
@DoubleVal({0, 2}) float b = a;
// :: error: (assignment)
@DoubleVal({'a'}) float c = a;
}
public void IntegerTest(
@IntRange(from = 3, to = 4) Integer x, @IntRange(from = 20, to = 30) Integer y) {
Integer a;
/* IntVal + IntVal */
a = new Integer(0);
if (true) {
a = 2;
}
// :: error: (assignment)
@IntVal({0}) Integer test1 = a;
@IntVal({0, 2}) Integer test2 = a;
/* IntRange + IntRange */
a = x;
@IntVal({3, 4}) Integer test3 = a;
if (true) {
a = y;
}
@IntRange(from = 15, to = 30)
// :: error: (assignment)
Integer test4 = a;
@IntRange(from = 3, to = 30) Integer test5 = a;
/* IntRange + IntVal */
a = new Integer(0);
if (true) {
a = x;
}
@IntRange(from = 0, to = 4) Integer test7 = a;
/* IntRange (Wider than 10) + IntVal */
a = new Integer(0);
if (true) {
a = y;
}
@IntRange(from = 1, to = 30)
// :: error: (assignment)
Integer test8 = a;
@IntRange(from = 0, to = 30) Integer test9 = a;
}
public void intTest(@IntRange(from = 3, to = 4) int x, @IntRange(from = 20, to = 30) int y) {
int a;
/* IntVal + IntVal */
a = 0;
if (true) {
a = 2;
}
// :: error: (assignment)
@IntVal({0}) int test1 = a;
@IntVal({0, 2}) int test2 = a;
/* IntRange + IntRange */
a = x;
@IntVal({3, 4}) int test3 = a;
if (true) {
a = y;
}
@IntRange(from = 15, to = 30)
// :: error: (assignment)
int test4 = a;
@IntRange(from = 3, to = 30) int test5 = a;
/* IntRange + IntVal */
a = 0;
if (true) {
a = x;
}
@IntRange(from = 0, to = 4) int test7 = a;
/* IntRange (Wider than 10) + IntVal */
a = 0;
if (true) {
a = y;
}
@IntRange(from = 1, to = 30)
// :: error: (assignment)
int test8 = a;
@IntRange(from = 0, to = 30) int test9 = a;
}
public void intCastTest(@IntVal({0, 1}) int input) {
@IntVal({0, 1}) int c = (int) input;
@IntVal({0, 1}) int ac = (@IntVal({0, 1}) int) input;
@IntVal({0, 1, 2}) int sc = (@IntVal({0, 1, 2}) int) input;
// :: warning: (cast.unsafe)
@IntVal({1}) int uc = (@IntVal({1}) int) input;
// :: warning: (cast.unsafe)
@IntVal({2}) int bc = (@IntVal({2}) int) input;
}
public void IntDoubleTest(
@IntVal({0, 1}) int iv,
@IntRange(from = 2, to = 3) int ir,
@IntRange(from = 2, to = 20) int irw,
@DoubleVal({4.0, 5.0}) double dv1) {
double a;
/* IntVal + DoubleVal */
a = iv;
if (true) {
a = dv1;
}
// :: error: (assignment)
@DoubleVal({4.0, 5.0}) double test1 = a;
@DoubleVal({0.0, 1.0, 2.0, 3.0, 4.0, 5.0}) double test2 = a;
/* IntRange + DoubleVal */
a = ir;
// :: error: (assignment)
@DoubleVal({2.0}) double test3 = a;
@DoubleVal({2.0, 3.0}) double test4 = a;
if (true) {
a = dv1;
}
// :: error: (assignment)
test1 = a;
test2 = a;
/* IntRange (Wider than 10) + DoubleVal */
a = irw;
if (true) {
a = dv1;
}
// :: error: (assignment)
@DoubleVal({4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double test5 = a;
@UnknownVal double test6 = a;
}
public void stringTest() {
String a = "test1";
if (true) {
a = "test2";
}
@StringVal({"test1", "test2"}) String b = a;
// :: error: (assignment)
@StringVal({"test1"}) String c = a;
}
public void stringCastTest() {
Object a = "test1";
@StringVal({"test1"}) String b = (String) a;
@StringVal({"test1"}) String c = (java.lang.String) b;
}
void tooManyValuesInt() {
// :: warning: (too.many.values.given.int)
@IntVal({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 100}) int a = 20; // This should succeed if a is treated as @IntRange(from=1, to=100)
// :: warning: (too.many.values.given.int)
@IntVal({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12})
// :: error: (assignment)
int b = 20; // d is @IntRange(from=1, to=12)
@UnknownVal int c = a; // This should always succeed
}
void fromGreaterThanTo() {
// :: error: (from.greater.than.to)
@IntRange(from = 2, to = 0)
// :: error: (assignment)
int a = 1; // a should be @BottomVal
@IntRange(from = 1) int b = 2;
@IntRange(to = 2) int c = 1;
@IntRange(to = 2, from = 0) int d = 1;
}
void tooManyValuesDouble() {
// :: warning: (too.many.values.given)
@DoubleVal({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double a = 8.0;
@UnknownVal double b = a; // This should always succeed
@UnknownVal double c = 0;
a = c; // This should succeed if a is treated as @UnknownVal
// :: warning: (too.many.values.given)
@DoubleVal({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double d = 8.0;
d = 2.0 * d; // This should succeed since d is @UnknownVal
}
void tooManyValuesString() {
// :: warning: (too.many.values.given)
@StringVal({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}) String a = "h";
@UnknownVal String b = a; // This should always succeed
@UnknownVal String c = "";
// :: error: (assignment)
a = c; // This should not succeed if a is treated as @ArrayLen(1)
@ArrayLen(1) String al = a; // a is @ArrayLen(1)
// :: warning: (too.many.values.given)
@StringVal({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}) String d = "h";
// :: error: (assignment)
d = "b" + d; // This should not succeed since d is @ArrayLen(1)
@ArrayLen(1) String dl = d; // d is @ArrayLen(1)
}
}