import org.checkerframework.dataflow.qual.Deterministic;
import org.checkerframework.dataflow.qual.Pure;

// various tests for the checker to automatically suggest pure methods (most methods have been
// copied from Purity.java)

public class PuritySuggestionsClass {

  String f1, f2, f3;
  String[] a;

  // class with a (potentially) non-pure constructor
  private static class NonPureClass {
    String t;

    public NonPureClass() {
      t = "";
    }
  }

  // class with a pure constructor
  private static class PureClass {
    // :: warning: (purity.more.sideeffectfree)
    public PureClass() {}
  }

  // :: warning: (purity.more.pure)
  void nonpure() {}

  @Pure
  String pure() {
    return "";
  }

  String t3() {
    nonpure();
    return "";
  }

  // :: warning: (purity.more.pure)
  String t4() {
    pure();
    return "";
  }

  // :: warning: (purity.more.pure)
  int t5() {
    int i = 1;
    return i;
  }

  // :: warning: (purity.more.pure)
  int t6() {
    int j = 0;
    for (int i = 0; i < 10; i++) {
      j = j - i;
    }
    return j;
  }

  // :: warning: (purity.more.pure)
  String t7() {
    if (true) {
      return "a";
    }
    return "";
  }

  // :: warning: (purity.more.pure)
  int t8() {
    return 1 - 2 / 3 * 2 % 2;
  }

  // :: warning: (purity.more.pure)
  String t9() {
    return "b" + "a";
  }

  String t10() {
    f1 = "";
    f2 = "";
    return "";
  }

  String t11(PuritySuggestionsClass l) {
    l.a[0] = "";
    return "";
  }

  String t12(String[] s) {
    s[0] = "";
    return "";
  }

  String t13() {
    PureClass p = new PureClass();
    return "";
  }

  // :: warning: (purity.more.pure)
  String t14() {
    String i = "";
    i = "a";
    return i;
  }

  // :: warning: (purity.more.pure)
  String t15() {
    String[] s = new String[1];
    return s[0];
  }

  // :: warning: (purity.more.sideeffectfree)
  String t16() {
    try {
      int i = 1 / 0;
    } catch (Throwable t) {
      // ...
    }
    return "";
  }

  // :: warning: (purity.more.sideeffectfree)
  String t16b() {
    try {
      int i = 1 / 0;
    } catch (Throwable t) {
      // ...
    }
    return "";
  }

  // :: warning: (purity.more.sideeffectfree)
  String t16c() {
    try {
      int i = 1 / 0;
    } catch (Throwable t) {
      // ...
    }
    return "";
  }

  // :: warning: (purity.more.pure)
  String t17() {
    return "";
  }

  @Deterministic
  // :: warning: (purity.more.sideeffectfree)
  String t18() {
    return "";
  }

  // :: warning: (purity.more.deterministic)
  String t19() {
    return t18();
  }

  String t12() {
    NonPureClass p = new NonPureClass();
    return "";
  }
}
