class Autoboxing {
    Byte b;
    Short s;
    Short sInterned;
    Integer i;
    Integer iInterned;
    Long l;
    Float f;
    Double d;
    Boolean z;
    Character c;
    Character cInterned;

    Autoboxing() {
        b = -126;
        s = 32000;
        sInterned = 32;
        i = 1234567;
        iInterned = 123;
        l = 1234567L;
        f = 3.14f;
        d = 3.14;
        z = true;
        c = 65000;
        cInterned = 65;
    }

    public static void main(String[] args) {
        new Autoboxing().test();
    }

    public void test() {
        System.out.println();
        System.out.println("Byte");
        Byte b1 = -126;
        Byte b2 = -126;
        Byte b3 = Byte.valueOf((byte) -126);
        System.out.println(b1 == b2);
        // :: warning: (unnecessary.equals)
        System.out.println(b1.equals(b2));
        // :: warning: (unnecessary.equals)
        System.out.println(b3.equals(b2));
        System.out.println(b.equals(b2));
        System.out.println(b == -126);
        // :: warning: (unnecessary.equals)
        System.out.println(b1.equals(126));

        System.out.println();
        System.out.println("Short");
        Short s1 = 32000;
        Short s2 = 32000;
        Short s3 = Short.valueOf((short) 32000);
        // :: error: (not.interned)
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3.equals(s2));
        System.out.println(s.equals(s2));
        // TODO
        //     Short s1interned = 32;
        //     Short s2interned = 32;
        //     Short s3interned = Short.valueOf((short) 32);
        //     System.out.println(s1interned==s2interned);
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(s1interned.equals(s2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(s3interned.equals(s2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(sInterned.equals(s2interned));

        System.out.println();
        System.out.println("Integer");
        Integer i1 = 1234567;
        Integer i2 = 1234567;
        Integer i3 = Integer.valueOf(1234567);
        // :: error: (not.interned)
        System.out.println(i1 == i2);
        System.out.println(i1.equals(i2));
        System.out.println(i3.equals(i2));
        System.out.println(i.equals(i2));

        System.out.println();
        Integer i1interned = 123;
        Integer i2interned = 123;
        Integer i3interned = Integer.valueOf(123);
        // TODO:
        // Would be legal to use ==, but Interning Checker does not check the
        // actual int value when deciding whether to warn for unnecessary.equals.
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(i1interned==i2interned);
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(i1interned.equals(i2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(i3interned.equals(i2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(iInterned.equals(i2interned));
        //     System.out.println(i1interned==123); // ok
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(i1interned.equals(123));

        System.out.println();
        System.out.println("Long");
        Long l1 = 1234567L;
        Long l2 = 1234567L;
        Long l3 = Long.valueOf(1234567L);
        // :: error: (not.interned)
        System.out.println(l1 == l2);
        System.out.println(l1.equals(l2));
        System.out.println(l3.equals(l2));
        System.out.println(l.equals(l2));

        System.out.println();
        System.out.println("Float");
        Float f1 = 3.14f;
        Float f2 = 3.14f;
        Float f3 = Float.valueOf(3.14f);
        // :: error: (not.interned)
        System.out.println(f1 == f2);
        System.out.println(f1.equals(f2));
        System.out.println(f3.equals(f2));
        System.out.println(f.equals(f2));

        System.out.println();
        System.out.println("Double");
        Double d1 = 3.14;
        Double d2 = 3.14;
        Double d3 = Double.valueOf(3.14);
        // :: error: (not.interned)
        System.out.println(d1 == d2);
        System.out.println(d1.equals(d2));
        System.out.println(d3.equals(d2));
        System.out.println(d.equals(d2));

        System.out.println();
        System.out.println("Boolean");
        Boolean z1 = true;
        Boolean z2 = true;
        Boolean z3 = Boolean.valueOf(true);
        System.out.println(z1 == z2);
        // :: warning: (unnecessary.equals)
        System.out.println(z1.equals(z2));
        // :: warning: (unnecessary.equals)
        System.out.println(z3.equals(z2));
        System.out.println(z.equals(z2));
        System.out.println(z1 == true); // ok
        // :: warning: (unnecessary.equals)
        System.out.println(z1.equals(true));

        System.out.println();
        System.out.println("Character");
        Character c1 = 65000;
        Character c2 = 65000;
        Character c3 = Character.valueOf((char) 65000);
        // :: error: (not.interned)
        System.out.println(c1 == c2);
        System.out.println(c1.equals(c2));
        System.out.println(c3.equals(c2));
        System.out.println(c.equals(c2));
        // TODO
        //     Character c1interned = 65;
        //     Character c2interned = 65;
        //     Character c3interned = Character.valueOf((char) 65);
        //     System.out.println(c1interned==c2interned);
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(c1interned.equals(c2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(c3interned.equals(c2interned));
        //     // :: warning: (unnecessary.equals)
        //     System.out.println(cInterned.equals(c2interned));
    }
}
