// ---------------
// Autoboxing.java
// ---------------

import java.util.ArrayList;
import java.util.List;

final class AutoboxingTest {
    public static void main (String[] args) {
        System.out.println("Autoboxing.java");

        {
              int     i = 2;
        final Integer x = i;
        assert i            == 2;
        assert x            == 2;
        assert x.intValue() == 2;
        ++i;
        assert i            == 3;
        assert x            == 2;
        assert x.intValue() == 2;
        }

        {
              int     i = 2;
        final Integer x = new Integer(i);
        assert i            == 2;
        assert x            == 2;
        assert x.intValue() == 2;
        ++i;
        assert i            == 3;
        assert x            == 2;
        assert x.intValue() == 2;
        }

        {
        int     i = 2;
        Integer x = i;
        assert i == 2;
        assert x == 2;
        ++x;
        assert i == 2;
        assert x == 3;
        }

        {
        Integer x = 2;
        Integer y = 2;
        assert x == y;
        ++x;
        assert x != y;
        ++y;
        assert x == y;
        }

        {
        Integer x = new Integer(2);
        Integer y = new Integer(2);
        assert x != y;
        ++x;
        assert x != y;
        ++y;
        assert x == y;
        }

        {
        Integer x = 128;
        Integer y = 128;
        assert x != y;
        --x;
        assert x != y;
        --y;
        assert x == y;
        }

        {
        Integer x = new Integer(128);
        Integer y = new Integer(128);
        assert x != y;
        --x;
        assert x != y;
        --y;
        assert x == y;
        }

        {
        Long x = 128L;
        Long y = 128L;
        assert x != y;
        --x;
        assert x != y;
        --y;
        assert x == y;
        }

        {
        final int  i = 2;
//      final Long x = i;               // doesn't compile
        final Long x = (long) i;
        }

        {
        final long    l = 2;
//      final Integer x = l;            // doesn't compile
        final Integer x = (int) l;
        }

        {
        final int[]     a = {2, 3, 4};
//      final Integer[] b = a;          // doesn't compile
        final Integer[] b = {2, 3, 4};
        }

        {
        List<Integer> x = new ArrayList<Integer>();
        x.add(2);
        x.add(3);
        x.add(4);
        assert x.size() == 3;
        assert x.get(1) == 3;
        }

        System.out.println("Done.");}}
