import java.util.HashMap;
import java.util.List;
import java.util.Map;
import testlib.util.*;
class Poly {
void test() {
@Encrypted String s = encrypt("as0d78f9(*#4j");
String t = "foo";
@Encrypted String x1 = id(s); // valid
//:: error: (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
//:: error: (assignment.type.incompatible)
@Encrypted String y02 = combine(s, t); // error
//:: 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) {
//:: error: (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);
}
@PolyEncrypted String substituteSuper(Map<String, ? super @PolyEncrypted String> map) {
return encrypt(null);
}
void test3() {
//:: error: (assignment.type.incompatible)
@Encrypted String s = substitute(new HashMap<String, String>());
@Encrypted String t = substitute(new HashMap<String, @Encrypted String>());
//:: error: (assignment.type.incompatible)
@Encrypted String q = substituteSuper(new HashMap<String, String>());
@Encrypted String r = substituteSuper(new HashMap<String, @Encrypted String>());
}
// Test assignment to poly
@PolyEncrypted String test4(@PolyEncrypted String s) {
if (s == null) {
return encrypt(null); // valid
} else {
//:: error: (return.type.incompatible)
return "m"; // invalid
}
}
@SuppressWarnings("encrypted")
static @Encrypted String encrypt(String s) {
return (@Encrypted String) s;
}
}