import org.checkerframework.common.value.qual.BottomVal;
import org.checkerframework.common.value.qual.IntRange;
import org.checkerframework.common.value.qual.StringVal;

class Test {
    void stringConcat() {
        @StringVal("helloa11.01.020truenull2626") String everything = "hello" + 'a' + 1 + 1.0 + 1.0f + 20L + true + null + 0x1a + 0b11010;

        @StringVal("true") String bool = "" + true;
        @StringVal("null") String nullV = "" + null;
        // :: error: (assignment.type.incompatible)
        @BottomVal String bottom = "" + null;
        @StringVal("1") String intL = "" + 1;
        @StringVal("$") String charL = "" + '$';
        @StringVal("1.0") String doubleDefault = "" + 1.0;
        @StringVal("1.0") String doubleL = "" + 1.0d;
        @StringVal("26") String hexVal = "" + 0x1a;
        @StringVal("26") String binaryVal = "" + 0b11010;
        @StringVal("12.3") String floatVal = "" + 12.3f;
        @StringVal("123.0") String science = "" + 1.23e2;
    }

    void compoundStringAssignement() {
        String s = "";
        s += "hello";
        s += 'a';
        s += 1;
        s += 1.0;
        s += 1.0f;
        s += 20L;
        s += true;
        s += null;
        s += 0x1a;
        s += 0b11010;
        // TODO: this should pass
        // compound assignments have not been implemented.
        // :: error: (assignment.type.incompatible)
        @StringVal("helloa11.01.020truenull2626") String all = s;
    }

    void stringIntRangeConcat(
            @IntRange(from = 0, to = 1) int num, @IntRange(from = 'A', to = 'B') char letter) {
        @StringVal({"num0", "num1"}) String numV = "num" + num;
        @StringVal({"letterA", "letterB"}) String letterV = "letter" + letter;
    }
}
