// 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);
  }
}
