package org.jmlspecs.openjmltest.testcases;
import org.jmlspecs.openjmltest.TCBase;
import org.junit.Test;
/** Tests the parsing and type-checking of assignable clauses */
public class assignable extends TCBase {
@Override
public void setUp() throws Exception {
// noCollectDiagnostics = true;
// jmldebug = true;
super.setUp();
}
@Test
public void testAssignableNothing() {
helpTC(" class A { int k; boolean b; \n//@ assignable \\nothing;\n void m(){} }");
}
@Test
public void testAssignableEverything() {
helpTC(" class A { int k; boolean b; \n//@ assignable \\everything;\n void m(){} }");
}
@Test
public void testAssignableIdent() {
helpTC(" class A { int k; boolean b; \n//@ assignable k;\n void m(){} }");
}
@Test
public void testAssignableBadIdent() {
helpTC(" class A { int k; boolean b; \n//@ assignable m;\n void m(){} }",
"/TEST.java:2: cannot find symbol\n symbol: variable m\n location: class A",16);
}
@Test
public void testAssignableField() {
helpTC(" class A { int k; boolean b; Object o; \n//@ assignable A.k;\n void m(){} }"
,"/TEST.java:2: non-static variable k cannot be referenced from a static context",17
);
}
@Test
public void testAssignableField1() {
helpTC(" class A { int k; boolean b; Object o; \n//@ assignable o.*;\n void m(){} }");
}
@Test
public void testAssignableField2() {
helpTC(" class A { class B { int p; } int k; boolean b; Object o; B bb; \n//@ assignable bb.p;\n void m(){} }");
}
@Test
public void testAssignableField3() {
helpTC(" class A { class B { int p; } int k; boolean b; Object o; B bb; \n//@ assignable bb.*;\n void m(){} }");
}
@Test
public void testAssignableField4() {
helpTC(" class A { int k; boolean b; Object o; \n//@ assignable A.*;\n void m(){} }");
}
@Test
public void testAssignableArray() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable k[0],k[*],k[2 .. 3], k[3 ..], k[3 .. *];\n void m(){} }");
}
@Test
public void testAssignableArray1() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable k[2.. 3], k[3..], k[3.. *];\n void m(){} }");
}
@Test
public void testAssignableArray2() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable o[0],o[*],o[2 .. 3], o[3 ..], o[3 .. *];\n void m(){} }");
}
@Test
public void testAssignableArray3() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable o[2.. 3], o[3..], o[3.. *];\n void m(){} }");
}
@Test
public void testAssignableArray3a() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable o[(i-1)..(i+1)], o[(i+1)..], o[(i+1).. *];\n void m(int i){} }");
}
@Test
public void testAssignableDots() {
helpTC(" class A { int[] k; boolean b; Object[] o; \n//@ assignable o[2..3], o[2..*];\n void m(){} }");
}
@Test
public void testAssignableArray4() {
helpTCF("A.java","public class A { int[] k; boolean b; Object[] o; \n//@ assignable k[true],k[true .. false], k[false ..], k[false .. *];\n void m() {} }"
,"/A.java:2: incompatible types: boolean cannot be converted to int",18
,"/A.java:2: incompatible types: boolean cannot be converted to int",26
,"/A.java:2: incompatible types: boolean cannot be converted to int",34
,"/A.java:2: incompatible types: boolean cannot be converted to int",44
,"/A.java:2: incompatible types: boolean cannot be converted to int",57
);
}
@Test
public void testAssignableArray5() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable k[b];\n void m(boolean b) {} }"
,"/A.java:2: incompatible types: boolean cannot be converted to int",18
);
}
@Test
public void testAssignableThis() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable this.k, this.*;\n void m(boolean b) {} }"
);
}
@Test
public void testAssignableThis2() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable this.x;\n void m(boolean b) {} }"
,"/A.java:2: cannot find symbol\n symbol: variable x",20
);
}
@Test
public void testAssignableSuper() {
helpTCF("A.java","public class A extends B { int[] k; Object b; Object[] o; \n//@ assignable super.kk, super.*;\n void m(boolean b) {} } class B{ int kk; }"
);
}
@Test
public void testAssignableSuper2() {
helpTCF("A.java","public class A extends B { int[] k; Object b; Object[] o; \n//@ assignable super.b, super.x;\n void m(boolean b) {} } class B{ int kk; }"
,"/A.java:2: cannot find symbol\n symbol: variable b",21
,"/A.java:2: cannot find symbol\n symbol: variable x",30
);
}
@Test
public void testAssignableBad() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable this, super;\n void m(boolean b) {} }"
,"/A.java:2: A this or super token must be followed by a field selection",16
,"/A.java:2: A this or super token must be followed by a field selection",22
);
}
@Test
public void testAssignableBad2() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable k[, k[*, k[i, k[], b., this., super.;\n void m(boolean b) {} }"
,"/A.java:2: illegal start of expression",18
,"/A.java:2: An invalid expression or succeeding token near here",18
,"/A.java:2: Expected a right bracket after the star",23
,"/A.java:2: An invalid expression or succeeding token near here",28
,"/A.java:2: illegal start of expression",32
,"/A.java:2: Expected an identifier or star after the dot",37
,"/A.java:2: Expected an identifier or star after the dot",44
,"/A.java:2: A this or super token must be followed by a field selection",39
,"/A.java:2: Expected an identifier or star after the dot",52
,"/A.java:2: A this or super token must be followed by a field selection",46
,"/A.java:2: An assignable clause may not contain method formal parameters: b",35
);
}
@Test
public void testAssignableBad2a() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable super.;\n void m(boolean b) {} }"
,"/A.java:2: Expected an identifier or star after the dot",22
,"/A.java:2: A this or super token must be followed by a field selection",16
);
}
@Test
public void testAssignableBad2b() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable this.;\n void m(boolean b) {} }"
,"/A.java:2: Expected an identifier or star after the dot",21
,"/A.java:2: A this or super token must be followed by a field selection",16
);
}
@Test
public void testAssignableBad2c() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable super;\n void m(boolean b) {} }"
,"/A.java:2: A this or super token must be followed by a field selection",16
);
}
@Test
public void testAssignableBad2d() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable this;\n void m(boolean b) {} }"
,"/A.java:2: A this or super token must be followed by a field selection",16
);
}
@Test
public void testAssignableBad3() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable k b, this.;\n void m(boolean b) {} }"
,"/A.java:2: Missing comma or otherwise ill-formed type name",18
,"/A.java:2: Expected an identifier or star after the dot",26
,"/A.java:2: A this or super token must be followed by a field selection",21
,"/A.java:2: An assignable clause may not contain method formal parameters: b",18
);
}
@Test
public void testAssignableBad4() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable ;\n void m(boolean b) {} }"
,"/A.java:2: Use \\nothing to denote an empty list of locations in an assignable clause",16
);
}
@Test
public void testAssignableBad5() {
helpTCF("A.java","public class A { int[] k; Object b; Object[] o; \n//@ assignable .;\n void m(boolean b) {} }"
,"/A.java:2: Incorrectly formed or terminated store-reference near here",16
,"/A.java:2: Use \\nothing to denote an empty list of locations in an assignable clause",17
);
}
@Test
public void testAssignableBad6() {
helpTCF("A.java","public class A { int k; \n//@ assignable k[*], this.*.x;\n void m(boolean b) {} }"
,"/A.java:2: Further selection is not permitted after a wild-card field",28
,"/A.java:2: The expression preceding the array element selection does not have array type: int",16
);
}
@Test
public void testAssignableArray9() {
helpTCF("A.java","public class A { B[] o; \n//@ assignable o[*].kk;\n void m(boolean b) {} } class B{ int kk; }"
);
}
@Test
public void testAssignableNoSemi() {
helpTCF("A.java","public class A { B[] o; \n//@ assignable o\n void m(boolean b) {} } class B{ int kk; }"
,"/A.java:2: Invalid expression or missing semicolon here",17
);
}
@Test
public void testAssignableConstructor1() {
helpTCF("A.java","public class A { \n"
+" private int i;\n"
+" //@ assignable i;\n"
+" public A() { i = 0; }\n"
+" //@ assignable \\everything;\n"
+" public static void m() { new A(); }\n"
+"}"
,"/A.java:3: An identifier with private visibility may not be used in a assignable clause with public visibility",18
);
}
@Test
public void testAssignableConstructor2() {
helpTCF("A.java","public class A { \n"
+" private int i;\n"
+" //@ assignable \\nothing;\n"
+" public A() { i = 0; }\n"
+" //@ assignable \\everything;\n"
+" public static void m() { new A(); }\n"
+"}"
);
}
@Test
public void testAssignableConstructor3() {
helpTCF("A.java","public class A { \n"
+" private int i;\n"
+" \n" // default assignable with no spec case
+" public A() { i = 0; }\n"
+" //@ assignable \\everything;\n"
+" public static void m() { new A(); }\n"
+"}"
);
}
@Test
public void testAssignableConstructor4() {
helpTCF("A.java","public class A { \n"
+" private int i;\n"
+" //@ requires true; \n" // default assignable
+" public A() { i = 0; }\n"
+" //@ assignable \\everything;\n"
+" public static void m() { new A(); }\n"
+"}"
);
}
@Test
public void testAccessibleIdent() {
helpTC(" class A { int k; boolean b; \n//@ accessible k;\n void m(){} }");
}
@Test
public void testAccessibleBadIdent() {
helpTC(" class A { int k; boolean b; \n//@ accessible m;\n void m(){} }",
"/TEST.java:2: cannot find symbol\n symbol: variable m\n location: class A",16);
}
@Test
public void testCapturesIdent() {
helpTC(" class A { int k; boolean b; \n//@ captures k;\n void m(){} }");
}
@Test
public void testCapturesBadIdent() {
helpTC(" class A { int k; boolean b; \n//@ captures m;\n void m(){} }",
"/TEST.java:2: cannot find symbol\n symbol: variable m\n location: class A",14);
}
}