import java.util.*;
import checkers.util.test.*;
class Poly {
void test() {
@Encrypted String s = encrypt("as0d78f9(*#4j");
String t = "foo";
@Encrypted String x1 = id(s); // valid
//:: (assignment.type.incompatible)
@Encrypted String x2 = id(t); // error
String x3 = id(s); // valid
String x4 = id(t); // valid
@Encrypted String y01 = combine(s, s); // valid
//:: (assignment.type.incompatible)
@Encrypted String y02 = combine(s, t); // error
//:: (assignment.type.incompatible)
@Encrypted String y03 = combine(t, t); // error
String y11 = combine(s, s); // valid
String y12 = combine(s, t); // valid
String y13 = combine(t, t); // valid
}
@PolyEncrypted String id(@PolyEncrypted String s) {
return s;
}
@PolyEncrypted String combine(@PolyEncrypted String s, @PolyEncrypted String t) {
//:: (argument.type.incompatible)
sendOverNet(s); // error
return s;
}
void sendOverNet(@Encrypted String msg) {
}
List<@PolyEncrypted String> duplicate(@PolyEncrypted String s) {
return null;
}
@PolyEncrypted String[] duplicateAsArray(@PolyEncrypted String s) {
return null;
}
void test2() {
@Encrypted String s = encrypt("p9aS*7dfa0w9e84r");
List<@Encrypted String> lst = duplicate(s);
@Encrypted String[] arr = duplicateAsArray(s);
}
@PolyEncrypted String substitute(Map<String, ? extends @PolyEncrypted String> map) {
return encrypt(null);
}
void test3() {
//:: (assignment.type.incompatible)
@Encrypted String s = substitute(new HashMap<String, String>());
@Encrypted String t = substitute(new HashMap<String, @Encrypted String>());
}
// Test assignment to poly
@PolyEncrypted String test4(@PolyEncrypted String s) {
if (s == null)
return encrypt(null); // valid
else
//:: (return.type.incompatible)
return "m"; // invalid
}
@SuppressWarnings("encrypted")
static @Encrypted String encrypt(String s) {
return (@Encrypted String) s;
}
}