blob: c5164b5133c4bec6a98d57d4754e7a40ccc45946 [file] [log] [blame]
// Tests suport for index annotations applied to CharSequence and related indices.
import java.io.IOException;
import java.io.StringWriter;
import org.checkerframework.checker.index.qual.IndexFor;
import org.checkerframework.checker.index.qual.IndexOrHigh;
import org.checkerframework.common.value.qual.MinLen;
import org.checkerframework.common.value.qual.StringVal;
public class CharSequenceTest {
// Tests that minlen is correctly applied to CharSequence assigned from String, but not
// StringBuilder
void minLenCharSequence() {
@MinLen(10) CharSequence str = "0123456789";
// :: error: (assignment)
@MinLen(10) CharSequence sb = new StringBuilder("0123456789");
}
// Tests the subSequence method
void testSubSequence() {
// Local variable used because of https://github.com/kelloggm/checker-framework/issues/165
String str = "0123456789";
str.subSequence(5, 8);
// :: error: (argument)
str.subSequence(5, 13);
}
// Dummy method that takes a CharSequence and its index
void sink(CharSequence cs, @IndexOrHigh("#1") int i) {}
// Tests passing sequences as CharSequence
void argumentPassing() {
String s = "0123456789";
sink(s, 8);
StringBuilder sb = new StringBuilder("0123456789");
// :: error: (argument)
sink(sb, 8);
}
// Tests forwardning sequences as CharSequence
void agumentForwarding(String s, @IndexOrHigh("#1") int i) {
sink(s, i);
}
// Tests concatenation of CharSequence and String
void concat() {
CharSequence a = "a";
@StringVal({"nullb", "ab"}) CharSequence ab = a + "b";
sink(ab, 2);
}
// Tests that length retrieved from CharSequence can be used as an index
void getLength(CharSequence cs, int i) {
if (i >= 0 && i < cs.length()) {
cs.charAt(i);
}
@IndexOrHigh("cs") int l = cs.length();
}
void testCharAt(CharSequence cs, int i, @IndexFor("#1") int j) {
cs.charAt(j);
cs.subSequence(j, j);
// :: error: (argument)
cs.charAt(i);
// :: error: (argument)
cs.subSequence(i, j);
}
void testAppend(Appendable app, CharSequence cs, @IndexFor("#2") int i) throws IOException {
app.append(cs, i, i);
// :: error: (argument)
app.append(cs, 1, 2);
}
void testAppend(StringWriter app, CharSequence cs, @IndexFor("#2") int i) throws IOException {
app.append(cs, i, i);
// :: error: (argument)
app.append(cs, 1, 2);
}
}