import org.checkerframework.common.value.qual.*;

/** Test subtyping, LUB and annotation replacement in special cases. */
@SuppressWarnings("deprecation")
public class Basics {

  public void boolTest() {
    boolean a = false;
    if (true) {
      a = true;
    }
    @BoolVal({true, false}) boolean b = a;

    // :: error: (assignment)
    @BoolVal({false}) boolean c = a;
  }

  public void CharacterTest() {
    Character a = 'a';
    if (true) {
      a = 'b';
    }
    @IntVal({'a', 'b'}) Character b = a;

    // :: error: (assignment)
    @IntVal({'a'}) Character c = a;
  }

  public void charTest() {
    char a = 'a';
    if (true) {
      a = 'b';
    }
    @IntVal({'a', 'b'}) char b = a;

    // :: error: (assignment)
    @IntVal({'a'}) char c = a;
  }

  public void DoubleTest() {
    Double a = new Double(0.0);
    if (true) {
      a = 2.0;
    }
    @DoubleVal({0, 2}) Double b = a;

    // :: error: (assignment)
    @DoubleVal({0}) Double c = a;
  }

  public void doubleTest() {
    double a = 0.0;
    if (true) {
      a = 2.0;
    }
    @DoubleVal({0, 2}) double b = a;

    // :: error: (assignment)
    @DoubleVal({0}) double c = a;
  }

  public void FloatTest() {
    Float a = new Float(0.0f);
    if (true) {
      a = 2.0f;
    }
    @DoubleVal({0, 2}) Float b = a;

    // :: error: (assignment)
    @DoubleVal({0}) Float c = a;
  }

  public void floatTest() {
    float a = 0.0f;
    if (true) {
      a = 2.0f;
    }
    @DoubleVal({0, 2}) float b = a;

    // :: error: (assignment)
    @DoubleVal({'a'}) float c = a;
  }

  public void IntegerTest(
      @IntRange(from = 3, to = 4) Integer x, @IntRange(from = 20, to = 30) Integer y) {
    Integer a;

    /* IntVal + IntVal */
    a = new Integer(0);
    if (true) {
      a = 2;
    }
    // :: error: (assignment)
    @IntVal({0}) Integer test1 = a;
    @IntVal({0, 2}) Integer test2 = a;

    /* IntRange + IntRange */
    a = x;
    @IntVal({3, 4}) Integer test3 = a;
    if (true) {
      a = y;
    }
    @IntRange(from = 15, to = 30)
    // :: error: (assignment)
    Integer test4 = a;
    @IntRange(from = 3, to = 30) Integer test5 = a;

    /* IntRange + IntVal */
    a = new Integer(0);
    if (true) {
      a = x;
    }
    @IntRange(from = 0, to = 4) Integer test7 = a;

    /* IntRange (Wider than 10) + IntVal */
    a = new Integer(0);
    if (true) {
      a = y;
    }
    @IntRange(from = 1, to = 30)
    // :: error: (assignment)
    Integer test8 = a;
    @IntRange(from = 0, to = 30) Integer test9 = a;
  }

  public void intTest(@IntRange(from = 3, to = 4) int x, @IntRange(from = 20, to = 30) int y) {
    int a;

    /* IntVal + IntVal */
    a = 0;
    if (true) {
      a = 2;
    }
    // :: error: (assignment)
    @IntVal({0}) int test1 = a;
    @IntVal({0, 2}) int test2 = a;

    /* IntRange + IntRange */
    a = x;
    @IntVal({3, 4}) int test3 = a;
    if (true) {
      a = y;
    }
    @IntRange(from = 15, to = 30)
    // :: error: (assignment)
    int test4 = a;
    @IntRange(from = 3, to = 30) int test5 = a;

    /* IntRange + IntVal */
    a = 0;
    if (true) {
      a = x;
    }
    @IntRange(from = 0, to = 4) int test7 = a;

    /* IntRange (Wider than 10) + IntVal */
    a = 0;
    if (true) {
      a = y;
    }
    @IntRange(from = 1, to = 30)
    // :: error: (assignment)
    int test8 = a;
    @IntRange(from = 0, to = 30) int test9 = a;
  }

  public void intCastTest(@IntVal({0, 1}) int input) {
    @IntVal({0, 1}) int c = (int) input;
    @IntVal({0, 1}) int ac = (@IntVal({0, 1}) int) input;
    @IntVal({0, 1, 2}) int sc = (@IntVal({0, 1, 2}) int) input;
    // :: warning: (cast.unsafe)
    @IntVal({1}) int uc = (@IntVal({1}) int) input;
    // :: warning: (cast.unsafe)
    @IntVal({2}) int bc = (@IntVal({2}) int) input;
  }

  public void IntDoubleTest(
      @IntVal({0, 1}) int iv,
      @IntRange(from = 2, to = 3) int ir,
      @IntRange(from = 2, to = 20) int irw,
      @DoubleVal({4.0, 5.0}) double dv1) {
    double a;

    /* IntVal + DoubleVal */
    a = iv;
    if (true) {
      a = dv1;
    }
    // :: error: (assignment)
    @DoubleVal({4.0, 5.0}) double test1 = a;
    @DoubleVal({0.0, 1.0, 2.0, 3.0, 4.0, 5.0}) double test2 = a;

    /* IntRange + DoubleVal */
    a = ir;
    // :: error: (assignment)
    @DoubleVal({2.0}) double test3 = a;
    @DoubleVal({2.0, 3.0}) double test4 = a;
    if (true) {
      a = dv1;
    }
    // :: error: (assignment)
    test1 = a;
    test2 = a;

    /* IntRange (Wider than 10) + DoubleVal */
    a = irw;
    if (true) {
      a = dv1;
    }
    // :: error: (assignment)
    @DoubleVal({4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double test5 = a;
    @UnknownVal double test6 = a;
  }

  public void stringTest() {
    String a = "test1";
    if (true) {
      a = "test2";
    }
    @StringVal({"test1", "test2"}) String b = a;

    // :: error: (assignment)
    @StringVal({"test1"}) String c = a;
  }

  public void stringCastTest() {
    Object a = "test1";
    @StringVal({"test1"}) String b = (String) a;
    @StringVal({"test1"}) String c = (java.lang.String) b;
  }

  void tooManyValuesInt() {
    // :: warning: (too.many.values.given.int)
    @IntVal({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 100}) int a = 20; // This should succeed if a is treated as @IntRange(from=1, to=100)

    // :: warning: (too.many.values.given.int)
    @IntVal({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12})
    // :: error: (assignment)
    int b = 20; // d is @IntRange(from=1, to=12)

    @UnknownVal int c = a; // This should always succeed
  }

  void fromGreaterThanTo() {
    // :: error: (from.greater.than.to)
    @IntRange(from = 2, to = 0)
    // :: error: (assignment)
    int a = 1; // a should be @BottomVal

    @IntRange(from = 1) int b = 2;

    @IntRange(to = 2) int c = 1;

    @IntRange(to = 2, from = 0) int d = 1;
  }

  void tooManyValuesDouble() {
    // :: warning: (too.many.values.given)
    @DoubleVal({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double a = 8.0;

    @UnknownVal double b = a; // This should always succeed

    @UnknownVal double c = 0;

    a = c; // This should succeed if a is treated as @UnknownVal

    // :: warning: (too.many.values.given)
    @DoubleVal({1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}) double d = 8.0;

    d = 2.0 * d; // This should succeed since d is @UnknownVal
  }

  void tooManyValuesString() {
    // :: warning: (too.many.values.given)
    @StringVal({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}) String a = "h";

    @UnknownVal String b = a; // This should always succeed

    @UnknownVal String c = "";

    // :: error: (assignment)
    a = c; // This should not succeed if a is treated as @ArrayLen(1)

    @ArrayLen(1) String al = a; // a is @ArrayLen(1)

    // :: warning: (too.many.values.given)
    @StringVal({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}) String d = "h";

    // :: error: (assignment)
    d = "b" + d; // This should not succeed since d is @ArrayLen(1)

    @ArrayLen(1) String dl = d; // d is @ArrayLen(1)
  }
}
